Skip to content

Commit d8e38d8

Browse files
scheglovCommit Queue
authored andcommitted
Issue 61845. Report inconsistentLanguageVersionOverride for nested parts.
Bug: #61845 Change-Id: I9254112b65c2b22fcd8efd983c1865c65ede1b0f Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/458083 Commit-Queue: Konstantin Shcheglov <[email protected]> Reviewed-by: Johnni Winther <[email protected]>
1 parent ac841ae commit d8e38d8

File tree

2 files changed

+186
-70
lines changed

2 files changed

+186
-70
lines changed

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

Lines changed: 31 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -250,45 +250,50 @@ class LibraryAnalyzer {
250250
}
251251

252252
void _checkForInconsistentLanguageVersionOverride() {
253-
var libraryUnitAnalysis = _libraryFiles.values.first;
254-
var libraryUnit = libraryUnitAnalysis.unit;
255-
var libraryOverrideToken = libraryUnit.languageVersionToken;
253+
var libraryAnalysis = _libraryFiles.values.first;
254+
var libraryOverrideToken = libraryAnalysis.unit.languageVersionToken;
256255

257-
var elementToUnit = <LibraryFragmentImpl, CompilationUnit>{};
256+
var elementToAnalysis = <LibraryFragmentImpl, FileAnalysis>{};
258257
for (var fileAnalysis in _libraryFiles.values) {
259-
elementToUnit[fileAnalysis.element] = fileAnalysis.unit;
258+
elementToAnalysis[fileAnalysis.element] = fileAnalysis;
260259
}
261260

262-
for (var directive in libraryUnit.directives) {
263-
if (directive is PartDirectiveImpl) {
264-
var uri = directive.partInclude?.uri;
265-
if (uri is DirectiveUriWithUnitImpl) {
266-
var partUnit = elementToUnit[uri.libraryFragment];
267-
if (partUnit != null) {
268-
var shouldReport = false;
269-
var partOverrideToken = partUnit.languageVersionToken;
270-
if (libraryOverrideToken != null) {
271-
if (partOverrideToken != null) {
272-
if (partOverrideToken.major != libraryOverrideToken.major ||
273-
partOverrideToken.minor != libraryOverrideToken.minor) {
261+
void visitPartDirectives(FileAnalysis container) {
262+
for (var directive in container.unit.directives) {
263+
if (directive is PartDirectiveImpl) {
264+
var uri = directive.partInclude?.uri;
265+
if (uri is DirectiveUriWithUnitImpl) {
266+
var part = elementToAnalysis[uri.libraryFragment];
267+
if (part != null) {
268+
var shouldReport = false;
269+
var partOverrideToken = part.unit.languageVersionToken;
270+
if (libraryOverrideToken != null) {
271+
if (partOverrideToken != null) {
272+
if (partOverrideToken.major != libraryOverrideToken.major ||
273+
partOverrideToken.minor != libraryOverrideToken.minor) {
274+
shouldReport = true;
275+
}
276+
} else {
274277
shouldReport = true;
275278
}
276-
} else {
279+
} else if (partOverrideToken != null) {
277280
shouldReport = true;
278281
}
279-
} else if (partOverrideToken != null) {
280-
shouldReport = true;
281-
}
282-
if (shouldReport) {
283-
libraryUnitAnalysis.diagnosticReporter.atNode(
284-
directive.uri,
285-
CompileTimeErrorCode.inconsistentLanguageVersionOverride,
286-
);
282+
if (shouldReport) {
283+
container.diagnosticReporter.atNode(
284+
directive.uri,
285+
CompileTimeErrorCode.inconsistentLanguageVersionOverride,
286+
);
287+
} else {
288+
visitPartDirectives(part);
289+
}
287290
}
288291
}
289292
}
290293
}
291294
}
295+
296+
visitPartDirectives(libraryAnalysis);
292297
}
293298

294299
void _computeConstantErrors(FileAnalysis fileAnalysis) {

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

Lines changed: 155 additions & 44 deletions
Original file line numberDiff line numberDiff line change
@@ -15,69 +15,180 @@ main() {
1515

1616
@reflectiveTest
1717
class InconsistentLanguageVersionOverrideTest extends PubPackageResolutionTest {
18-
CompileTimeErrorCode get _errorCode =>
19-
CompileTimeErrorCode.inconsistentLanguageVersionOverride;
18+
test_0_00_000_AAA() async {
19+
var a = newFile('$testPackageLibPath/a.dart', r'''
20+
// @dart = 3.10
21+
part 'b.dart';
22+
''');
2023

21-
test_both_different() async {
22-
await _checkLibraryAndPart(
23-
libraryContent: r'''
24-
// @dart = 3.1
24+
var b = newFile('$testPackageLibPath/b.dart', r'''
25+
// @dart = 3.10
26+
part of 'a.dart';
27+
part 'c.dart';
28+
''');
29+
30+
var c = newFile('$testPackageLibPath/c.dart', r'''
31+
// @dart = 3.10
32+
part of 'b.dart';
33+
''');
34+
35+
await assertErrorsInFile2(a, []);
36+
await assertErrorsInFile2(b, []);
37+
await assertErrorsInFile2(c, []);
38+
}
39+
40+
test_0_00_000_AAB() async {
41+
var a = newFile('$testPackageLibPath/a.dart', r'''
42+
// @dart = 3.10
2543
part 'b.dart';
26-
''',
27-
partContent: r'''
28-
// @dart = 3.2
44+
''');
45+
46+
var b = newFile('$testPackageLibPath/b.dart', r'''
47+
// @dart = 3.10
48+
part of 'a.dart';
49+
part 'c.dart';
50+
''');
51+
52+
var c = newFile('$testPackageLibPath/c.dart', r'''
53+
// @dart = 3.11
54+
part of 'b.dart';
55+
''');
56+
57+
await assertErrorsInFile2(a, []);
58+
await assertErrorsInFile2(b, [
59+
error(CompileTimeErrorCode.inconsistentLanguageVersionOverride, 39, 8),
60+
]);
61+
await assertErrorsInFile2(c, []);
62+
}
63+
64+
test_0_00_000_AAN() async {
65+
var a = newFile('$testPackageLibPath/a.dart', r'''
66+
// @dart = 3.10
67+
part 'b.dart';
68+
''');
69+
70+
var b = newFile('$testPackageLibPath/b.dart', r'''
71+
// @dart = 3.10
72+
part of 'a.dart';
73+
part 'c.dart';
74+
''');
75+
76+
var c = newFile('$testPackageLibPath/c.dart', r'''
77+
part of 'b.dart';
78+
''');
79+
80+
await assertErrorsInFile2(a, []);
81+
await assertErrorsInFile2(b, [
82+
error(CompileTimeErrorCode.inconsistentLanguageVersionOverride, 39, 8),
83+
]);
84+
await assertErrorsInFile2(c, []);
85+
}
86+
87+
test_0_00_000_ABB() async {
88+
var a = newFile('$testPackageLibPath/a.dart', r'''
89+
// @dart = 3.10
90+
part 'b.dart';
91+
''');
92+
93+
var b = newFile('$testPackageLibPath/b.dart', r'''
94+
// @dart = 3.11
2995
part of 'a.dart';
30-
''',
31-
libraryDiagnostics: [error(_errorCode, 20, 8)],
32-
);
96+
part 'c.dart';
97+
''');
98+
99+
var c = newFile('$testPackageLibPath/c.dart', r'''
100+
// @dart = 3.11
101+
part of 'b.dart';
102+
''');
103+
104+
await assertErrorsInFile2(a, [
105+
error(CompileTimeErrorCode.inconsistentLanguageVersionOverride, 21, 8),
106+
]);
107+
await assertErrorsInFile2(b, []);
108+
await assertErrorsInFile2(c, []);
33109
}
34110

35-
test_both_same() async {
36-
await _checkLibraryAndPart(
37-
libraryContent: r'''
111+
test_0_00_000_NAA() async {
112+
var a = newFile('$testPackageLibPath/a.dart', r'''
113+
part 'b.dart';
114+
''');
115+
116+
var b = newFile('$testPackageLibPath/b.dart', r'''
117+
// @dart = 3.10
118+
part of 'a.dart';
119+
part 'c.dart';
120+
''');
121+
122+
var c = newFile('$testPackageLibPath/c.dart', r'''
123+
// @dart = 3.10
124+
part of 'b.dart';
125+
''');
126+
127+
await assertErrorsInFile2(a, [
128+
error(CompileTimeErrorCode.inconsistentLanguageVersionOverride, 5, 8),
129+
]);
130+
await assertErrorsInFile2(b, []);
131+
await assertErrorsInFile2(c, []);
132+
}
133+
134+
test_0_00_AA() async {
135+
var a = newFile('$testPackageLibPath/a.dart', r'''
38136
// @dart = 3.2
39137
part 'b.dart';
40-
''',
41-
partContent: r'''
138+
''');
139+
140+
var b = newFile('$testPackageLibPath/b.dart', r'''
42141
// @dart = 3.2
43142
part of 'a.dart';
44-
''',
45-
libraryDiagnostics: [],
46-
);
143+
''');
144+
145+
await assertErrorsInFile2(a, []);
146+
await assertErrorsInFile2(b, []);
47147
}
48148

49-
test_none() async {
50-
await _checkLibraryAndPart(
51-
libraryContent: r'''
149+
test_0_00_AB() async {
150+
var a = newFile('$testPackageLibPath/a.dart', r'''
151+
// @dart = 3.1
52152
part 'b.dart';
53-
''',
54-
partContent: r'''
153+
''');
154+
155+
var b = newFile('$testPackageLibPath/b.dart', r'''
156+
// @dart = 3.2
55157
part of 'a.dart';
56-
''',
57-
libraryDiagnostics: [],
58-
);
158+
''');
159+
160+
await assertErrorsInFile2(a, [
161+
error(CompileTimeErrorCode.inconsistentLanguageVersionOverride, 20, 8),
162+
]);
163+
await assertErrorsInFile2(b, []);
59164
}
60165

61-
test_onlyPart() async {
62-
await _checkLibraryAndPart(
63-
libraryContent: r'''
166+
test_0_00_NA() async {
167+
var a = newFile('$testPackageLibPath/a.dart', r'''
64168
part 'b.dart';
65-
''',
66-
partContent: r'''
169+
''');
170+
171+
var b = newFile('$testPackageLibPath/b.dart', r'''
67172
// @dart = 3.1
68173
part of 'a.dart';
69-
''',
70-
libraryDiagnostics: [error(_errorCode, 5, 8)],
71-
);
174+
''');
175+
176+
await assertErrorsInFile2(a, [
177+
error(CompileTimeErrorCode.inconsistentLanguageVersionOverride, 5, 8),
178+
]);
179+
await assertErrorsInFile2(b, []);
72180
}
73181

74-
Future<void> _checkLibraryAndPart({
75-
required String libraryContent,
76-
required String partContent,
77-
required List<ExpectedDiagnostic> libraryDiagnostics,
78-
}) async {
79-
var a = newFile('$testPackageLibPath/a.dart', libraryContent);
80-
newFile('$testPackageLibPath/b.dart', partContent);
81-
await assertErrorsInFile2(a, libraryDiagnostics);
182+
test_0_00_NN() async {
183+
var a = newFile('$testPackageLibPath/a.dart', r'''
184+
part 'b.dart';
185+
''');
186+
187+
var b = newFile('$testPackageLibPath/b.dart', r'''
188+
part of 'a.dart';
189+
''');
190+
191+
await assertErrorsInFile2(a, []);
192+
await assertErrorsInFile2(b, []);
82193
}
83194
}

0 commit comments

Comments
 (0)