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,
     );
   }