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'''