[kernel] Remove CoreTypes from legacyErasure

Change-Id: I9692c01ed3bf9982834144dd9eb477a97db5536f
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/175041
Reviewed-by: Dmitry Stefantsov <dmitryas@google.com>
Commit-Queue: Johnni Winther <johnniwinther@google.com>
diff --git a/pkg/front_end/lib/src/fasta/builder/field_builder.dart b/pkg/front_end/lib/src/fasta/builder/field_builder.dart
index eb037e7..833753c 100644
--- a/pkg/front_end/lib/src/fasta/builder/field_builder.dart
+++ b/pkg/front_end/lib/src/fasta/builder/field_builder.dart
@@ -429,8 +429,7 @@
       // `fieldType` may have changed if a circularity was detected when
       // [inferredType] was computed.
       if (!library.isNonNullableByDefault) {
-        inferredType = legacyErasure(
-            library.loader.typeInferenceEngine.coreTypes, inferredType);
+        inferredType = legacyErasure(inferredType);
       }
       fieldType = implicitFieldType.checkInferred(inferredType);
 
diff --git a/pkg/front_end/lib/src/fasta/kernel/class_hierarchy_builder.dart b/pkg/front_end/lib/src/fasta/kernel/class_hierarchy_builder.dart
index 5c5223c..d56fa0d 100644
--- a/pkg/front_end/lib/src/fasta/kernel/class_hierarchy_builder.dart
+++ b/pkg/front_end/lib/src/fasta/kernel/class_hierarchy_builder.dart
@@ -1265,7 +1265,7 @@
             norm(hierarchy.coreTypes, inheritedType));
       }
     } else {
-      inheritedType = legacyErasure(hierarchy.coreTypes, inheritedType);
+      inheritedType = legacyErasure(inheritedType);
       if (inferredType == null) {
         return inheritedType;
       } else {
@@ -1703,8 +1703,7 @@
       if (!classBuilder.library.isNonNullableByDefault &&
           supernode.classBuilder.library.isNonNullableByDefault) {
         for (int i = 0; i < superclasses.length; i++) {
-          superclasses[i] =
-              legacyErasureSupertype(hierarchy.coreTypes, superclasses[i]);
+          superclasses[i] = legacyErasureSupertype(superclasses[i]);
         }
       }
 
@@ -2377,7 +2376,7 @@
       Supertype type) {
     if (type == null) return null;
     if (!classBuilder.library.isNonNullableByDefault) {
-      type = legacyErasureSupertype(hierarchy.coreTypes, type);
+      type = legacyErasureSupertype(type);
     }
     ClassHierarchyNode node = hierarchy.getNodeFromClass(type.classNode);
     if (node == null) return null;
diff --git a/pkg/front_end/lib/src/fasta/kernel/combined_member_signature.dart b/pkg/front_end/lib/src/fasta/kernel/combined_member_signature.dart
index 1478cf0..c97fc4e 100644
--- a/pkg/front_end/lib/src/fasta/kernel/combined_member_signature.dart
+++ b/pkg/front_end/lib/src/fasta/kernel/combined_member_signature.dart
@@ -301,7 +301,7 @@
           "No member computed for index ${index} in ${members}");
       candidateType = _computeMemberType(thisType, target);
       if (!classBuilder.library.isNonNullableByDefault) {
-        DartType legacyErasure = rawLegacyErasure(_coreTypes, candidateType);
+        DartType legacyErasure = rawLegacyErasure(candidateType);
         if (legacyErasure != null) {
           _neededLegacyErasureIndices ??= {};
           _neededLegacyErasureIndices.add(index);
diff --git a/pkg/front_end/lib/src/fasta/kernel/constant_evaluator.dart b/pkg/front_end/lib/src/fasta/kernel/constant_evaluator.dart
index 1d4af85..ed46fca 100644
--- a/pkg/front_end/lib/src/fasta/kernel/constant_evaluator.dart
+++ b/pkg/front_end/lib/src/fasta/kernel/constant_evaluator.dart
@@ -174,8 +174,6 @@
 
   ConstantWeakener(this._evaluator);
 
-  CoreTypes get _coreTypes => _evaluator.coreTypes;
-
   Constant processValue(Constant node, Constant value) {
     if (value != null) {
       value = _evaluator.canonicalize(value);
@@ -207,8 +205,8 @@
 
   @override
   Constant visitMapConstant(MapConstant node) {
-    DartType keyType = rawLegacyErasure(_coreTypes, node.keyType);
-    DartType valueType = rawLegacyErasure(_coreTypes, node.valueType);
+    DartType keyType = rawLegacyErasure(node.keyType);
+    DartType valueType = rawLegacyErasure(node.valueType);
     List<ConstantMapEntry> entries;
     for (int index = 0; index < node.entries.length; index++) {
       ConstantMapEntry entry = node.entries[index];
@@ -229,7 +227,7 @@
 
   @override
   Constant visitListConstant(ListConstant node) {
-    DartType typeArgument = rawLegacyErasure(_coreTypes, node.typeArgument);
+    DartType typeArgument = rawLegacyErasure(node.typeArgument);
     List<Constant> entries;
     for (int index = 0; index < node.entries.length; index++) {
       Constant entry = visitConstant(node.entries[index]);
@@ -247,7 +245,7 @@
 
   @override
   Constant visitSetConstant(SetConstant node) {
-    DartType typeArgument = rawLegacyErasure(_coreTypes, node.typeArgument);
+    DartType typeArgument = rawLegacyErasure(node.typeArgument);
     List<Constant> entries;
     for (int index = 0; index < node.entries.length; index++) {
       Constant entry = visitConstant(node.entries[index]);
@@ -267,8 +265,7 @@
   Constant visitInstanceConstant(InstanceConstant node) {
     List<DartType> typeArguments;
     for (int index = 0; index < node.typeArguments.length; index++) {
-      DartType typeArgument =
-          rawLegacyErasure(_coreTypes, node.typeArguments[index]);
+      DartType typeArgument = rawLegacyErasure(node.typeArguments[index]);
       if (typeArgument != null) {
         typeArguments ??= node.typeArguments.toList(growable: false);
         typeArguments[index] = typeArgument;
@@ -294,7 +291,7 @@
       PartialInstantiationConstant node) {
     List<DartType> types;
     for (int index = 0; index < node.types.length; index++) {
-      DartType type = rawLegacyErasure(_coreTypes, node.types[index]);
+      DartType type = rawLegacyErasure(node.types[index]);
       if (type != null) {
         types ??= node.types.toList(growable: false);
         types[index] = type;
@@ -311,7 +308,7 @@
 
   @override
   Constant visitTypeLiteralConstant(TypeLiteralConstant node) {
-    DartType type = rawLegacyErasure(_coreTypes, node.type);
+    DartType type = rawLegacyErasure(node.type);
     if (type != null) {
       return new TypeLiteralConstant(type);
     }
@@ -840,7 +837,7 @@
       case EvaluationMode.agnostic:
         return type;
       case EvaluationMode.weak:
-        return legacyErasure(coreTypes, type);
+        return legacyErasure(type);
     }
     throw new UnsupportedError(
         "Unexpected evaluation mode: ${evaluationMode}.");
@@ -852,9 +849,7 @@
       case EvaluationMode.agnostic:
         return types;
       case EvaluationMode.weak:
-        return types
-            .map((DartType type) => legacyErasure(coreTypes, type))
-            .toList();
+        return types.map((DartType type) => legacyErasure(type)).toList();
     }
     throw new UnsupportedError(
         "Unexpected evaluation mode: ${evaluationMode}.");
@@ -2608,7 +2603,7 @@
   bool isSubtype(Constant constant, DartType type, SubtypeCheckMode mode) {
     DartType constantType = constant.getType(_staticTypeContext);
     if (mode == SubtypeCheckMode.ignoringNullabilities) {
-      constantType = rawLegacyErasure(coreTypes, constantType) ?? constantType;
+      constantType = rawLegacyErasure(constantType) ?? constantType;
     }
     bool result = typeEnvironment.isSubtypeOf(constantType, type, mode);
     if (targetingJavaScript && !result) {
diff --git a/pkg/front_end/lib/src/fasta/kernel/implicit_field_type.dart b/pkg/front_end/lib/src/fasta/kernel/implicit_field_type.dart
index 971b0e5..a636968 100644
--- a/pkg/front_end/lib/src/fasta/kernel/implicit_field_type.dart
+++ b/pkg/front_end/lib/src/fasta/kernel/implicit_field_type.dart
@@ -112,8 +112,7 @@
       for (ImplicitFieldType overridden in _overriddenFields) {
         DartType overriddenType = overridden.inferType();
         if (!fieldBuilder.library.isNonNullableByDefault) {
-          overriddenType = legacyErasure(
-              fieldBuilder.library.loader.coreTypes, overriddenType);
+          overriddenType = legacyErasure(overriddenType);
         }
         if (inferredType == null) {
           inferredType = overriddenType;
@@ -166,8 +165,7 @@
       for (ImplicitFieldType overridden in _overriddenFields) {
         DartType overriddenType = overridden.inferType();
         if (!fieldBuilder.library.isNonNullableByDefault) {
-          overriddenType = legacyErasure(
-              fieldBuilder.library.loader.coreTypes, overriddenType);
+          overriddenType = legacyErasure(overriddenType);
         }
         if (type != overriddenType) {
           String name = fieldBuilder.fullNameForErrors;
diff --git a/pkg/front_end/lib/src/fasta/kernel/inference_visitor.dart b/pkg/front_end/lib/src/fasta/kernel/inference_visitor.dart
index de26ae2..360130c 100644
--- a/pkg/front_end/lib/src/fasta/kernel/inference_visitor.dart
+++ b/pkg/front_end/lib/src/fasta/kernel/inference_visitor.dart
@@ -3837,7 +3837,7 @@
     }
 
     if (!inferrer.isNonNullableByDefault) {
-      binaryType = legacyErasure(inferrer.coreTypes, binaryType);
+      binaryType = legacyErasure(binaryType);
     }
 
     if (!inferrer.isTopLevel && binaryTarget.isNullable) {
@@ -3934,7 +3934,7 @@
     }
 
     if (!inferrer.isNonNullableByDefault) {
-      unaryType = legacyErasure(inferrer.coreTypes, unaryType);
+      unaryType = legacyErasure(unaryType);
     }
 
     if (!inferrer.isTopLevel && unaryTarget.isNullable) {
@@ -4022,7 +4022,7 @@
     }
 
     if (!inferrer.isNonNullableByDefault) {
-      readType = legacyErasure(inferrer.coreTypes, readType);
+      readType = legacyErasure(readType);
     }
 
     if (!inferrer.isTopLevel && readTarget.isNullable) {
@@ -4220,7 +4220,7 @@
     }
 
     if (!inferrer.isNonNullableByDefault) {
-      readType = legacyErasure(inferrer.coreTypes, readType);
+      readType = legacyErasure(readType);
     }
 
     readResult ??= new ExpressionInferenceResult(readType, read);
@@ -5275,7 +5275,7 @@
     DartType type = target.getterType;
 
     if (!inferrer.isNonNullableByDefault) {
-      type = legacyErasure(inferrer.coreTypes, type);
+      type = legacyErasure(type);
     }
 
     if (target is Procedure && target.kind == ProcedureKind.Method) {
diff --git a/pkg/front_end/lib/src/fasta/source/source_class_builder.dart b/pkg/front_end/lib/src/fasta/source/source_class_builder.dart
index 8536d8c..b2645dd 100644
--- a/pkg/front_end/lib/src/fasta/source/source_class_builder.dart
+++ b/pkg/front_end/lib/src/fasta/source/source_class_builder.dart
@@ -1234,8 +1234,7 @@
           }
           DartType computedBound = substitution.substituteType(interfaceBound);
           if (!library.isNonNullableByDefault) {
-            computedBound =
-                legacyErasure(types.hierarchy.coreTypes, computedBound);
+            computedBound = legacyErasure(computedBound);
           }
           if (!types
               .performNullabilityAwareMutualSubtypesCheck(
@@ -1305,7 +1304,7 @@
 
     if (!declaredMember.isNonNullableByDefault &&
         interfaceMember.isNonNullableByDefault) {
-      interfaceType = legacyErasure(types.hierarchy.coreTypes, interfaceType);
+      interfaceType = legacyErasure(interfaceType);
     }
 
     bool inParameter = declaredParameter != null || asIfDeclaredParameter;
diff --git a/pkg/front_end/lib/src/fasta/type_inference/type_inferrer.dart b/pkg/front_end/lib/src/fasta/type_inference/type_inferrer.dart
index d6ef112..43f7c3d 100644
--- a/pkg/front_end/lib/src/fasta/type_inference/type_inferrer.dart
+++ b/pkg/front_end/lib/src/fasta/type_inference/type_inferrer.dart
@@ -1985,7 +1985,7 @@
       typeSchemaEnvironment.inferGenericFunctionOrType(
           isNonNullableByDefault
               ? calleeType.returnType
-              : legacyErasure(coreTypes, calleeType.returnType),
+              : legacyErasure(calleeType.returnType),
           calleeTypeParameters,
           null,
           null,
@@ -2034,14 +2034,14 @@
             arguments.positional[position],
             isNonNullableByDefault
                 ? inferredFormalType
-                : legacyErasure(coreTypes, inferredFormalType),
+                : legacyErasure(inferredFormalType),
             inferenceNeeded ||
                 isSpecialCasedBinaryOperator ||
                 isSpecialCasedTernaryOperator ||
                 typeChecksNeeded);
         inferredType = result.inferredType == null || isNonNullableByDefault
             ? result.inferredType
-            : legacyErasure(coreTypes, result.inferredType);
+            : legacyErasure(result.inferredType);
         Expression expression =
             _hoist(result.expression, inferredType, hoistedExpressions);
         arguments.positional[position] = expression..parent = arguments;
@@ -2073,12 +2073,12 @@
           namedArgument.value,
           isNonNullableByDefault
               ? inferredFormalType
-              : legacyErasure(coreTypes, inferredFormalType),
+              : legacyErasure(inferredFormalType),
           inferenceNeeded || isSpecialCasedBinaryOperator || typeChecksNeeded);
       DartType inferredType =
           result.inferredType == null || isNonNullableByDefault
               ? result.inferredType
-              : legacyErasure(coreTypes, result.inferredType);
+              : legacyErasure(result.inferredType);
       Expression expression =
           _hoist(result.expression, inferredType, hoistedExpressions);
       namedArgument.value = expression..parent = namedArgument;
@@ -2216,7 +2216,7 @@
         "Inferred function type: $calleeType.");
 
     if (!isNonNullableByDefault) {
-      inferredType = legacyErasure(coreTypes, inferredType);
+      inferredType = legacyErasure(inferredType);
     }
 
     return new SuccessfulInferenceResult(inferredType);
diff --git a/pkg/kernel/lib/class_hierarchy.dart b/pkg/kernel/lib/class_hierarchy.dart
index d14cfc3..fcec1e6 100644
--- a/pkg/kernel/lib/class_hierarchy.dart
+++ b/pkg/kernel/lib/class_hierarchy.dart
@@ -694,8 +694,8 @@
             : Substitution.fromInterfaceType(type2).substituteType(
                 info2.genericSuperType[next.classNode].asInterfaceType);
         if (!clientLibrary.isNonNullableByDefault) {
-          superType1 = legacyErasure(coreTypes, superType1);
-          superType2 = legacyErasure(coreTypes, superType2);
+          superType1 = legacyErasure(superType1);
+          superType2 = legacyErasure(superType2);
         }
         if (superType1 == superType2) {
           candidate = superType1.withDeclaredNullability(
@@ -1657,7 +1657,7 @@
     Supertype canonical = genericSuperType[cls];
     if (canonical == null) {
       if (!classNode.enclosingLibrary.isNonNullableByDefault) {
-        canonical = legacyErasureSupertype(coreTypes, type);
+        canonical = legacyErasureSupertype(type);
       } else {
         canonical = type;
       }
@@ -1679,7 +1679,7 @@
           genericSuperType[cls] = result;
         }
       } else {
-        type = legacyErasureSupertype(coreTypes, type);
+        type = legacyErasureSupertype(type);
         if (type != canonical) {
           onAmbiguousSupertypes(classNode, canonical, type);
         }
diff --git a/pkg/kernel/lib/src/bounds_checks.dart b/pkg/kernel/lib/src/bounds_checks.dart
index 00763ee..c9aecc6 100644
--- a/pkg/kernel/lib/src/bounds_checks.dart
+++ b/pkg/kernel/lib/src/bounds_checks.dart
@@ -345,7 +345,7 @@
     } else if (variables[i].bound is! InvalidType) {
       DartType bound = substitute(variables[i].bound, substitutionMap);
       if (!library.isNonNullableByDefault) {
-        bound = legacyErasure(typeEnvironment.coreTypes, bound);
+        bound = legacyErasure(bound);
       }
       if (!typeEnvironment.isSubtypeOf(argument, bound, subtypeCheckMode)) {
         // If the bound is InvalidType it's not checked, because an error was
@@ -454,7 +454,7 @@
     } else if (parameters[i].bound is! InvalidType) {
       DartType bound = substitute(parameters[i].bound, substitutionMap);
       if (!library.isNonNullableByDefault) {
-        bound = legacyErasure(typeEnvironment.coreTypes, bound);
+        bound = legacyErasure(bound);
       }
       if (!typeEnvironment.isSubtypeOf(argument, bound, subtypeCheckMode)) {
         result ??= <TypeArgumentIssue>[];
diff --git a/pkg/kernel/lib/src/legacy_erasure.dart b/pkg/kernel/lib/src/legacy_erasure.dart
index 83c32ce..3628368 100644
--- a/pkg/kernel/lib/src/legacy_erasure.dart
+++ b/pkg/kernel/lib/src/legacy_erasure.dart
@@ -3,15 +3,14 @@
 // BSD-style license that can be found in the LICENSE.md file.
 
 import '../ast.dart' hide MapEntry;
-import '../core_types.dart';
 
 import 'replacement_visitor.dart';
 
 /// Returns legacy erasure of [type], that is, the type in which all nnbd
 /// nullabilities have been replaced with legacy nullability, and all required
 /// named parameters are not required.
-DartType legacyErasure(CoreTypes coreTypes, DartType type) {
-  return rawLegacyErasure(coreTypes, type) ?? type;
+DartType legacyErasure(DartType type) {
+  return rawLegacyErasure(type) ?? type;
 }
 
 /// Returns legacy erasure of [type], that is, the type in which all nnbd
@@ -19,22 +18,21 @@
 /// named parameters are not required.
 ///
 /// Returns `null` if the type wasn't changed.
-DartType rawLegacyErasure(CoreTypes coreTypes, DartType type) {
-  return type.accept(new _LegacyErasure(coreTypes));
+DartType rawLegacyErasure(DartType type) {
+  return type.accept(const _LegacyErasure());
 }
 
 /// Returns legacy erasure of [supertype], that is, the type in which all nnbd
 /// nullabilities have been replaced with legacy nullability, and all required
 /// named parameters are not required.
-Supertype legacyErasureSupertype(CoreTypes coreTypes, Supertype supertype) {
+Supertype legacyErasureSupertype(Supertype supertype) {
   if (supertype.typeArguments.isEmpty) {
     return supertype;
   }
   List<DartType> newTypeArguments;
   for (int i = 0; i < supertype.typeArguments.length; i++) {
     DartType typeArgument = supertype.typeArguments[i];
-    DartType newTypeArgument =
-        typeArgument.accept(new _LegacyErasure(coreTypes));
+    DartType newTypeArgument = typeArgument.accept(const _LegacyErasure());
     if (newTypeArgument != null) {
       newTypeArguments ??= supertype.typeArguments.toList(growable: false);
       newTypeArguments[i] = newTypeArgument;
@@ -51,9 +49,7 @@
 ///
 /// The visitor returns `null` if the type wasn't changed.
 class _LegacyErasure extends ReplacementVisitor {
-  final CoreTypes coreTypes;
-
-  _LegacyErasure(this.coreTypes);
+  const _LegacyErasure();
 
   Nullability visitNullability(DartType node) {
     if (node.declaredNullability != Nullability.legacy) {
diff --git a/pkg/kernel/lib/src/standard_bounds.dart b/pkg/kernel/lib/src/standard_bounds.dart
index 64a1755..92fb5ee 100644
--- a/pkg/kernel/lib/src/standard_bounds.dart
+++ b/pkg/kernel/lib/src/standard_bounds.dart
@@ -271,9 +271,7 @@
           type1, type2, clientLibrary);
     }
     return _getNullabilityObliviousStandardLowerBound(
-        legacyErasure(coreTypes, type1),
-        legacyErasure(coreTypes, type2),
-        clientLibrary);
+        legacyErasure(type1), legacyErasure(type2), clientLibrary);
   }
 
   DartType _getNullabilityAwareStandardLowerBound(
@@ -594,9 +592,7 @@
           type1, type2, clientLibrary);
     }
     return _getNullabilityObliviousStandardUpperBound(
-        legacyErasure(coreTypes, type1),
-        legacyErasure(coreTypes, type2),
-        clientLibrary);
+        legacyErasure(type1), legacyErasure(type2), clientLibrary);
   }
 
   DartType _getNullabilityAwareStandardUpperBound(
diff --git a/pkg/kernel/test/legacy_erasure_test.dart b/pkg/kernel/test/legacy_erasure_test.dart
index 4f82dea..0a0902b 100644
--- a/pkg/kernel/test/legacy_erasure_test.dart
+++ b/pkg/kernel/test/legacy_erasure_test.dart
@@ -58,7 +58,7 @@
   data.forEach((String input, String output) {
     DartType inputType = env.parseType(input);
     DartType expectedOutputType = env.parseType(output);
-    DartType actualOutputType = legacyErasure(env.coreTypes, inputType);
+    DartType actualOutputType = legacyErasure(inputType);
     print('legacyErasure($inputType) = $actualOutputType: $expectedOutputType');
     Expect.equals(
         expectedOutputType,