Skip to content

Commit 60a5c58

Browse files
jensjohacommit-bot@chromium.org
authored andcommitted
[CFE] Fix not getting rid of NNBD error in package in incremental compiler
This fixes the issue of the error not going away, but can (see added test) give a wrong error message when in the process of fixing the issues. A follow-up CL will (try to) correct the wrong error message. Change-Id: I3547fe5fb5cfd179897996029a00a4995a967e54 Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/170422 Reviewed-by: Johnni Winther <[email protected]> Commit-Queue: Jens Johansen <[email protected]>
1 parent 44f3881 commit 60a5c58

16 files changed

+374
-47
lines changed

pkg/_fe_analyzer_shared/lib/src/messages/codes.dart

Lines changed: 23 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -131,9 +131,11 @@ class LocatedMessage implements Comparable<LocatedMessage> {
131131
}
132132

133133
FormattedMessage withFormatting(String formatted, int line, int column,
134-
Severity severity, List<FormattedMessage> relatedInformation) {
134+
Severity severity, List<FormattedMessage> relatedInformation,
135+
{List<Uri> involvedFiles}) {
135136
return new FormattedMessage(
136-
this, formatted, line, column, severity, relatedInformation);
137+
this, formatted, line, column, severity, relatedInformation,
138+
involvedFiles: involvedFiles);
137139
}
138140

139141
@override
@@ -173,8 +175,11 @@ class FormattedMessage implements DiagnosticMessage {
173175

174176
final List<FormattedMessage> relatedInformation;
175177

178+
final List<Uri> involvedFiles;
179+
176180
const FormattedMessage(this.locatedMessage, this.formatted, this.line,
177-
this.column, this.severity, this.relatedInformation);
181+
this.column, this.severity, this.relatedInformation,
182+
{this.involvedFiles});
178183

179184
Code<dynamic> get code => locatedMessage.code;
180185

@@ -212,7 +217,8 @@ class FormattedMessage implements DiagnosticMessage {
212217
"ansiFormatted": ansiFormatted.toList(),
213218
"plainTextFormatted": plainTextFormatted.toList(),
214219
"severity": severity.index,
215-
"uri": uri.toString(),
220+
"uri": uri?.toString(),
221+
"involvedFiles": involvedFiles?.map((u) => u.toString())?.toList(),
216222
};
217223
}
218224

@@ -234,8 +240,10 @@ class DiagnosticMessageFromJson implements DiagnosticMessage {
234240

235241
final Uri uri;
236242

237-
DiagnosticMessageFromJson(
238-
this.ansiFormatted, this.plainTextFormatted, this.severity, this.uri);
243+
final List<Uri> involvedFiles;
244+
245+
DiagnosticMessageFromJson(this.ansiFormatted, this.plainTextFormatted,
246+
this.severity, this.uri, this.involvedFiles);
239247

240248
factory DiagnosticMessageFromJson.fromJson(String jsonString) {
241249
Map<String, Object> decoded = json.decode(jsonString);
@@ -244,10 +252,15 @@ class DiagnosticMessageFromJson implements DiagnosticMessage {
244252
List<String> plainTextFormatted =
245253
new List<String>.from(decoded["plainTextFormatted"]);
246254
Severity severity = Severity.values[decoded["severity"]];
247-
Uri uri = Uri.parse(decoded["uri"]);
255+
Uri uri = decoded["uri"] == null ? null : Uri.parse(decoded["uri"]);
256+
List<Uri> involvedFiles = decoded["involvedFiles"] == null
257+
? null
258+
: new List<String>.from(decoded["involvedFiles"])
259+
.map((e) => Uri.parse(e))
260+
.toList();
248261

249262
return new DiagnosticMessageFromJson(
250-
ansiFormatted, plainTextFormatted, severity, uri);
263+
ansiFormatted, plainTextFormatted, severity, uri, involvedFiles);
251264
}
252265

253266
Map<String, Object> toJson() {
@@ -256,7 +269,8 @@ class DiagnosticMessageFromJson implements DiagnosticMessage {
256269
"ansiFormatted": ansiFormatted.toList(),
257270
"plainTextFormatted": plainTextFormatted.toList(),
258271
"severity": severity.index,
259-
"uri": uri.toString(),
272+
"uri": uri?.toString(),
273+
"involvedFiles": involvedFiles?.map((u) => u.toString())?.toList(),
260274
};
261275
}
262276

pkg/_fe_analyzer_shared/lib/src/messages/diagnostic_message.dart

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -34,13 +34,17 @@ abstract class DiagnosticMessage {
3434
Iterable<String> get plainTextFormatted;
3535

3636
Severity get severity;
37+
38+
Iterable<Uri> get involvedFiles;
3739
}
3840

3941
/// This method is subject to change.
4042
Uri getMessageUri(DiagnosticMessage message) {
4143
return message is FormattedMessage
4244
? message.uri
43-
: message is DiagnosticMessageFromJson ? message.uri : null;
45+
: message is DiagnosticMessageFromJson
46+
? message.uri
47+
: null;
4448
}
4549

4650
/// This method is subject to change.

pkg/front_end/lib/src/base/processed_options.dart

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -207,7 +207,8 @@ class ProcessedOptions {
207207
this.ticker = new Ticker(isVerbose: options?.verbose ?? false);
208208

209209
FormattedMessage format(
210-
LocatedMessage message, Severity severity, List<LocatedMessage> context) {
210+
LocatedMessage message, Severity severity, List<LocatedMessage> context,
211+
{List<Uri> involvedFiles}) {
211212
int offset = message.charOffset;
212213
Uri uri = message.uri;
213214
Location location = offset == -1 ? null : getLocation(uri, offset);
@@ -221,19 +222,21 @@ class ProcessedOptions {
221222
}
222223
}
223224
return message.withFormatting(formatted, location?.line ?? -1,
224-
location?.column ?? -1, severity, formattedContext);
225+
location?.column ?? -1, severity, formattedContext,
226+
involvedFiles: involvedFiles);
225227
}
226228

227229
void report(LocatedMessage message, Severity severity,
228-
{List<LocatedMessage> context}) {
230+
{List<LocatedMessage> context, List<Uri> involvedFiles}) {
229231
if (command_line_reporting.isHidden(severity)) return;
230232
if (command_line_reporting.isCompileTimeError(severity)) {
231233
CompilerContext.current.logError(message, severity);
232234
}
233235
if (CompilerContext.current.options.setExitCodeOnProblem) {
234236
exitCode = 1;
235237
}
236-
reportDiagnosticMessage(format(message, severity, context));
238+
reportDiagnosticMessage(
239+
format(message, severity, context, involvedFiles: involvedFiles));
237240
if (command_line_reporting.shouldThrowOn(severity)) {
238241
if (fatalDiagnosticCount++ < _raw.skipForDebugging) {
239242
// Skip this one. The interesting one comes later.

pkg/front_end/lib/src/fasta/compiler_context.dart

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -65,8 +65,9 @@ class CompilerContext {
6565

6666
/// Report [message], for example, by printing it.
6767
void report(LocatedMessage message, Severity severity,
68-
{List<LocatedMessage> context}) {
69-
options.report(message, severity, context: context);
68+
{List<LocatedMessage> context, List<Uri> involvedFiles}) {
69+
options.report(message, severity,
70+
context: context, involvedFiles: involvedFiles);
7071
}
7172

7273
/// Report [message], for example, by printing it.

pkg/front_end/lib/src/fasta/incremental_compiler.dart

Lines changed: 29 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -1390,16 +1390,7 @@ class IncrementalCompiler implements IncrementalKernelGenerator {
13901390
}
13911391

13921392
// Save any new component-problems.
1393-
if (componentWithDill?.problemsAsJson != null) {
1394-
for (String jsonString in componentWithDill.problemsAsJson) {
1395-
DiagnosticMessageFromJson message =
1396-
new DiagnosticMessageFromJson.fromJson(jsonString);
1397-
List<DiagnosticMessageFromJson> messages =
1398-
remainingComponentProblems[message.uri] ??=
1399-
new List<DiagnosticMessageFromJson>();
1400-
messages.add(message);
1401-
}
1402-
}
1393+
_addProblemsAsJsonToRemainingProblems(componentWithDill?.problemsAsJson);
14031394
return new List<String>.from(issuedProblems);
14041395
}
14051396

@@ -1657,14 +1648,36 @@ class IncrementalCompiler implements IncrementalKernelGenerator {
16571648

16581649
/// Internal method.
16591650
void saveComponentProblems(IncrementalCompilerData data) {
1660-
if (data.component.problemsAsJson != null) {
1661-
for (String jsonString in data.component.problemsAsJson) {
1651+
List<String> problemsAsJson = data.component.problemsAsJson;
1652+
_addProblemsAsJsonToRemainingProblems(problemsAsJson);
1653+
}
1654+
1655+
void _addProblemsAsJsonToRemainingProblems(List<String> problemsAsJson) {
1656+
if (problemsAsJson != null) {
1657+
for (String jsonString in problemsAsJson) {
16621658
DiagnosticMessageFromJson message =
16631659
new DiagnosticMessageFromJson.fromJson(jsonString);
1664-
List<DiagnosticMessageFromJson> messages =
1665-
remainingComponentProblems[message.uri] ??=
1666-
new List<DiagnosticMessageFromJson>();
1667-
messages.add(message);
1660+
assert(message.uri != null ||
1661+
(message.involvedFiles != null &&
1662+
message.involvedFiles.isNotEmpty));
1663+
if (message.uri != null) {
1664+
List<DiagnosticMessageFromJson> messages =
1665+
remainingComponentProblems[message.uri] ??=
1666+
new List<DiagnosticMessageFromJson>();
1667+
messages.add(message);
1668+
}
1669+
if (message.involvedFiles != null) {
1670+
// This indexes the same message under several uris - this way it will
1671+
// be issued as long as it's a problem. It will because of
1672+
// deduplication when we re-issue these (in reissueComponentProblems)
1673+
// only be reported once.
1674+
for (Uri uri in message.involvedFiles) {
1675+
List<DiagnosticMessageFromJson> messages =
1676+
remainingComponentProblems[uri] ??=
1677+
new List<DiagnosticMessageFromJson>();
1678+
messages.add(message);
1679+
}
1680+
}
16681681
}
16691682
}
16701683
}

pkg/front_end/lib/src/fasta/loader.dart

Lines changed: 9 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -280,11 +280,13 @@ abstract class Loader {
280280
{bool wasHandled: false,
281281
List<LocatedMessage> context,
282282
Severity severity,
283-
bool problemOnLibrary: false}) {
283+
bool problemOnLibrary: false,
284+
List<Uri> involvedFiles}) {
284285
return addMessage(message, charOffset, length, fileUri, severity,
285286
wasHandled: wasHandled,
286287
context: context,
287-
problemOnLibrary: problemOnLibrary);
288+
problemOnLibrary: problemOnLibrary,
289+
involvedFiles: involvedFiles);
288290
}
289291

290292
/// All messages reported by the compiler (errors, warnings, etc.) are routed
@@ -302,7 +304,8 @@ abstract class Loader {
302304
Uri fileUri, Severity severity,
303305
{bool wasHandled: false,
304306
List<LocatedMessage> context,
305-
bool problemOnLibrary: false}) {
307+
bool problemOnLibrary: false,
308+
List<Uri> involvedFiles}) {
306309
severity = target.fixSeverity(severity, message, fileUri);
307310
if (severity == Severity.ignored) return null;
308311
String trace = """
@@ -321,13 +324,14 @@ severity: $severity
321324
}
322325
target.context.report(
323326
message.withLocation(fileUri, charOffset, length), severity,
324-
context: context);
327+
context: context, involvedFiles: involvedFiles);
325328
if (severity == Severity.error) {
326329
(wasHandled ? handledErrors : unhandledErrors)
327330
.add(message.withLocation(fileUri, charOffset, length));
328331
}
329332
FormattedMessage formattedMessage = target.createFormattedMessage(
330-
message, charOffset, length, fileUri, context, severity);
333+
message, charOffset, length, fileUri, context, severity,
334+
involvedFiles: involvedFiles);
331335
if (!problemOnLibrary) {
332336
allComponentProblems.add(formattedMessage);
333337
}

pkg/front_end/lib/src/fasta/source/source_loader.dart

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -385,13 +385,18 @@ class SourceLoader extends Loader {
385385
}
386386
}
387387
if (libraryByPackage.isNotEmpty) {
388+
List<Uri> involvedFiles = [];
388389
List<String> dependencies = [];
389390
libraryByPackage.forEach((String name, List<LibraryBuilder> libraries) {
390391
if (name != null) {
391392
dependencies.add('package:$name');
393+
for (LibraryBuilder libraryBuilder in libraries) {
394+
involvedFiles.add(libraryBuilder.fileUri);
395+
}
392396
} else {
393397
for (LibraryBuilder libraryBuilder in libraries) {
394398
dependencies.add(libraryBuilder.importUri.toString());
399+
involvedFiles.add(libraryBuilder.fileUri);
395400
}
396401
}
397402
});
@@ -401,7 +406,8 @@ class SourceLoader extends Loader {
401406
templateStrongModeNNBDPackageOptOut.withArguments(dependencies),
402407
-1,
403408
-1,
404-
null);
409+
null,
410+
involvedFiles: involvedFiles);
405411
_strongOptOutLibraries = null;
406412
}
407413
}

pkg/front_end/lib/src/fasta/target_implementation.dart

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -180,12 +180,14 @@ abstract class TargetImplementation extends Target {
180180
int length,
181181
Uri fileUri,
182182
List<LocatedMessage> messageContext,
183-
Severity severity) {
183+
Severity severity,
184+
{List<Uri> involvedFiles}) {
184185
ProcessedOptions processedOptions = context.options;
185186
return processedOptions.format(
186187
message.withLocation(fileUri, charOffset, length),
187188
severity,
188-
messageContext);
189+
messageContext,
190+
involvedFiles: involvedFiles);
189191
}
190192

191193
Severity fixSeverity(Severity severity, Message message, Uri fileUri) {

pkg/front_end/test/messages_json_test.dart

Lines changed: 16 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -23,12 +23,13 @@ main() {
2323
null, "Formatted string #3", 313, 32, Severity.error, []);
2424

2525
FormattedMessage formattedMessage1 = new FormattedMessage(
26-
locatedMessage1,
27-
"Formatted string",
28-
42,
29-
86,
30-
severity,
31-
[formattedMessage2, formattedMessage3]);
26+
locatedMessage1, "Formatted string", 42, 86, severity, [
27+
formattedMessage2,
28+
formattedMessage3
29+
], involvedFiles: [
30+
Uri.parse("what:ever/foo.dart"),
31+
Uri.parse("what:ever/bar.dart")
32+
]);
3233

3334
DiagnosticMessageFromJson diagnosticMessageFromJson =
3435
new DiagnosticMessageFromJson.fromJson(
@@ -62,6 +63,15 @@ void compareMessages(DiagnosticMessage a, DiagnosticMessage b) {
6263

6364
expect(a.severity, b.severity);
6465
expect(getMessageUri(a), getMessageUri(b));
66+
67+
List<Uri> uriList1 = a.involvedFiles?.toList();
68+
List<Uri> uriList2 = b.involvedFiles?.toList();
69+
expect(uriList1?.length, uriList2?.length);
70+
if (uriList1 != null) {
71+
for (int i = 0; i < uriList1.length; i++) {
72+
expect(uriList1[i], uriList2[i]);
73+
}
74+
}
6575
}
6676

6777
void expect(Object actual, Object expect) {

pkg/front_end/test/spell_checking_list_code.txt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -279,6 +279,7 @@ dec
279279
decl
280280
decoupled
281281
decreases
282+
deduplication
282283
deemed
283284
deepest
284285
deeply

0 commit comments

Comments
 (0)