`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 {