Add visitRecordElement() and friends.

Change-Id: I8323d6c34b27b15f2453642a8f3f64763798c071
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/255580
Reviewed-by: Samuel Rawlins <srawlins@google.com>
Commit-Queue: Konstantin Shcheglov <scheglov@google.com>
diff --git a/pkg/analyzer/lib/dart/element/element.dart b/pkg/analyzer/lib/dart/element/element.dart
index 444e18a..7b0db63 100644
--- a/pkg/analyzer/lib/dart/element/element.dart
+++ b/pkg/analyzer/lib/dart/element/element.dart
@@ -1061,6 +1061,12 @@
 
   R? visitPropertyAccessorElement(PropertyAccessorElement element);
 
+  R? visitRecordElement(RecordElement element);
+
+  R? visitRecordNamedFieldElement(RecordNamedFieldElement element);
+
+  R? visitRecordPositionalFieldElement(RecordPositionalFieldElement element);
+
   R? visitSuperFormalParameterElement(SuperFormalParameterElement element);
 
   R? visitTopLevelVariableElement(TopLevelVariableElement element);
diff --git a/pkg/analyzer/lib/dart/element/visitor.dart b/pkg/analyzer/lib/dart/element/visitor.dart
index c5de555..3d93e15 100644
--- a/pkg/analyzer/lib/dart/element/visitor.dart
+++ b/pkg/analyzer/lib/dart/element/visitor.dart
@@ -196,6 +196,17 @@
       visitVariableElement(element);
 
   @override
+  R? visitRecordElement(RecordElement element) => visitElement(element);
+
+  @override
+  R? visitRecordNamedFieldElement(RecordNamedFieldElement element) =>
+      visitElement(element);
+
+  @override
+  R? visitRecordPositionalFieldElement(RecordPositionalFieldElement element) =>
+      visitElement(element);
+
+  @override
   R? visitSuperFormalParameterElement(SuperFormalParameterElement element) =>
       visitParameterElement(element);
 
@@ -381,6 +392,24 @@
   }
 
   @override
+  R? visitRecordElement(RecordElement element) {
+    element.visitChildren(this);
+    return null;
+  }
+
+  @override
+  R? visitRecordNamedFieldElement(RecordNamedFieldElement element) {
+    element.visitChildren(this);
+    return null;
+  }
+
+  @override
+  R? visitRecordPositionalFieldElement(RecordPositionalFieldElement element) {
+    element.visitChildren(this);
+    return null;
+  }
+
+  @override
   R? visitSuperFormalParameterElement(SuperFormalParameterElement element) {
     element.visitChildren(this);
     return null;
@@ -496,6 +525,16 @@
   R? visitPropertyAccessorElement(PropertyAccessorElement element) => null;
 
   @override
+  R? visitRecordElement(RecordElement element) => null;
+
+  @override
+  R? visitRecordNamedFieldElement(RecordNamedFieldElement element) => null;
+
+  @override
+  R? visitRecordPositionalFieldElement(RecordPositionalFieldElement element) =>
+      null;
+
+  @override
   R? visitSuperFormalParameterElement(SuperFormalParameterElement element) =>
       null;
 
@@ -605,6 +644,17 @@
       _throw(element);
 
   @override
+  R? visitRecordElement(RecordElement element) => _throw(element);
+
+  @override
+  R? visitRecordNamedFieldElement(RecordNamedFieldElement element) =>
+      _throw(element);
+
+  @override
+  R? visitRecordPositionalFieldElement(RecordPositionalFieldElement element) =>
+      _throw(element);
+
+  @override
   R? visitSuperFormalParameterElement(SuperFormalParameterElement element) =>
       _throw(element);
 
diff --git a/pkg/analyzer/lib/src/dart/element/element.dart b/pkg/analyzer/lib/src/dart/element/element.dart
index cbceaa5..b8d7855 100644
--- a/pkg/analyzer/lib/src/dart/element/element.dart
+++ b/pkg/analyzer/lib/src/dart/element/element.dart
@@ -6206,8 +6206,7 @@
 
   @override
   T? accept<T>(ElementVisitor<T> visitor) {
-    // TODO: implement accept
-    throw UnimplementedError();
+    return visitor.visitRecordElement(this);
   }
 
   @override
@@ -6224,6 +6223,13 @@
     );
   }
 
+  @override
+  void visitChildren(ElementVisitor visitor) {
+    super.visitChildren(visitor);
+    safelyVisitChildren(positionalFields, visitor);
+    safelyVisitChildren(namedFields, visitor);
+  }
+
   /// Returns [fields], if already sorted, or the sorted copy.
   static List<RecordNamedFieldElementImpl> _sortNamedFields(
     List<RecordNamedFieldElementImpl> fields,
@@ -6247,7 +6253,7 @@
   }
 }
 
-class RecordFieldElementImpl extends _ExistingElementImpl
+abstract class RecordFieldElementImpl extends _ExistingElementImpl
     implements RecordFieldElement {
   @override
   DartType type;
@@ -6264,12 +6270,6 @@
 
   @override
   ElementKind get kind => ElementKind.RECORD;
-
-  @override
-  T? accept<T>(ElementVisitor<T> visitor) {
-    // TODO: implement accept
-    throw UnimplementedError();
-  }
 }
 
 class RecordNamedFieldElementImpl extends RecordFieldElementImpl
@@ -6282,6 +6282,11 @@
 
   @override
   String get name => super.name!;
+
+  @override
+  T? accept<T>(ElementVisitor<T> visitor) {
+    return visitor.visitRecordNamedFieldElement(this);
+  }
 }
 
 class RecordPositionalFieldElementImpl extends RecordFieldElementImpl
@@ -6291,6 +6296,11 @@
     required super.nameOffset,
     required super.type,
   });
+
+  @override
+  T? accept<T>(ElementVisitor<T> visitor) {
+    return visitor.visitRecordPositionalFieldElement(this);
+  }
 }
 
 /// A concrete implementation of a [ShowElementCombinator].