Skip to content

Commit e0fe7ef

Browse files
stereotype441Commit Queue
authored andcommitted
[messages] Decouple diagnosticCodeValues generation.
Refactors (a) the logic that generates analyzer message constants and (b) the logic that generates the `diagnosticCodeValues` declaration, so that they both are based on the pre-computed table `DiagnosticTables.activeMessagesByPackage`. Previously, (a) produced a list of the active messages as a side effect, and this list was consumed by (b), so the operation of (a) and (b) was tightly coupled. Using `DiagnosticTables.activeMessagesByPackage` means the two generators are loosely coupled. This paves the way for a follow-up CL in which I will replace (a) with logic that generates the analyzer messages as top level constants. Change-Id: I6a6a6964f824a4443ad3a7aed119746a80623161 Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/458382 Reviewed-by: Konstantin Shcheglov <[email protected]> Commit-Queue: Paul Berry <[email protected]>
1 parent ea768b2 commit e0fe7ef

File tree

2 files changed

+31
-29
lines changed

2 files changed

+31
-29
lines changed

pkg/analyzer/tool/messages/generate.dart

Lines changed: 10 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -43,22 +43,20 @@ List<GeneratedContent> _analyzerGeneratedFiles() {
4343

4444
(classesByFile[diagnosticClassInfo.file] ??= []).add(diagnosticClassInfo);
4545
}
46-
var generatedCodes = <AnalyzerCode>[];
4746
return [
4847
for (var entry in classesByFile.entries)
4948
GeneratedFile(entry.key.path, (pkgRoot) async {
5049
var codeGenerator = _AnalyzerDiagnosticGenerator(
5150
entry.key,
5251
entry.value,
53-
generatedCodes,
5452
);
5553
codeGenerator.generate();
5654
return codeGenerator.out.toString();
5755
}),
5856
GeneratedFile('analyzer/lib/src/diagnostic/diagnostic_code_values.g.dart', (
5957
pkgRoot,
6058
) async {
61-
var codeGenerator = _DiagnosticCodeValuesGenerator(generatedCodes);
59+
var codeGenerator = _DiagnosticCodeValuesGenerator();
6260
codeGenerator.generate();
6361
return codeGenerator.out.toString();
6462
}),
@@ -71,8 +69,6 @@ class _AnalyzerDiagnosticGenerator {
7169

7270
final List<GeneratedDiagnosticClassInfo> diagnosticClasses;
7371

74-
final List<AnalyzerCode> generatedCodes;
75-
7672
final StringBuffer out = StringBuffer('''
7773
// Copyright (c) 2021, the Dart project authors. Please see the AUTHORS file
7874
// for details. All rights reserved. Use of this source code is governed by a
@@ -87,11 +83,7 @@ class _AnalyzerDiagnosticGenerator {
8783
// codes here.
8884
''');
8985

90-
_AnalyzerDiagnosticGenerator(
91-
this.file,
92-
this.diagnosticClasses,
93-
this.generatedCodes,
94-
);
86+
_AnalyzerDiagnosticGenerator(this.file, this.diagnosticClasses);
9587

9688
void generate() {
9789
out.writeln('// ignore_for_file: deprecated_member_use_from_same_package');
@@ -121,20 +113,12 @@ part of ${json.encode(file.parentLibrary)};
121113
);
122114
var memberAccumulator = MemberAccumulator();
123115

124-
var entries = diagnosticTables.analyzerCodeToMessage.entries.where(
125-
(diagnostic) =>
126-
diagnostic.key.diagnosticClass == diagnosticClass &&
127-
!diagnostic.value.isRemoved,
128-
);
129-
for (var entry in entries) {
130-
var diagnosticCode = entry.key;
131-
var message = entry.value;
116+
for (var message
117+
in diagnosticTables.activeMessagesByPackage[diagnosticClass
118+
.package]!) {
119+
if (message.analyzerCode.diagnosticClass != diagnosticClass) continue;
132120

133121
LocatedError.wrap(span: message.keySpan, () {
134-
if (message is! AliasMessage &&
135-
diagnosticClass.package == AnalyzerDiagnosticPackage.analyzer) {
136-
generatedCodes.add(diagnosticCode);
137-
}
138122
message.toAnalyzerCode(
139123
diagnosticClass,
140124
memberAccumulator: memberAccumulator,
@@ -220,8 +204,6 @@ DiagnosticType get type => ${diagnosticClass.typeCode};
220204
}
221205

222206
class _DiagnosticCodeValuesGenerator {
223-
final List<AnalyzerCode> generatedCodes;
224-
225207
final StringBuffer out = StringBuffer('''
226208
// Copyright (c) 2014, the Dart project authors. Please see the AUTHORS file
227209
// for details. All rights reserved. Use of this source code is governed by a
@@ -241,11 +223,7 @@ class _DiagnosticCodeValuesGenerator {
241223
// ignore_for_file: deprecated_member_use_from_same_package
242224
''');
243225

244-
_DiagnosticCodeValuesGenerator(this.generatedCodes);
245-
246226
void generate() {
247-
generatedCodes.sort();
248-
249227
out.writeln();
250228
out.writeln(r'''
251229
part of 'diagnostic_code_values.dart';
@@ -255,7 +233,10 @@ part of 'diagnostic_code_values.dart';
255233
"@AnalyzerPublicApi(message: 'exported by lib/error/error.dart')",
256234
);
257235
out.writeln('const List<DiagnosticCode> diagnosticCodeValues = [');
258-
for (var analyzerCode in generatedCodes) {
236+
for (var message
237+
in diagnosticTables.activeMessagesByPackage[AnalyzerDiagnosticPackage
238+
.analyzer]!) {
239+
var analyzerCode = message.analyzerCode;
259240
var diagnosticName = analyzerCode.camelCaseName;
260241
out.writeln(' ${analyzerCode.diagnosticClass.name}.$diagnosticName,');
261242
}

pkg/analyzer_utilities/lib/messages.dart

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -481,6 +481,16 @@ class DiagnosticTables {
481481
/// List of front end diagnostics, sorted by front end code.
482482
final List<CfeStyleMessage> sortedFrontEndDiagnostics = [];
483483

484+
/// Map from [AnalyzerDiagnosticPackage] to the list of active diagnostic
485+
/// messages for that package.
486+
///
487+
/// A message is considered active is [MessageWithAnalyzerCode.isRemoved] is
488+
/// `false` and the message is not an [AliasMessage].
489+
///
490+
/// Each list is sorted by analyzer code.
491+
final Map<AnalyzerDiagnosticPackage, List<MessageWithAnalyzerCode>>
492+
activeMessagesByPackage = {};
493+
484494
DiagnosticTables._(List<Message> messages) {
485495
var frontEndCodeDuplicateChecker = _DuplicateChecker<String>(
486496
kind: 'Front end code',
@@ -512,6 +522,14 @@ class DiagnosticTables {
512522
analyzerCode.snakeCaseName] ??=
513523
[])
514524
.add(message);
525+
var diagnosticClass = analyzerCode.diagnosticClass;
526+
if (diagnosticClass is GeneratedDiagnosticClassInfo &&
527+
!message.isRemoved &&
528+
message is! AliasMessage) {
529+
(activeMessagesByPackage[diagnosticClass.package] ??= []).add(
530+
message,
531+
);
532+
}
515533
}
516534
}
517535

@@ -522,6 +540,9 @@ class DiagnosticTables {
522540

523541
sortedSharedDiagnostics.sortBy((e) => e.analyzerCode.camelCaseName);
524542
sortedFrontEndDiagnostics.sortBy((e) => e.frontEndCode);
543+
for (var value in activeMessagesByPackage.values) {
544+
value.sortBy((e) => e.analyzerCode);
545+
}
525546
}
526547

527548
static void _checkSharedNames(

0 commit comments

Comments
 (0)