Stop using DartType.displayName, regenerate.

Preparation for https://dart-review.googlesource.com/c/sdk/+/251783

Is this tool still used? I noticed that even when I re-generated
with a clean workspace, it still had a lot of changes.

Change-Id: I901ada1e6ad1d989b15882d9cf8ef83762fa8828
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/251784
Commit-Queue: Konstantin Shcheglov <scheglov@google.com>
Reviewed-by: Ryan Macnak <rmacnak@google.com>
diff --git a/runtime/tools/dartfuzz/gen_api_table.dart b/runtime/tools/dartfuzz/gen_api_table.dart
index c7f55a0..79b157c 100644
--- a/runtime/tools/dartfuzz/gen_api_table.dart
+++ b/runtime/tools/dartfuzz/gen_api_table.dart
@@ -482,7 +482,7 @@
   // Supertypes or type parameters are specialized in a consistent manner.
   // TODO(ajcbik): inspect type structure semantically, not by display name
   //               and unify DartFuzz's DartType with analyzer DartType.
-  switch (type.displayName) {
+  switch (type.asCode) {
     case 'AbstractClassInstantiationError':
       return abstractClassInstantiationErrorEncoding;
     case 'ArgumentError':
diff --git a/runtime/tools/dartfuzz/gen_type_table.dart b/runtime/tools/dartfuzz/gen_type_table.dart
index da456c5..2e7f683 100644
--- a/runtime/tools/dartfuzz/gen_type_table.dart
+++ b/runtime/tools/dartfuzz/gen_type_table.dart
@@ -122,6 +122,8 @@
   return constName;
 }
 
+String typeConstName(DartType tp) => getConstName(tp.asCode);
+
 // Returns true if the given type fails the filter criteria.
 bool shouldFilterType(String typName, {bool fp = true, bool flatTp = false}) {
   if (!fp && fpTypes.contains(typName)) {
@@ -694,13 +696,13 @@
   // Generate one static DartType instance for all instantiable types.
   // TODO (felih): maybe add void type?
   allTypes.forEach((baseType) {
-    var constName = getConstName(baseType.displayName);
+    var constName = typeConstName(baseType);
     instTypes.add(constName);
     if (!subclass) {
       print('  static const $constName = '
-          "DartType._withName('${baseType.displayName}', false);");
+          "DartType._withName('${baseType.asCode}', false);");
       print('  static const ${constName}_NULLABLE = '
-          "DartType._withName('${baseType.displayName}', true);");
+          "DartType._withName('${baseType.asCode}', true);");
     }
   });
 
@@ -896,7 +898,7 @@
 // See comment on filterOpterator.
 void filterOperators(Set<InterfaceType> allTypes) {
   for (var tp in allTypes) {
-    var typName = getConstName(tp.displayName);
+    var typName = typeConstName(tp);
     if (!binOps.containsKey(typName)) continue;
     for (var op in binOps[typName]!.keys) {
       binOps[typName]![op] = filterOperator(binOps[typName]![op]!);
@@ -911,8 +913,8 @@
 bool isExcludedMethod(InterfaceType tp, MethodElement method) {
   // TODO(bkonyi): Enable operator / for these types after we resolve
   // https://github.com/dart-lang/sdk/issues/39890
-  if (((tp.displayName == 'Float32x4') && (method.name == '/')) ||
-      ((tp.displayName == 'Float64x2') && (method.name == '/'))) {
+  if (((tp.element.name == 'Float32x4') && (method.name == '/')) ||
+      ((tp.element.name == 'Float64x2') && (method.name == '/'))) {
     return true;
   }
   return false;
@@ -935,7 +937,7 @@
     // 'castFrom' or 'parse'.
     if (method.isStatic &&
         (method.name == 'castFrom' || method.name == 'parse')) {
-      fromLiteral.add(getConstName(tp.displayName));
+      fromLiteral.add(typeConstName(tp));
     }
     // Hack: dartfuzz.dart already handles subscripts, therefore we exclude
     // them from the generated type table.
@@ -944,7 +946,7 @@
       // TODO (felih): Include support for type 'dynamic'.
       var skip = false;
       for (var p in method.parameters) {
-        if (getConstName(p.type.displayName) == 'DYNAMIC') {
+        if (typeConstName(p.type) == 'DYNAMIC') {
           skip = true;
           break;
         }
@@ -953,14 +955,14 @@
       if (method.parameters.length == 1) {
         // Get binary operators.
 
-        var retTypName = getConstName(method.returnType.displayName);
+        var retTypName = typeConstName(method.returnType);
         if (method.returnType.nullabilitySuffix != NullabilitySuffix.none) {
           retTypName += '_NULLABLE';
         }
         binOps[retTypName] ??= <String, Set<List<String>>>{};
         binOps[retTypName]![method.name] ??= <List<String>>{};
 
-        var rhsTypName = getConstName(method.parameters[0].type.displayName);
+        var rhsTypName = typeConstName(method.parameters[0].type);
         if (method.parameters[0].type.nullabilitySuffix !=
             NullabilitySuffix.none) {
           rhsTypName += '_NULLABLE';
@@ -1007,7 +1009,7 @@
   // The analyzer's DartType doesn't provide conversions to change nullability.
   // Comparing by name isn't correct in general, but it works for the core
   // libraries because there are no simple name conflicts.
-  return a.displayName == b.displayName;
+  return a.asCode == b.asCode;
 }
 
 // Extract all binary and unary operators for all types.
@@ -1023,7 +1025,7 @@
   fromLiteral.add('STRING');
   // Get binary, unary and assignment operators.
   for (var tp in allTypes) {
-    var typName = getConstName(tp.displayName);
+    var typName = typeConstName(tp);
     // Manually add basic assignment operators which each type supports.
     assignOps[typName] ??= <String, Set<String>>{};
     assignOps[typName]!['='] = {typName};
@@ -1063,7 +1065,7 @@
 
   // Get constructors.
   for (var tp in allTypes) {
-    var typName = getConstName(tp.displayName);
+    var typName = typeConstName(tp);
     // Skip types that are constructable from a literal.
     if (fromLiteral.contains(typName)) {
       continue;
@@ -1073,7 +1075,7 @@
       var params = <String>[];
       var canConstruct = true;
       for (var p in constructor.parameters) {
-        var tstr = getConstName(p.type.displayName);
+        var tstr = typeConstName(p.type);
         if (tstr == 'DYNAMIC' || tstr == 'OBJECT') {
           tstr = 'INT';
         } else if (!allTypes
@@ -1105,7 +1107,7 @@
   // Constructor exclude list
   // TODO(bkonyi): Enable Float32x4.fromInt32x4Bits after we resolve
   // https://github.com/dart-lang/sdk/issues/39890
-  if ((tp.displayName == 'Float32x4') && (cons.name == 'fromInt32x4Bits')) {
+  if ((tp.element.name == 'Float32x4') && (cons.name == 'fromInt32x4Bits')) {
     return true;
   }
   return false;
@@ -1116,17 +1118,17 @@
 void analyzeTypes(Set<InterfaceType> allTypes) {
   // Extract basic floating point types.
   for (var tp in allTypes) {
-    if (tp.displayName.contains('Float') ||
-        tp.displayName.contains('float') ||
-        tp.displayName.contains('double') ||
-        tp.displayName.contains('Double')) {
-      fpTypes.add(getConstName(tp.displayName));
+    if (tp.asCode.contains('Float') ||
+        tp.asCode.contains('float') ||
+        tp.asCode.contains('double') ||
+        tp.asCode.contains('Double')) {
+      fpTypes.add(typeConstName(tp));
     }
   }
 
   // Analyze all types to extract information useful for dart code generation.
   for (var tp in allTypes) {
-    final typName = getConstName(tp.displayName);
+    final typName = typeConstName(tp);
 
     // Find topmost interface type, e.g. List<int> is interface for Int8List.
     var iTyp = tp;
@@ -1141,7 +1143,7 @@
 
     if (iTyp.typeArguments.length == 1) {
       // Analyze Array, List and Set types.
-      var argName = getConstName(iTyp.typeArguments[0].displayName);
+      var argName = typeConstName(iTyp.typeArguments[0]);
       subscriptsTo[typName] = argName;
       elementOf[argName] ??= <String>{};
       elementOf[argName]!.add(typName);
@@ -1158,8 +1160,8 @@
     } else if (iTyp.typeArguments.length == 2) {
       if (isIndexable(iTyp)) {
         // Analyze Map and MapEntry types.
-        var argName0 = getConstName(iTyp.typeArguments[0].displayName);
-        var argName1 = getConstName(iTyp.typeArguments[1].displayName);
+        var argName0 = typeConstName(iTyp.typeArguments[0]);
+        var argName1 = typeConstName(iTyp.typeArguments[1]);
         subscriptsTo[typName] = argName1;
         elementOf[argName1] ??= <String>{};
         elementOf[argName1]!.add(typName);
@@ -1235,7 +1237,7 @@
       );
       newITypes.add(ptx);
       if (iType.typeArguments.isNotEmpty) {
-        complexTypes.add(getConstName(ptx.displayName));
+        complexTypes.add(typeConstName(ptx));
       }
     });
   });
@@ -1257,7 +1259,7 @@
         newITypes.add(ptx);
         if (iType1.typeArguments.isNotEmpty ||
             iType2.typeArguments.isNotEmpty) {
-          complexTypes.add(getConstName(ptx.displayName));
+          complexTypes.add(typeConstName(ptx));
         }
       });
     });
@@ -1284,7 +1286,7 @@
   // complex types like Int8List.
   var filteredITypes = <InterfaceType>{};
   for (var iType in iTypes) {
-    if (iTypeFilter.contains(iType.displayName)) {
+    if (iTypeFilter.contains(iType.element.name)) {
       filteredITypes.add(iType);
     }
   }
@@ -1409,7 +1411,7 @@
 Set<String> getInterfaces(InterfaceType tp) {
   var iTypes = <String>{};
   for (var iTyp in tp.interfaces) {
-    var ifTypName = getConstName(iTyp.displayName);
+    var ifTypName = typeConstName(iTyp);
     iTypes.add(ifTypName);
     iTypes = iTypes.union(getInterfaces(iTyp));
   }
@@ -1419,7 +1421,7 @@
 // Get interface and inheritance relationships for all types.
 void getInterfaceRels(Set<InterfaceType> allTypes) {
   for (var tp in allTypes) {
-    var typName = getConstName(tp.displayName);
+    var typName = typeConstName(tp);
     for (var ifTypName in getInterfaces(tp)) {
       interfaceRels[ifTypName] ??= <String>{};
       interfaceRels[ifTypName]!.add(typName);
@@ -1428,7 +1430,7 @@
       }
     }
     for (var it in tp.element.allSupertypes) {
-      var ifTypName = getConstName(it.displayName);
+      var ifTypName = typeConstName(it);
       interfaceRels[ifTypName] ??= <String>{};
       interfaceRels[ifTypName]!.add(typName);
     }
@@ -1438,7 +1440,7 @@
   // do tp1 = oneof(interfaceRels[tp2]) in dartfuzz with a chance of
   // tp1 == tp1.
   for (var tp in allTypes) {
-    var typName = getConstName(tp.displayName);
+    var typName = typeConstName(tp);
     if (interfaceRels.containsKey(typName)) {
       interfaceRels[typName]!.add(typName);
     }
diff --git a/runtime/tools/dartfuzz/gen_util.dart b/runtime/tools/dartfuzz/gen_util.dart
index f27f17c..19446f9 100644
--- a/runtime/tools/dartfuzz/gen_util.dart
+++ b/runtime/tools/dartfuzz/gen_util.dart
@@ -5,6 +5,7 @@
 import 'dart:io';
 
 import 'package:analyzer/dart/analysis/session.dart';
+import 'package:analyzer/dart/element/type.dart';
 import 'package:analyzer/file_system/physical_file_system.dart';
 import 'package:analyzer/src/dart/analysis/analysis_context_collection.dart';
 
@@ -46,3 +47,33 @@
     return collection.contexts[0].currentSession;
   }
 }
+
+extension DartTypeExtension on DartType {
+  /// Returns an approximation of the [DartType] code, suitable for this tool.
+  String get asCode {
+    final type = this;
+    if (type is DynamicType) {
+      return 'dynamic';
+    } else if (type is FunctionType) {
+      final parameters = type.parameters.map((e) => e.type.asCode);
+      return type.returnType.asCode + ' Function($parameters)';
+    } else if (type is InterfaceType) {
+      final typeArguments = type.typeArguments;
+      if (typeArguments.isEmpty ||
+          typeArguments.every((t) => t is DynamicType)) {
+        return type.element.name;
+      } else {
+        final typeArgumentsStr = typeArguments.map((t) => t.asCode).join(', ');
+        return '${type.element.name}<$typeArgumentsStr>';
+      }
+    } else if (type is NeverType) {
+      return 'Never';
+    } else if (type is TypeParameterType) {
+      return type.element.name;
+    } else if (type is VoidType) {
+      return 'void';
+    } else {
+      throw UnimplementedError('(${type.runtimeType}) $type');
+    }
+  }
+}