Skip to content

Commit 7c7e931

Browse files
committed
Update reporting INCONSISTENT_LANGUAGE_VERSION_OVERRIDE on part directives.
Change-Id: I100260b19d07c6ff7d172e9c31d4f99281a17807 Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/155924 Reviewed-by: Brian Wilkerson <[email protected]>
1 parent c211287 commit 7c7e931

File tree

2 files changed

+38
-36
lines changed

2 files changed

+38
-36
lines changed

pkg/analyzer/lib/src/dart/analysis/library_analyzer.dart

Lines changed: 28 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -200,37 +200,41 @@ class LibraryAnalyzer {
200200
void _checkForInconsistentLanguageVersionOverride(
201201
Map<FileState, CompilationUnit> units,
202202
) {
203-
var libraryUnit = units.values.first;
203+
var libraryEntry = units.entries.first;
204+
var libraryUnit = libraryEntry.value;
204205
var libraryOverrideToken = libraryUnit.languageVersionToken;
205206

206-
for (var partEntry in units.entries.skip(1)) {
207-
var partUnit = partEntry.value;
208-
var partOverrideToken = partUnit.languageVersionToken;
209-
if (libraryOverrideToken != null) {
210-
if (partOverrideToken != null) {
211-
if (partOverrideToken.major != libraryOverrideToken.major ||
212-
partOverrideToken.minor != libraryOverrideToken.minor) {
213-
_getErrorReporter(partEntry.key).reportErrorForToken(
214-
CompileTimeErrorCode.INCONSISTENT_LANGUAGE_VERSION_OVERRIDE,
215-
partOverrideToken,
216-
);
207+
var elementToUnit = <CompilationUnitElement, CompilationUnit>{};
208+
for (var entry in units.entries) {
209+
var unit = entry.value;
210+
elementToUnit[unit.declaredElement] = unit;
211+
}
212+
213+
for (var directive in libraryUnit.directives) {
214+
if (directive is PartDirective) {
215+
var partUnit = elementToUnit[directive.uriElement];
216+
if (partUnit != null) {
217+
var shouldReport = false;
218+
var partOverrideToken = partUnit.languageVersionToken;
219+
if (libraryOverrideToken != null) {
220+
if (partOverrideToken != null) {
221+
if (partOverrideToken.major != libraryOverrideToken.major ||
222+
partOverrideToken.minor != libraryOverrideToken.minor) {
223+
shouldReport = true;
224+
}
225+
} else {
226+
shouldReport = true;
227+
}
228+
} else if (partOverrideToken != null) {
229+
shouldReport = true;
217230
}
218-
} else {
219-
var partDirectives = partUnit.directives;
220-
for (var partOf in partDirectives.whereType<PartOfDirective>()) {
221-
var partOffset = partOf.partKeyword.offset;
222-
_getErrorReporter(partEntry.key).reportErrorForOffset(
231+
if (shouldReport) {
232+
_getErrorReporter(_library).reportErrorForNode(
223233
CompileTimeErrorCode.INCONSISTENT_LANGUAGE_VERSION_OVERRIDE,
224-
partOffset,
225-
partOf.ofKeyword.end - partOffset,
234+
directive.uri,
226235
);
227236
}
228237
}
229-
} else if (partOverrideToken != null) {
230-
_getErrorReporter(partEntry.key).reportErrorForToken(
231-
CompileTimeErrorCode.INCONSISTENT_LANGUAGE_VERSION_OVERRIDE,
232-
partOverrideToken,
233-
);
234238
}
235239
}
236240
}

pkg/analyzer/test/src/diagnostics/inconsistent_language_version_override_test.dart

Lines changed: 10 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -30,8 +30,8 @@ part 'b.dart';
3030
// @dart = 2.6
3131
part of 'a.dart';
3232
''',
33-
partErrors: [
34-
error(_errorCode, 0, 14),
33+
libraryErrors: [
34+
error(_errorCode, 20, 8),
3535
],
3636
);
3737
}
@@ -46,7 +46,7 @@ part 'b.dart';
4646
// @dart = 2.5
4747
part of 'a.dart';
4848
''',
49-
partErrors: [],
49+
libraryErrors: [],
5050
);
5151
}
5252

@@ -58,7 +58,7 @@ part 'b.dart';
5858
partContent: r'''
5959
part of 'a.dart';
6060
''',
61-
partErrors: [],
61+
libraryErrors: [],
6262
);
6363
}
6464

@@ -71,8 +71,8 @@ part 'b.dart';
7171
partContent: r'''
7272
part of 'a.dart';
7373
''',
74-
partErrors: [
75-
error(_errorCode, 0, 7),
74+
libraryErrors: [
75+
error(_errorCode, 20, 8),
7676
],
7777
);
7878
}
@@ -86,16 +86,16 @@ part 'b.dart';
8686
// @dart = 2.5
8787
part of 'a.dart';
8888
''',
89-
partErrors: [
90-
error(_errorCode, 0, 14),
89+
libraryErrors: [
90+
error(_errorCode, 5, 8),
9191
],
9292
);
9393
}
9494

9595
Future<void> _checkLibraryAndPart({
9696
@required String libraryContent,
9797
@required String partContent,
98-
@required List<ExpectedError> partErrors,
98+
@required List<ExpectedError> libraryErrors,
9999
}) async {
100100
var libraryPath = convertPath('/test/lib/a.dart');
101101
var partPath = convertPath('/test/lib/b.dart');
@@ -104,8 +104,6 @@ part of 'a.dart';
104104

105105
newFile(partPath, content: partContent);
106106

107-
await resolveFile(libraryPath);
108-
109-
await assertErrorsInFile2(partPath, partErrors);
107+
await assertErrorsInFile2(libraryPath, libraryErrors);
110108
}
111109
}

0 commit comments

Comments
 (0)