Skip to content

Commit 6fa5b31

Browse files
bwilkersoncommit-bot@chromium.org
authored andcommitted
Report an error when extensions declare a static final field that is not initialized
Change-Id: I85e15ae0965ac905751b9877691cf20e9f615021 Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/114927 Reviewed-by: Konstantin Shcheglov <[email protected]> Commit-Queue: Brian Wilkerson <[email protected]>
1 parent 2e2d5bc commit 6fa5b31

File tree

4 files changed

+67
-0
lines changed

4 files changed

+67
-0
lines changed

pkg/analyzer/lib/src/generated/error_verifier.dart

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -732,6 +732,7 @@ class ErrorVerifier extends RecursiveAstVisitor<void> {
732732
void visitExtensionDeclaration(ExtensionDeclaration node) {
733733
_enclosingExtension = node.declaredElement;
734734
_duplicateDefinitionVerifier.checkExtension(node);
735+
_checkForFinalNotInitializedInClass(node.members);
735736
_checkForMismatchedAccessorTypesInExtension(node);
736737
super.visitExtensionDeclaration(node);
737738
_enclosingExtension = null;
Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,46 @@
1+
// Copyright (c) 2019, 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/dart/analysis/features.dart';
6+
import 'package:analyzer/src/error/codes.dart';
7+
import 'package:analyzer/src/generated/engine.dart';
8+
import 'package:test_reflective_loader/test_reflective_loader.dart';
9+
10+
import '../dart/resolution/driver_resolution.dart';
11+
12+
main() {
13+
defineReflectiveSuite(() {
14+
// defineReflectiveTests(ConstNotInitializedTest);
15+
defineReflectiveTests(ConstNotInitializedWithExtensionMethodsTest);
16+
// defineReflectiveTests(ConstNotInitializedWithNnbdTest);
17+
});
18+
}
19+
20+
@reflectiveTest
21+
class ConstNotInitializedTest extends DriverResolutionTest {}
22+
23+
@reflectiveTest
24+
class ConstNotInitializedWithExtensionMethodsTest extends DriverResolutionTest {
25+
@override
26+
AnalysisOptionsImpl get analysisOptions => AnalysisOptionsImpl()
27+
..contextFeatures = new FeatureSet.forTesting(
28+
sdkVersion: '2.3.0', additionalFeatures: [Feature.extension_methods]);
29+
30+
test_instance() async {
31+
await assertErrorsInCode('''
32+
extension E on String {
33+
static const F;
34+
}''', [
35+
error(CompileTimeErrorCode.CONST_NOT_INITIALIZED, 39, 1),
36+
]);
37+
}
38+
}
39+
40+
@reflectiveTest
41+
class ConstNotInitializedWithNnbdTest extends DriverResolutionTest {
42+
@override
43+
AnalysisOptionsImpl get analysisOptions => AnalysisOptionsImpl()
44+
..contextFeatures = new FeatureSet.forTesting(
45+
sdkVersion: '2.3.0', additionalFeatures: [Feature.non_nullable]);
46+
}

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

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@ import '../dart/resolution/driver_resolution.dart';
1313
main() {
1414
defineReflectiveSuite(() {
1515
defineReflectiveTests(FinalNotInitializedTest);
16+
defineReflectiveTests(FinalNotInitializedWithExtensionMethodsTest);
1617
defineReflectiveTests(FinalNotInitializedWithNnbdTest);
1718
});
1819
}
@@ -56,6 +57,23 @@ f() {
5657
}
5758
}
5859

60+
@reflectiveTest
61+
class FinalNotInitializedWithExtensionMethodsTest extends DriverResolutionTest {
62+
@override
63+
AnalysisOptionsImpl get analysisOptions => AnalysisOptionsImpl()
64+
..contextFeatures = new FeatureSet.forTesting(
65+
sdkVersion: '2.3.0', additionalFeatures: [Feature.extension_methods]);
66+
67+
test_static() async {
68+
await assertErrorsInCode('''
69+
extension E on String {
70+
static final F;
71+
}''', [
72+
error(StaticWarningCode.FINAL_NOT_INITIALIZED, 39, 1),
73+
]);
74+
}
75+
}
76+
5977
@reflectiveTest
6078
class FinalNotInitializedWithNnbdTest extends DriverResolutionTest {
6179
@override

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

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,7 @@ import 'const_constructor_with_mixin_with_field_test.dart'
3434
import 'const_eval_throws_exception_test.dart' as const_eval_throws_exception;
3535
import 'const_map_key_expression_type_implements_equals_test.dart'
3636
as const_map_key_expression_type_implements_equals;
37+
import 'const_not_initialized_test.dart' as const_not_initialized;
3738
import 'const_set_element_type_implements_equals_test.dart'
3839
as const_set_element_type_implements_equals;
3940
import 'const_spread_expected_list_or_set_test.dart'
@@ -326,6 +327,7 @@ main() {
326327
const_constructor_with_mixin_with_field.main();
327328
const_eval_throws_exception.main();
328329
const_map_key_expression_type_implements_equals.main();
330+
const_not_initialized.main();
329331
const_set_element_type_implements_equals.main();
330332
const_spread_expected_list_or_set.main();
331333
const_spread_expected_map.main();

0 commit comments

Comments
 (0)