Skip to content

Commit 5c7cb4f

Browse files
srawlinsCommit Queue
authored andcommitted
analyzer: Deduplicate some code around lists of diagnostics into shared helpers
Change-Id: I233977c08c071c6280b2eefc086f3f6fb2964a54 Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/433640 Reviewed-by: Paul Berry <[email protected]> Commit-Queue: Samuel Rawlins <[email protected]>
1 parent 78660a5 commit 5c7cb4f

File tree

9 files changed

+29
-91
lines changed

9 files changed

+29
-91
lines changed

pkg/analysis_server/test/src/computer/color_computer_test.dart

Lines changed: 2 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44

55
import 'package:analysis_server/src/computer/computer_color.dart';
66
import 'package:analyzer/dart/analysis/results.dart';
7-
import 'package:analyzer/diagnostic/diagnostic.dart';
7+
import 'package:analyzer/src/utilities/extensions/diagnostic.dart';
88
import 'package:test/test.dart';
99
import 'package:test_reflective_loader/test_reflective_loader.dart';
1010

@@ -196,10 +196,7 @@ class ColorComputerTest extends AbstractContextTest {
196196

197197
void expectNoErrors(ResolvedUnitResult result) {
198198
// If the test code has errors, generate a suitable failure to help debug.
199-
var errors =
200-
result.diagnostics
201-
.where((error) => error.severity == Severity.error)
202-
.toList();
199+
var errors = result.diagnostics.errors;
203200
if (errors.isNotEmpty) {
204201
throw 'Code has errors: $errors\n\n${result.content}';
205202
}

pkg/analysis_server/tool/code_completion/code_metrics.dart

Lines changed: 2 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -10,9 +10,9 @@ import 'package:analyzer/dart/analysis/results.dart';
1010
import 'package:analyzer/dart/ast/ast.dart';
1111
import 'package:analyzer/dart/ast/token.dart';
1212
import 'package:analyzer/dart/ast/visitor.dart';
13-
import 'package:analyzer/diagnostic/diagnostic.dart';
1413
import 'package:analyzer/file_system/physical_file_system.dart';
1514
import 'package:analyzer/src/util/file_paths.dart' as file_paths;
15+
import 'package:analyzer/src/utilities/extensions/diagnostic.dart';
1616
import 'package:args/args.dart';
1717

1818
/// Compute and print lexical and semantic information about a package.
@@ -1309,7 +1309,7 @@ class CodeShapeMetricsComputer {
13091309
print('File $filePath skipped because it could not be analyzed.');
13101310
print('');
13111311
continue;
1312-
} else if (hasError(resolvedUnitResult)) {
1312+
} else if (resolvedUnitResult.diagnostics.errors.isNotEmpty) {
13131313
print('File $filePath skipped due to errors:');
13141314
for (var diagnostic in resolvedUnitResult.diagnostics) {
13151315
print(' ${diagnostic.toString()}');
@@ -1418,14 +1418,4 @@ class CodeShapeMetricsComputer {
14181418
}
14191419
}
14201420
}
1421-
1422-
/// Whether the [result] contains an error.
1423-
static bool hasError(ResolvedUnitResult result) {
1424-
for (var diagnostic in result.diagnostics) {
1425-
if (diagnostic.severity == Severity.error) {
1426-
return true;
1427-
}
1428-
}
1429-
return false;
1430-
}
14311421
}

pkg/analysis_server/tool/code_completion/completion_metrics_base.dart

Lines changed: 2 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -8,11 +8,11 @@ import 'dart:math' as math;
88
import 'package:analyzer/dart/analysis/analysis_context.dart';
99
import 'package:analyzer/dart/analysis/context_root.dart';
1010
import 'package:analyzer/dart/analysis/results.dart';
11-
import 'package:analyzer/diagnostic/diagnostic.dart';
1211
import 'package:analyzer/file_system/overlay_file_system.dart';
1312
import 'package:analyzer/file_system/physical_file_system.dart';
1413
import 'package:analyzer/src/dart/analysis/analysis_context_collection.dart';
1514
import 'package:analyzer/src/util/file_paths.dart' as file_paths;
15+
import 'package:analyzer/src/utilities/extensions/diagnostic.dart';
1616
import 'package:args/args.dart';
1717
import 'package:cli_util/cli_logging.dart';
1818

@@ -131,7 +131,7 @@ abstract class CompletionMetricsComputer {
131131
await context.currentSession.getResolvedUnit(filePath)
132132
as ResolvedUnitResult;
133133

134-
var analysisError = getFirstErrorOrNull(result);
134+
var analysisError = result.diagnostics.errors.firstOrNull;
135135
if (analysisError != null) {
136136
progress.clear();
137137
print('File $filePath skipped due to errors such as:');
@@ -157,19 +157,6 @@ abstract class CompletionMetricsComputer {
157157
/// Performs setup tasks with [context] before resolution.
158158
void setupForResolution(AnalysisContext context);
159159

160-
/// Given some [ResolvedUnitResult] returns the first error of high severity
161-
/// if such an error exists, `null` otherwise.
162-
static Diagnostic? getFirstErrorOrNull(
163-
ResolvedUnitResult resolvedUnitResult,
164-
) {
165-
for (var diagnostic in resolvedUnitResult.diagnostics) {
166-
if (diagnostic.severity == Severity.error) {
167-
return diagnostic;
168-
}
169-
}
170-
return null;
171-
}
172-
173160
/// Gets overlay content for [content], applying a change at
174161
/// [expectedCompletion] with [prefixLength], according to [overlay], one of
175162
/// the [CompletionMetricsOptions].

pkg/analysis_server/tool/code_completion/flutter_metrics.dart

Lines changed: 2 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -9,9 +9,9 @@ import 'package:analyzer/dart/analysis/context_root.dart';
99
import 'package:analyzer/dart/analysis/results.dart';
1010
import 'package:analyzer/dart/ast/ast.dart';
1111
import 'package:analyzer/dart/ast/visitor.dart';
12-
import 'package:analyzer/diagnostic/diagnostic.dart';
1312
import 'package:analyzer/file_system/physical_file_system.dart';
1413
import 'package:analyzer/src/util/file_paths.dart' as file_paths;
14+
import 'package:analyzer/src/utilities/extensions/diagnostic.dart';
1515
import 'package:analyzer/src/utilities/extensions/flutter.dart';
1616
import 'package:args/args.dart';
1717

@@ -207,7 +207,7 @@ class FlutterMetricsComputer {
207207
print('');
208208
print('File $filePath skipped because it could not be analyzed.');
209209
continue;
210-
} else if (hasError(resolvedUnitResult)) {
210+
} else if (resolvedUnitResult.diagnostics.errors.isNotEmpty) {
211211
print('');
212212
print('File $filePath skipped due to errors:');
213213
for (var diagnostic in resolvedUnitResult.diagnostics) {
@@ -289,14 +289,4 @@ class FlutterMetricsComputer {
289289
sink.writeln(' $percent%: ${entry.key} (${entry.value})');
290290
}
291291
}
292-
293-
/// Whether the [result] contains an error.
294-
static bool hasError(ResolvedUnitResult result) {
295-
for (var diagnostic in result.diagnostics) {
296-
if (diagnostic.severity == Severity.error) {
297-
return true;
298-
}
299-
}
300-
return false;
301-
}
302292
}

pkg/analysis_server/tool/code_completion/implicit_type_declarations.dart

Lines changed: 3 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -11,9 +11,9 @@ import 'package:analyzer/dart/analysis/results.dart';
1111
import 'package:analyzer/dart/ast/ast.dart';
1212
import 'package:analyzer/dart/ast/visitor.dart';
1313
import 'package:analyzer/dart/element/type.dart';
14-
import 'package:analyzer/diagnostic/diagnostic.dart';
1514
import 'package:analyzer/file_system/physical_file_system.dart';
1615
import 'package:analyzer/src/util/file_paths.dart' as file_paths;
16+
import 'package:analyzer/src/utilities/extensions/diagnostic.dart';
1717
import 'package:args/args.dart';
1818

1919
/// Compute metrics to determine which untyped variable declarations can be used
@@ -193,12 +193,10 @@ class ImpliedTypeComputer {
193193
print('');
194194
}
195195
continue;
196-
} else if (hasError(resolvedUnitResult)) {
196+
} else if (resolvedUnitResult.diagnostics.errors.isNotEmpty) {
197197
if (verbose) {
198198
print('File $filePath skipped due to errors:');
199-
for (var diagnostics in resolvedUnitResult.diagnostics.where(
200-
(e) => e.severity == Severity.error,
201-
)) {
199+
for (var diagnostics in resolvedUnitResult.diagnostics.errors) {
202200
print(' ${diagnostics.toString()}');
203201
}
204202
print('');
@@ -217,16 +215,6 @@ class ImpliedTypeComputer {
217215
}
218216
}
219217
}
220-
221-
/// Return `true` if the [result] contains an error.
222-
static bool hasError(ResolvedUnitResult result) {
223-
for (var diagnostic in result.diagnostics) {
224-
if (diagnostic.severity == Severity.error) {
225-
return true;
226-
}
227-
}
228-
return false;
229-
}
230218
}
231219

232220
class ImpliedTypeData {

pkg/analysis_server/tool/code_completion/relevance_metrics.dart

Lines changed: 3 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -27,10 +27,10 @@ import 'package:analyzer/dart/element/element.dart'
2727
import 'package:analyzer/dart/element/type.dart';
2828
import 'package:analyzer/dart/element/type_provider.dart';
2929
import 'package:analyzer/dart/element/type_system.dart';
30-
import 'package:analyzer/diagnostic/diagnostic.dart';
3130
import 'package:analyzer/file_system/physical_file_system.dart';
3231
import 'package:analyzer/src/dart/element/inheritance_manager3.dart';
3332
import 'package:analyzer/src/util/file_paths.dart' as file_paths;
33+
import 'package:analyzer/src/utilities/extensions/diagnostic.dart';
3434
import 'package:analyzer/src/utilities/extensions/flutter.dart';
3535
import 'package:args/args.dart';
3636

@@ -2220,12 +2220,10 @@ class RelevanceMetricsComputer {
22202220
print('');
22212221
}
22222222
continue;
2223-
} else if (hasError(resolvedUnitResult)) {
2223+
} else if (resolvedUnitResult.diagnostics.errors.isNotEmpty) {
22242224
if (verbose) {
22252225
print('File $filePath skipped due to errors:');
2226-
for (var diagnostic in resolvedUnitResult.diagnostics.where(
2227-
(e) => e.severity == Severity.error,
2228-
)) {
2226+
for (var diagnostic in resolvedUnitResult.diagnostics.errors) {
22292227
print(' ${diagnostic.toString()}');
22302228
}
22312229
print('');
@@ -2454,16 +2452,6 @@ class RelevanceMetricsComputer {
24542452
var table = _convertColumnsToRows([firstColumn, secondColumn]).toList();
24552453
sink.writeTable(table);
24562454
}
2457-
2458-
/// Whether the [result] contains an error.
2459-
static bool hasError(ResolvedUnitResult result) {
2460-
for (var diagnostic in result.diagnostics) {
2461-
if (diagnostic.severity == Severity.error) {
2462-
return true;
2463-
}
2464-
}
2465-
return false;
2466-
}
24672455
}
24682456

24692457
/// Information collected to compute a percentage of data points that were

pkg/analysis_server/tool/code_completion/relevance_table_generator.dart

Lines changed: 3 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -18,10 +18,10 @@ import 'package:analyzer/dart/element/element.dart'
1818
show Element, InterfaceElement, LibraryElement;
1919
import 'package:analyzer/dart/element/type_provider.dart';
2020
import 'package:analyzer/dart/element/type_system.dart';
21-
import 'package:analyzer/diagnostic/diagnostic.dart';
2221
import 'package:analyzer/file_system/file_system.dart';
2322
import 'package:analyzer/file_system/physical_file_system.dart';
2423
import 'package:analyzer/src/util/file_paths.dart' as file_paths;
24+
import 'package:analyzer/src/utilities/extensions/diagnostic.dart';
2525
import 'package:analyzer/src/utilities/extensions/flutter.dart';
2626
import 'package:analyzer_testing/package_root.dart' as package_root;
2727
import 'package:analyzer_utilities/tools.dart';
@@ -1683,12 +1683,10 @@ class RelevanceMetricsComputer {
16831683
print('');
16841684
}
16851685
continue;
1686-
} else if (hasError(resolvedUnitResult)) {
1686+
} else if (resolvedUnitResult.diagnostics.errors.isNotEmpty) {
16871687
if (verbose) {
16881688
print('File $filePath skipped due to errors:');
1689-
for (var diagnostic in resolvedUnitResult.diagnostics.where(
1690-
(e) => e.severity == Severity.error,
1691-
)) {
1689+
for (var diagnostic in resolvedUnitResult.diagnostics.errors) {
16921690
print(' ${diagnostic.toString()}');
16931691
}
16941692
print('');
@@ -1708,16 +1706,6 @@ class RelevanceMetricsComputer {
17081706
}
17091707
}
17101708
}
1711-
1712-
/// Return `true` if the [result] contains an error.
1713-
static bool hasError(ResolvedUnitResult result) {
1714-
for (var diagnostic in result.diagnostics) {
1715-
if (diagnostic.severity == Severity.error) {
1716-
return true;
1717-
}
1718-
}
1719-
return false;
1720-
}
17211709
}
17221710

17231711
/// A class used to write relevance data as a set of tables in a generated Dart
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
// Copyright (c) 2025, the Dart project authors. Please see the AUTHORS file
2+
// for details. All rights reserved. Use of this source code is governed by a
3+
// BSD-style license that can be found in the LICENSE file.
4+
5+
import 'package:analyzer/diagnostic/diagnostic.dart';
6+
7+
extension ListOfDiagnosticExtension on List<Diagnostic> {
8+
/// The diagnostics in this list with [Severity.error].
9+
Iterable<Diagnostic> get errors => where((d) => d.severity == Severity.error);
10+
}

pkg/analyzer/test/util/id_testing_helper.dart

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@ import 'package:analyzer/file_system/memory_file_system.dart';
1919
import 'package:analyzer/src/dart/analysis/analysis_context_collection.dart';
2020
import 'package:analyzer/src/dart/analysis/testing_data.dart';
2121
import 'package:analyzer/src/test_utilities/mock_sdk.dart';
22+
import 'package:analyzer/src/utilities/extensions/diagnostic.dart';
2223
import 'package:analyzer_testing/utilities/extensions/resource_provider.dart';
2324

2425
/// Test configuration used for testing the analyzer without experiments.
@@ -163,8 +164,7 @@ Future<TestResult<T>> runTestForConfig<T>(
163164
var testUri = testFile.uri;
164165
var result = await analysisSession.getResolvedUnit(testFile.path);
165166
result as ResolvedUnitResult;
166-
var errors =
167-
result.diagnostics.where((e) => e.severity == Severity.error).toList();
167+
var errors = result.diagnostics.errors;
168168
if (errors.isNotEmpty) {
169169
if (dataComputer.supportsErrors) {
170170
var diagnosticMap = <int, List<Diagnostic>>{};

0 commit comments

Comments
 (0)