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'); + } + } +}