`FINAL_NOT_INITIALIZED_CONSTRUCTOR` not to be reported for static fields.
Fixes #48180
Change-Id: I3c296fb6e307b5dd6cf0dd53cbc7297a88146e81
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/238358
Reviewed-by: Konstantin Shcheglov <scheglov@google.com>
Reviewed-by: Brian Wilkerson <brianwilkerson@google.com>
Commit-Queue: Brian Wilkerson <brianwilkerson@google.com>
diff --git a/pkg/analyzer/lib/src/error/constructor_fields_verifier.dart b/pkg/analyzer/lib/src/error/constructor_fields_verifier.dart
index 496f77d..42d4dde 100644
--- a/pkg/analyzer/lib/src/error/constructor_fields_verifier.dart
+++ b/pkg/analyzer/lib/src/error/constructor_fields_verifier.dart
@@ -82,12 +82,13 @@
}
// Prepare lists of not initialized fields.
- List<FieldElement> notInitFinalFields = <FieldElement>[];
- List<FieldElement> notInitNonNullableFields = <FieldElement>[];
+ var notInitFinalFields = <FieldElement>[];
+ var notInitNonNullableFields = <FieldElement>[];
_fieldMap.forEach((FieldElement field, _InitState state) {
if (state != _InitState.notInit) return;
if (field.isLate) return;
if (field.isAbstract || field.isExternal) return;
+ if (field.isStatic) return;
if (field.isFinal) {
notInitFinalFields.add(field);
diff --git a/pkg/analyzer/lib/src/generated/error_verifier.dart b/pkg/analyzer/lib/src/generated/error_verifier.dart
index a407d52..b93727e 100644
--- a/pkg/analyzer/lib/src/generated/error_verifier.dart
+++ b/pkg/analyzer/lib/src/generated/error_verifier.dart
@@ -1250,7 +1250,7 @@
@override
void visitTopLevelVariableDeclaration(TopLevelVariableDeclaration node) {
_checkForFinalNotInitialized(node.variables);
- _checkForNotInitializedNonNullableVariable(node.variables);
+ _checkForNotInitializedNonNullableVariable(node.variables, true);
for (var declaration in node.variables.variables) {
_checkForMainFunction(declaration.name);
@@ -3789,18 +3789,19 @@
if (!node.isStatic) {
return;
}
- _checkForNotInitializedNonNullableVariable(node.fields);
+ _checkForNotInitializedNonNullableVariable(node.fields, false);
}
void _checkForNotInitializedNonNullableVariable(
VariableDeclarationList node,
+ bool topLevel,
) {
if (!_isNonNullableByDefault) {
return;
}
- // Const and final checked separately.
- if (node.isConst || node.isFinal) {
+ // Checked separately.
+ if (node.isConst || (topLevel && node.isFinal)) {
return;
}
diff --git a/pkg/analyzer/test/src/diagnostics/final_not_initialized_test.dart b/pkg/analyzer/test/src/diagnostics/final_not_initialized_test.dart
index f24221e..5a9b9f2 100644
--- a/pkg/analyzer/test/src/diagnostics/final_not_initialized_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/final_not_initialized_test.dart
@@ -185,6 +185,14 @@
external final int x;
''');
}
+
+ test_topLevel_final() async {
+ await assertErrorsInCode('''
+final int x;
+''', [
+ error(CompileTimeErrorCode.FINAL_NOT_INITIALIZED, 10, 1),
+ ]);
+ }
}
@reflectiveTest
diff --git a/pkg/analyzer/test/src/diagnostics/not_initialized_non_nullable_variable_test.dart b/pkg/analyzer/test/src/diagnostics/not_initialized_non_nullable_variable_test.dart
index 560bb4f..5c971f3 100644
--- a/pkg/analyzer/test/src/diagnostics/not_initialized_non_nullable_variable_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/not_initialized_non_nullable_variable_test.dart
@@ -65,6 +65,28 @@
]);
}
+ test_staticField_noInitializer_constructor() async {
+ await assertErrorsInCode('''
+class A {
+ static int x = 0, y, z = 2;
+ A();
+}
+''', [
+ error(CompileTimeErrorCode.NOT_INITIALIZED_NON_NULLABLE_VARIABLE, 30, 1),
+ ]);
+ }
+
+ test_staticField_noInitializer_final_constructor() async {
+ await assertErrorsInCode('''
+class A {
+ static final int x = 0, y, z = 2;
+ A();
+}
+''', [
+ error(CompileTimeErrorCode.NOT_INITIALIZED_NON_NULLABLE_VARIABLE, 36, 1),
+ ]);
+ }
+
test_staticField_nullable() async {
await assertNoErrorsInCode('''
class A {