Fine. Support for class fields.

Change-Id: Ifb2eb91c87931130d390d3d4bc6a7d4732a26cd1
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/421882
Reviewed-by: Paul Berry <paulberry@google.com>
Commit-Queue: Konstantin Shcheglov <scheglov@google.com>
diff --git a/pkg/analyzer/lib/src/fine/manifest_item.dart b/pkg/analyzer/lib/src/fine/manifest_item.dart
index 603317f..0520197 100644
--- a/pkg/analyzer/lib/src/fine/manifest_item.dart
+++ b/pkg/analyzer/lib/src/fine/manifest_item.dart
@@ -107,12 +107,14 @@
 
 class InstanceItemGetterItem extends InstanceItemMemberItem {
   final ManifestType returnType;
+  final ManifestNode? constInitializer;
 
   InstanceItemGetterItem({
     required super.id,
     required super.metadata,
     required super.isStatic,
     required this.returnType,
+    required this.constInitializer,
   });
 
   factory InstanceItemGetterItem.fromElement({
@@ -120,11 +122,16 @@
     required EncodeContext context,
     required GetterElement2OrMember element,
   }) {
+    element as GetterElementImpl; // TODO(scheglov): remove it
     return InstanceItemGetterItem(
       id: id,
-      metadata: ManifestMetadata.encode(context, element.metadata2),
+      metadata: ManifestMetadata.encode(
+        context,
+        element.thisOrVariableMetadata,
+      ),
       isStatic: element.isStatic,
       returnType: element.returnType.encode(context),
+      constInitializer: element.constInitializer?.encode(context),
     );
   }
 
@@ -134,6 +141,7 @@
       metadata: ManifestMetadata.read(reader),
       isStatic: reader.readBool(),
       returnType: ManifestType.read(reader),
+      constInitializer: ManifestNode.readOptional(reader),
     );
   }
 
@@ -142,8 +150,10 @@
     MatchContext context,
     covariant GetterElement2OrMember element,
   ) {
+    element as GetterElementImpl; // TODO(scheglov): remove it
     return super.match(context, element) &&
-        returnType.match(context, element.returnType);
+        returnType.match(context, element.returnType) &&
+        constInitializer.match(context, element.constInitializer);
   }
 
   @override
@@ -151,6 +161,7 @@
     sink.writeEnum(_ManifestItemKind2.instanceGetter);
     super.write(sink);
     returnType.write(sink);
+    constInitializer.writeOptional(sink);
   }
 }
 
@@ -258,7 +269,10 @@
   }) {
     return InstanceItemSetterItem(
       id: id,
-      metadata: ManifestMetadata.encode(context, element.metadata2),
+      metadata: ManifestMetadata.encode(
+        context,
+        element.thisOrVariableMetadata,
+      ),
       isStatic: element.isStatic,
       valueType: element.formalParameters[0].type.encode(context),
     );
diff --git a/pkg/analyzer/test/src/dart/analysis/driver_test.dart b/pkg/analyzer/test/src/dart/analysis/driver_test.dart
index 2c7caa7..33e1d5c 100644
--- a/pkg/analyzer/test/src/dart/analysis/driver_test.dart
+++ b/pkg/analyzer/test/src/dart/analysis/driver_test.dart
@@ -9310,6 +9310,351 @@
     );
   }
 
+  test_manifest_class_field_add() async {
+    await _runLibraryManifestScenario(
+      initialCode: r'''
+class A {
+  final a = 0;
+}
+''',
+      expectedInitialEvents: r'''
+[operation] linkLibraryCycle SDK
+[operation] linkLibraryCycle
+  package:test/test.dart
+    manifest
+      A: #M0
+        declaredMembers
+          a: #M1
+''',
+      updatedCode: r'''
+class A {
+  final a = 0;
+  final b = 1;
+}
+''',
+      expectedUpdatedEvents: r'''
+[operation] linkLibraryCycle
+  package:test/test.dart
+    manifest
+      A: #M0
+        declaredMembers
+          a: #M1
+          b: #M2
+''',
+    );
+  }
+
+  test_manifest_class_field_initializer_type() async {
+    await _runLibraryManifestScenario(
+      initialCode: r'''
+class A {
+  final a = 0;
+}
+''',
+      expectedInitialEvents: r'''
+[operation] linkLibraryCycle SDK
+[operation] linkLibraryCycle
+  package:test/test.dart
+    manifest
+      A: #M0
+        declaredMembers
+          a: #M1
+''',
+      updatedCode: r'''
+class A {
+  final a = 1.2;
+}
+''',
+      expectedUpdatedEvents: r'''
+[operation] linkLibraryCycle
+  package:test/test.dart
+    manifest
+      A: #M0
+        declaredMembers
+          a: #M2
+''',
+    );
+  }
+
+  test_manifest_class_field_initializer_value_final() async {
+    await _runLibraryManifestScenario(
+      initialCode: r'''
+class A {
+  final a = 0;
+}
+''',
+      expectedInitialEvents: r'''
+[operation] linkLibraryCycle SDK
+[operation] linkLibraryCycle
+  package:test/test.dart
+    manifest
+      A: #M0
+        declaredMembers
+          a: #M1
+''',
+      updatedCode: r'''
+class A {
+  final a = 1;
+}
+''',
+      expectedUpdatedEvents: r'''
+[operation] linkLibraryCycle
+  package:test/test.dart
+    manifest
+      A: #M0
+        declaredMembers
+          a: #M1
+''',
+    );
+  }
+
+  test_manifest_class_field_initializer_value_static_const() async {
+    await _runLibraryManifestScenario(
+      initialCode: r'''
+class A {
+  static const a = 0;
+}
+''',
+      expectedInitialEvents: r'''
+[operation] linkLibraryCycle SDK
+[operation] linkLibraryCycle
+  package:test/test.dart
+    manifest
+      A: #M0
+        declaredMembers
+          a: #M1
+''',
+      updatedCode: r'''
+class A {
+  static const a = 1;
+}
+''',
+      expectedUpdatedEvents: r'''
+[operation] linkLibraryCycle
+  package:test/test.dart
+    manifest
+      A: #M0
+        declaredMembers
+          a: #M2
+''',
+    );
+  }
+
+  test_manifest_class_field_initializer_value_static_final() async {
+    await _runLibraryManifestScenario(
+      initialCode: r'''
+class A {
+  static final a = 0;
+}
+''',
+      expectedInitialEvents: r'''
+[operation] linkLibraryCycle SDK
+[operation] linkLibraryCycle
+  package:test/test.dart
+    manifest
+      A: #M0
+        declaredMembers
+          a: #M1
+''',
+      updatedCode: r'''
+class A {
+  static final a = 1;
+}
+''',
+      expectedUpdatedEvents: r'''
+[operation] linkLibraryCycle
+  package:test/test.dart
+    manifest
+      A: #M0
+        declaredMembers
+          a: #M1
+''',
+    );
+  }
+
+  test_manifest_class_field_metadata() async {
+    await _runLibraryManifestScenario(
+      initialCode: r'''
+class A {
+  @Deprecated('0')
+  var a = 0;
+  @Deprecated('0')
+  var b = 0;
+}
+''',
+      expectedInitialEvents: r'''
+[operation] linkLibraryCycle SDK
+[operation] linkLibraryCycle
+  package:test/test.dart
+    manifest
+      A: #M0
+        declaredMembers
+          a: #M1
+          a=: #M2
+          b: #M3
+          b=: #M4
+''',
+      updatedCode: r'''
+class A {
+  @Deprecated('0')
+  var a = 0;
+  @Deprecated('1')
+  var b = 0;
+}
+''',
+      expectedUpdatedEvents: r'''
+[operation] linkLibraryCycle
+  package:test/test.dart
+    manifest
+      A: #M0
+        declaredMembers
+          a: #M1
+          a=: #M2
+          b: #M5
+          b=: #M6
+''',
+    );
+  }
+
+  test_manifest_class_field_private_final() async {
+    await _runLibraryManifestScenario(
+      initialCode: r'''
+class A {
+  final _a = 0;
+}
+''',
+      expectedInitialEvents: r'''
+[operation] linkLibraryCycle SDK
+[operation] linkLibraryCycle
+  package:test/test.dart
+    manifest
+      A: #M0
+        declaredMembers
+          _a: #M1
+''',
+      updatedCode: r'''
+class A {
+  final _a = 0;
+  final b = 0;
+}
+''',
+      expectedUpdatedEvents: r'''
+[operation] linkLibraryCycle
+  package:test/test.dart
+    manifest
+      A: #M0
+        declaredMembers
+          _a: #M1
+          b: #M2
+''',
+    );
+  }
+
+  test_manifest_class_field_private_static_const() async {
+    await _runLibraryManifestScenario(
+      initialCode: r'''
+class A {
+  static const _a = 0;
+}
+''',
+      expectedInitialEvents: r'''
+[operation] linkLibraryCycle SDK
+[operation] linkLibraryCycle
+  package:test/test.dart
+    manifest
+      A: #M0
+        declaredMembers
+          _a: #M1
+''',
+      updatedCode: r'''
+class A {
+  static const _a = 0;
+  static const b = 0;
+}
+''',
+      expectedUpdatedEvents: r'''
+[operation] linkLibraryCycle
+  package:test/test.dart
+    manifest
+      A: #M0
+        declaredMembers
+          _a: #M1
+          b: #M2
+''',
+    );
+  }
+
+  test_manifest_class_field_private_var() async {
+    await _runLibraryManifestScenario(
+      initialCode: r'''
+class A {
+  var _a = 0;
+}
+''',
+      expectedInitialEvents: r'''
+[operation] linkLibraryCycle SDK
+[operation] linkLibraryCycle
+  package:test/test.dart
+    manifest
+      A: #M0
+        declaredMembers
+          _a: #M1
+          _a=: #M2
+''',
+      updatedCode: r'''
+class A {
+  var _a = 0;
+  var b = 0;
+}
+''',
+      expectedUpdatedEvents: r'''
+[operation] linkLibraryCycle
+  package:test/test.dart
+    manifest
+      A: #M0
+        declaredMembers
+          _a: #M1
+          _a=: #M2
+          b: #M3
+          b=: #M4
+''',
+    );
+  }
+
+  test_manifest_class_field_type() async {
+    await _runLibraryManifestScenario(
+      initialCode: r'''
+class A {
+  int? a;
+}
+''',
+      expectedInitialEvents: r'''
+[operation] linkLibraryCycle SDK
+[operation] linkLibraryCycle
+  package:test/test.dart
+    manifest
+      A: #M0
+        declaredMembers
+          a: #M1
+          a=: #M2
+''',
+      updatedCode: r'''
+class A {
+  double? a;
+}
+''',
+      expectedUpdatedEvents: r'''
+[operation] linkLibraryCycle
+  package:test/test.dart
+    manifest
+      A: #M0
+        declaredMembers
+          a: #M3
+          a=: #M4
+''',
+    );
+  }
+
   test_manifest_class_getter_add_extends() async {
     await _runLibraryManifestScenario(
       initialCode: r'''