Implementations for RecordTypeAnnotation nodes.
Change-Id: Ice4425e70b62fc68d4ad3aa97faf6e56f4076781
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/255144
Reviewed-by: Samuel Rawlins <srawlins@google.com>
Commit-Queue: Konstantin Shcheglov <scheglov@google.com>
Reviewed-by: Brian Wilkerson <brianwilkerson@google.com>
diff --git a/pkg/analyzer/lib/dart/ast/ast.dart b/pkg/analyzer/lib/dart/ast/ast.dart
index 652148b..a7aacf1 100644
--- a/pkg/analyzer/lib/dart/ast/ast.dart
+++ b/pkg/analyzer/lib/dart/ast/ast.dart
@@ -4123,6 +4123,9 @@
/// The annotations associated with the field.
NodeList<Annotation> get metadata;
+ /// The name of the field.
+ Token? get name;
+
/// The type of the field.
TypeAnnotation get type;
}
@@ -4133,7 +4136,7 @@
@experimental
abstract class RecordTypeAnnotationNamedField
implements RecordTypeAnnotationField {
- /// The name of the field.
+ @override
Token get name;
}
diff --git a/pkg/analyzer/lib/src/dart/ast/ast.dart b/pkg/analyzer/lib/src/dart/ast/ast.dart
index fbf9fe1..072beb9 100644
--- a/pkg/analyzer/lib/src/dart/ast/ast.dart
+++ b/pkg/analyzer/lib/src/dart/ast/ast.dart
@@ -9692,6 +9692,180 @@
}
}
+abstract class RecordTypeAnnotationFieldImpl extends AstNodeImpl
+ implements RecordTypeAnnotationField {
+ @override
+ final NodeListImpl<Annotation> metadata = NodeListImpl._();
+
+ @override
+ final TypeAnnotationImpl type;
+
+ @override
+ final Token? comma;
+
+ RecordTypeAnnotationFieldImpl({
+ required List<Annotation>? metadata,
+ required this.type,
+ required this.comma,
+ }) {
+ this.metadata._initialize(this, metadata);
+ _becomeParentOf(type);
+ }
+
+ @override
+ Token get beginToken => metadata.beginToken ?? type.beginToken;
+
+ @override
+ Token get endToken => comma ?? type.endToken;
+
+ @override
+ ChildEntities get _childEntities => super._childEntities
+ ..addNodeList('metadata', metadata)
+ ..addNode('type', type)
+ ..addToken('name', name)
+ ..addToken('comma', comma);
+
+ @override
+ void visitChildren(AstVisitor visitor) {
+ metadata.accept(visitor);
+ type.accept(visitor);
+ }
+}
+
+class RecordTypeAnnotationImpl extends TypeAnnotationImpl
+ implements RecordTypeAnnotation {
+ @override
+ final NodeListImpl<RecordTypeAnnotationPositionalField> positionalFields =
+ NodeListImpl._();
+
+ @override
+ final RecordTypeAnnotationNamedFieldsImpl? namedFields;
+
+ @override
+ final Token? question;
+
+ @override
+ DartType? type;
+
+ RecordTypeAnnotationImpl({
+ required List<RecordTypeAnnotationPositionalField> positionalFields,
+ required this.namedFields,
+ required this.question,
+ }) {
+ this.positionalFields._initialize(this, positionalFields);
+ }
+
+ @override
+ Token get beginToken {
+ return positionalFields.beginToken ?? namedFields!.beginToken;
+ }
+
+ @override
+ Token get endToken {
+ return namedFields?.endToken ?? positionalFields.endToken!;
+ }
+
+ @override
+ ChildEntities get _childEntities => super._childEntities
+ ..addNodeList('positionalFields', positionalFields)
+ ..addNode('namedFields', namedFields)
+ ..addToken('question', question);
+
+ @override
+ E? accept<E>(AstVisitor<E> visitor) {
+ // TODO: implement accept
+ throw UnimplementedError();
+ }
+
+ @override
+ void visitChildren(AstVisitor visitor) {
+ positionalFields.accept(visitor);
+ namedFields?.accept(visitor);
+ }
+}
+
+class RecordTypeAnnotationNamedFieldImpl extends RecordTypeAnnotationFieldImpl
+ implements RecordTypeAnnotationNamedField {
+ @override
+ final Token name;
+
+ RecordTypeAnnotationNamedFieldImpl({
+ required super.metadata,
+ required super.type,
+ required this.name,
+ required super.comma,
+ });
+
+ @override
+ E? accept<E>(AstVisitor<E> visitor) {
+ // TODO: implement accept
+ throw UnimplementedError();
+ }
+}
+
+class RecordTypeAnnotationNamedFieldsImpl extends AstNodeImpl
+ implements RecordTypeAnnotationNamedFields {
+ @override
+ final Token leftBracket;
+
+ @override
+ final NodeListImpl<RecordTypeAnnotationNamedField> fields = NodeListImpl._();
+
+ @override
+ final Token rightBracket;
+
+ RecordTypeAnnotationNamedFieldsImpl({
+ required this.leftBracket,
+ required List<RecordTypeAnnotationNamedField> fields,
+ required this.rightBracket,
+ }) {
+ this.fields._initialize(this, fields);
+ }
+
+ @override
+ Token get beginToken => leftBracket;
+
+ @override
+ Token get endToken => rightBracket;
+
+ @override
+ ChildEntities get _childEntities => super._childEntities
+ ..addToken('leftBracket', leftBracket)
+ ..addNodeList('fields', fields)
+ ..addToken('rightBracket', rightBracket);
+
+ @override
+ E? accept<E>(AstVisitor<E> visitor) {
+ // TODO: implement accept
+ throw UnimplementedError();
+ }
+
+ @override
+ void visitChildren(AstVisitor visitor) {
+ fields.accept(visitor);
+ }
+}
+
+class RecordTypeAnnotationPositionalFieldImpl
+ extends RecordTypeAnnotationFieldImpl
+ implements RecordTypeAnnotationPositionalField {
+ @override
+ final Token? name;
+
+ RecordTypeAnnotationPositionalFieldImpl({
+ required super.metadata,
+ required super.type,
+ required this.name,
+ required super.comma,
+ });
+
+ @override
+ E? accept<E>(AstVisitor<E> visitor) {
+ // TODO: implement accept
+ throw UnimplementedError();
+ }
+}
+
/// The invocation of a constructor in the same class from within a
/// constructor's initialization list.
///
diff --git a/pkg/analyzer/lib/src/dart/element/element.dart b/pkg/analyzer/lib/src/dart/element/element.dart
index cf547ee..d98e0e2 100644
--- a/pkg/analyzer/lib/src/dart/element/element.dart
+++ b/pkg/analyzer/lib/src/dart/element/element.dart
@@ -6296,8 +6296,10 @@
class RecordPositionalFieldElementImpl extends RecordFieldElementImpl
implements RecordPositionalFieldElement {
RecordPositionalFieldElementImpl({
+ required super.name,
+ required super.nameOffset,
required super.type,
- }) : super(name: null, nameOffset: -1);
+ });
}
/// A concrete implementation of a [ShowElementCombinator].
diff --git a/pkg/analyzer/test/generated/elements_types_mixin.dart b/pkg/analyzer/test/generated/elements_types_mixin.dart
index a3594b3..592a74d 100644
--- a/pkg/analyzer/test/generated/elements_types_mixin.dart
+++ b/pkg/analyzer/test/generated/elements_types_mixin.dart
@@ -584,6 +584,8 @@
required DartType type,
}) {
return RecordPositionalFieldElementImpl(
+ name: null,
+ nameOffset: -1,
type: type,
);
}