Update RecursiveTypeVisitor to support RecordType(s).

Change-Id: Ic44d956040144fe56f12637527b49368371c3947
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/255683
Reviewed-by: Phil Quitslund <pquitslund@google.com>
Commit-Queue: Konstantin Shcheglov <scheglov@google.com>
diff --git a/pkg/analyzer/lib/src/dart/element/type_visitor.dart b/pkg/analyzer/lib/src/dart/element/type_visitor.dart
index 5bb9d80..9c628b4 100644
--- a/pkg/analyzer/lib/src/dart/element/type_visitor.dart
+++ b/pkg/analyzer/lib/src/dart/element/type_visitor.dart
@@ -4,6 +4,7 @@
 
 import 'package:analyzer/dart/element/type.dart';
 import 'package:analyzer/dart/element/type_visitor.dart';
+import 'package:analyzer/src/dart/element/type.dart';
 import 'package:analyzer/src/dart/element/type_schema.dart';
 import 'package:analyzer/src/summary2/function_type_builder.dart';
 import 'package:analyzer/src/summary2/named_type_builder.dart';
@@ -53,9 +54,8 @@
       visitChildren(type.typeArguments);
 
   @override
-  bool visitRecordType(RecordType type) {
-    // TODO: implement visitRecordType
-    throw UnimplementedError();
+  bool visitRecordType(covariant RecordTypeImpl type) {
+    return visitChildren(type.fieldTypes);
   }
 
   @override
diff --git a/pkg/analyzer/test/src/dart/element/type_visitor_test.dart b/pkg/analyzer/test/src/dart/element/type_visitor_test.dart
index 09426a5..eb22267 100644
--- a/pkg/analyzer/test/src/dart/element/type_visitor_test.dart
+++ b/pkg/analyzer/test/src/dart/element/type_visitor_test.dart
@@ -9,6 +9,7 @@
 import 'package:test_reflective_loader/test_reflective_loader.dart';
 
 import '../../../generated/type_system_base.dart';
+import 'string_types.dart';
 
 main() {
   defineReflectiveSuite(() {
@@ -17,13 +18,14 @@
 }
 
 @reflectiveTest
-class RecursiveTypeVisitorTest extends AbstractTypeSystemTest {
+class RecursiveTypeVisitorTest extends AbstractTypeSystemTest with StringTypes {
   late final _MockRecursiveVisitor visitor;
 
   @override
   void setUp() {
     super.setUp();
     visitor = _MockRecursiveVisitor();
+    defineStringTypes();
   }
 
   void test_callsDefaultBehavior() {
@@ -117,6 +119,20 @@
     visitor.assertVisitedType(intNone);
   }
 
+  void test_recordType_named() {
+    final type = typeOfString('({int f1, double f2})');
+    expect(type.accept(visitor), true);
+    visitor.assertVisitedType(intNone);
+    visitor.assertVisitedType(doubleNone);
+  }
+
+  void test_recordType_positional() {
+    final type = typeOfString('(int, double)');
+    expect(type.accept(visitor), true);
+    visitor.assertVisitedType(intNone);
+    visitor.assertVisitedType(doubleNone);
+  }
+
   void test_stopVisiting_first() {
     final T = typeParameter('T', bound: intNone);
     final K = typeParameter('K', bound: stringNone);