Copy inferred mixin application type arguments to builder hierarchy

Change-Id: I31e6e6e6d71fc7d3995c83ac3b11a03153d565a6
Reviewed-on: https://dart-review.googlesource.com/c/92124
Reviewed-by: Dmitry Stefantsov <dmitryas@google.com>
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 ffa3e69..c9fde87 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
@@ -766,18 +766,24 @@
   void inferMixinApplication() {
     if (!hierarchy.loader.target.backendTarget.legacyMode) return;
     Class kernelClass = cls.target;
-    Supertype mixedInType = kernelClass.mixedInType;
-    if (mixedInType == null) return;
-    List<DartType> typeArguments = mixedInType.typeArguments;
+    Supertype kernelMixedInType = kernelClass.mixedInType;
+    if (kernelMixedInType == null) return;
+    List<DartType> typeArguments = kernelMixedInType.typeArguments;
     if (typeArguments.isEmpty || typeArguments.first is! UnknownType) return;
-    // TODO(ahe): We need to copy the inferred Kernel type arguments to the
-    // ClassBuilder.
     new BuilderMixinInferrer(
             cls,
             hierarchy.coreTypes,
             new TypeBuilderConstraintGatherer(
-                hierarchy, mixedInType.classNode.typeParameters))
+                hierarchy, kernelMixedInType.classNode.typeParameters))
         .infer(kernelClass);
+    List<KernelTypeBuilder> inferredArguments =
+        new List<KernelTypeBuilder>(typeArguments.length);
+    for (int i = 0; i < typeArguments.length; i++) {
+      inferredArguments[i] =
+          hierarchy.loader.computeTypeBuilder(typeArguments[i]);
+    }
+    KernelNamedTypeBuilder mixedInType = cls.mixedInType;
+    mixedInType.arguments = inferredArguments;
   }
 }
 
diff --git a/pkg/front_end/testcases/inference/mixin_inference_instantiate_to_bounds_1.dart.hierarchy.expect b/pkg/front_end/testcases/inference/mixin_inference_instantiate_to_bounds_1.dart.hierarchy.expect
index 86c098f..06b9b49 100644
--- a/pkg/front_end/testcases/inference/mixin_inference_instantiate_to_bounds_1.dart.hierarchy.expect
+++ b/pkg/front_end/testcases/inference/mixin_inference_instantiate_to_bounds_1.dart.hierarchy.expect
@@ -82,11 +82,11 @@
     Object.==
   interfaceSetters:
 
-M1 with M0:
+M1 with M0<int, String>:
   superclasses:
     Object
       -> M1
-  interfaces: I<int>, M0
+  interfaces: I<int>, M0<int, String>
   classMembers:
     Object.toString
     Object.runtimeType
@@ -117,7 +117,7 @@
     Object
       -> M1
         -> _A&M1&M0
-  interfaces: I<int>, M0
+  interfaces: I<int>, M0<int, String>
   classMembers:
     Object.toString
     Object.runtimeType
diff --git a/pkg/front_end/testcases/inference/mixin_inference_instantiate_to_bounds_2.dart.hierarchy.expect b/pkg/front_end/testcases/inference/mixin_inference_instantiate_to_bounds_2.dart.hierarchy.expect
index 86c098f..3f48b79 100644
--- a/pkg/front_end/testcases/inference/mixin_inference_instantiate_to_bounds_2.dart.hierarchy.expect
+++ b/pkg/front_end/testcases/inference/mixin_inference_instantiate_to_bounds_2.dart.hierarchy.expect
@@ -82,11 +82,11 @@
     Object.==
   interfaceSetters:
 
-M1 with M0:
+M1 with M0<int, int>:
   superclasses:
     Object
       -> M1
-  interfaces: I<int>, M0
+  interfaces: I<int>, M0<int, int>
   classMembers:
     Object.toString
     Object.runtimeType
@@ -117,7 +117,7 @@
     Object
       -> M1
         -> _A&M1&M0
-  interfaces: I<int>, M0
+  interfaces: I<int>, M0<int, int>
   classMembers:
     Object.toString
     Object.runtimeType
diff --git a/pkg/front_end/testcases/inference/mixin_inference_instantiate_to_bounds_3.dart.hierarchy.expect b/pkg/front_end/testcases/inference/mixin_inference_instantiate_to_bounds_3.dart.hierarchy.expect
index 86c098f..7daaa837 100644
--- a/pkg/front_end/testcases/inference/mixin_inference_instantiate_to_bounds_3.dart.hierarchy.expect
+++ b/pkg/front_end/testcases/inference/mixin_inference_instantiate_to_bounds_3.dart.hierarchy.expect
@@ -82,11 +82,11 @@
     Object.==
   interfaceSetters:
 
-M1 with M0:
+M1 with M0<int, Comparable<dynamic>>:
   superclasses:
     Object
       -> M1
-  interfaces: I<int>, M0
+  interfaces: I<int>, M0<int, Comparable<dynamic>>
   classMembers:
     Object.toString
     Object.runtimeType
@@ -117,7 +117,7 @@
     Object
       -> M1
         -> _A&M1&M0
-  interfaces: I<int>, M0
+  interfaces: I<int>, M0<int, Comparable<dynamic>>
   classMembers:
     Object.toString
     Object.runtimeType
diff --git a/pkg/front_end/testcases/inference/mixin_inference_multiple_constraints.dart.hierarchy.expect b/pkg/front_end/testcases/inference/mixin_inference_multiple_constraints.dart.hierarchy.expect
index 57e0186..eebc3a2 100644
--- a/pkg/front_end/testcases/inference/mixin_inference_multiple_constraints.dart.hierarchy.expect
+++ b/pkg/front_end/testcases/inference/mixin_inference_multiple_constraints.dart.hierarchy.expect
@@ -172,12 +172,12 @@
     Object.==
   interfaceSetters:
 
-M2 with M0:
+M2 with M0<int, double>:
   superclasses:
     Object
       -> M1
         -> M2
-  interfaces: I<int>, J<double>, M0, _M0&I&J<dynamic, dynamic>
+  interfaces: I<int>, J<double>, M0<int, double>, _M0&I&J<int, double>
   classMembers:
     Object.toString
     Object.runtimeType
@@ -209,7 +209,7 @@
       -> M1
         -> M2
           -> _A&M2&M0
-  interfaces: I<int>, J<double>, M0, _M0&I&J<dynamic, dynamic>
+  interfaces: I<int>, J<double>, M0<int, double>, _M0&I&J<int, double>
   classMembers:
     Object.toString
     Object.runtimeType
diff --git a/pkg/front_end/testcases/inference/mixin_inference_non_trivial_constraints.dart.hierarchy.expect b/pkg/front_end/testcases/inference/mixin_inference_non_trivial_constraints.dart.hierarchy.expect
index ce6caac..5e81312 100644
--- a/pkg/front_end/testcases/inference/mixin_inference_non_trivial_constraints.dart.hierarchy.expect
+++ b/pkg/front_end/testcases/inference/mixin_inference_non_trivial_constraints.dart.hierarchy.expect
@@ -90,13 +90,13 @@
     Object.==
   classSetters:
 
-M2<int> with M0:
+M2<int> with M0<Map<int, int>>:
   superclasses:
     Object
       -> I<List<Map<int, int>>>
         -> M1<Map<int, int>>
           -> M2<int>
-  interfaces: M0
+  interfaces: M0<Map<int, int>>
   classMembers:
     Object.toString
     Object.runtimeType
@@ -129,7 +129,7 @@
         -> M1<Map<int, int>>
           -> M2<int>
             -> _A&M2&M0
-  interfaces: M0
+  interfaces: M0<Map<int, int>>
   classMembers:
     Object.toString
     Object.runtimeType
diff --git a/pkg/front_end/testcases/inference/mixin_inference_outwards_1.dart.hierarchy.expect b/pkg/front_end/testcases/inference/mixin_inference_outwards_1.dart.hierarchy.expect
index 8eaf319..992d270 100644
--- a/pkg/front_end/testcases/inference/mixin_inference_outwards_1.dart.hierarchy.expect
+++ b/pkg/front_end/testcases/inference/mixin_inference_outwards_1.dart.hierarchy.expect
@@ -71,12 +71,12 @@
     Object.==
   classSetters:
 
-M0<int> with M1:
+M0<int> with M1<int>:
   superclasses:
     Object
       -> I<int>
         -> M0<int>
-  interfaces: M1
+  interfaces: M1<int>
   classMembers:
     Object.toString
     Object.runtimeType
@@ -108,7 +108,7 @@
       -> I<int>
         -> M0<int>
           -> _A&M0&M1
-  interfaces: M1
+  interfaces: M1<int>
   classMembers:
     Object.toString
     Object.runtimeType
diff --git a/pkg/front_end/testcases/inference/mixin_inference_outwards_2.dart.hierarchy.expect b/pkg/front_end/testcases/inference/mixin_inference_outwards_2.dart.hierarchy.expect
index e8e809f..2113b02 100644
--- a/pkg/front_end/testcases/inference/mixin_inference_outwards_2.dart.hierarchy.expect
+++ b/pkg/front_end/testcases/inference/mixin_inference_outwards_2.dart.hierarchy.expect
@@ -89,12 +89,12 @@
     Object.==
   classSetters:
 
-M0<int> with M1:
+M0<int> with M1<int>:
   superclasses:
     Object
       -> I<int>
         -> M0<int>
-  interfaces: M1
+  interfaces: M1<int>
   classMembers:
     Object.toString
     Object.runtimeType
@@ -120,13 +120,13 @@
     Object.==
   interfaceSetters:
 
-_A&M0&M1 with M2:
+_A&M0&M1 with M2<int>:
   superclasses:
     Object
       -> I<int>
         -> M0<int>
           -> _A&M0&M1
-  interfaces: M1, M2
+  interfaces: M1<int>, M2<int>
   classMembers:
     Object.toString
     Object.runtimeType
@@ -159,7 +159,7 @@
         -> M0<int>
           -> _A&M0&M1
             -> _A&M0&M1&M2
-  interfaces: M1, M2
+  interfaces: M1<int>, M2<int>
   classMembers:
     Object.toString
     Object.runtimeType
diff --git a/pkg/front_end/testcases/inference/mixin_inference_outwards_3.dart.hierarchy.expect b/pkg/front_end/testcases/inference/mixin_inference_outwards_3.dart.hierarchy.expect
index 73af31a..45aa225 100644
--- a/pkg/front_end/testcases/inference/mixin_inference_outwards_3.dart.hierarchy.expect
+++ b/pkg/front_end/testcases/inference/mixin_inference_outwards_3.dart.hierarchy.expect
@@ -82,10 +82,10 @@
     Object.==
   classSetters:
 
-Object with M0:
+Object with M0<dynamic>:
   superclasses:
     Object
-  interfaces: M0, I<dynamic>
+  interfaces: M0<dynamic>, I<dynamic>
   classMembers:
     Object.toString
     Object.runtimeType
@@ -115,7 +115,7 @@
   superclasses:
     Object
       -> _A&Object&M0
-  interfaces: M0, I<dynamic>, M1<int>
+  interfaces: M0<dynamic>, I<dynamic>, M1<int>
   classMembers:
     Object.toString
     Object.runtimeType
@@ -146,7 +146,7 @@
     Object
       -> _A&Object&M0
         -> _A&Object&M0&M1
-  interfaces: M0, I<dynamic>, M1<int>
+  interfaces: M0<dynamic>, I<dynamic>, M1<int>
   classMembers:
     Object.toString
     Object.runtimeType
diff --git a/pkg/front_end/testcases/inference/mixin_inference_outwards_4.dart.hierarchy.expect b/pkg/front_end/testcases/inference/mixin_inference_outwards_4.dart.hierarchy.expect
index 9d8ff25..1d1e2f0 100644
--- a/pkg/front_end/testcases/inference/mixin_inference_outwards_4.dart.hierarchy.expect
+++ b/pkg/front_end/testcases/inference/mixin_inference_outwards_4.dart.hierarchy.expect
@@ -82,10 +82,10 @@
     Object.==
   classSetters:
 
-Object with M0:
+Object with M0<dynamic>:
   superclasses:
     Object
-  interfaces: M0, I<dynamic>
+  interfaces: M0<dynamic>, I<dynamic>
   classMembers:
     Object.toString
     Object.runtimeType
@@ -111,11 +111,11 @@
     Object.==
   interfaceSetters:
 
-_A&Object&M0 with M1:
+_A&Object&M0 with M1<dynamic>:
   superclasses:
     Object
       -> _A&Object&M0
-  interfaces: M0, I<dynamic>, M1
+  interfaces: M0<dynamic>, I<dynamic>, M1<dynamic>
   classMembers:
     Object.toString
     Object.runtimeType
@@ -146,7 +146,7 @@
     Object
       -> _A&Object&M0
         -> _A&Object&M0&M1
-  interfaces: M0, I<dynamic>, M1
+  interfaces: M0<dynamic>, I<dynamic>, M1<dynamic>
   classMembers:
     Object.toString
     Object.runtimeType
diff --git a/pkg/front_end/testcases/inference/mixin_inference_unification_1.dart.hierarchy.expect b/pkg/front_end/testcases/inference/mixin_inference_unification_1.dart.hierarchy.expect
index d8b10ad..9e4e1b8 100644
--- a/pkg/front_end/testcases/inference/mixin_inference_unification_1.dart.hierarchy.expect
+++ b/pkg/front_end/testcases/inference/mixin_inference_unification_1.dart.hierarchy.expect
@@ -93,10 +93,10 @@
     Object.==
   interfaceSetters:
 
-Object with M0:
+Object with M0<dynamic>:
   superclasses:
     Object
-  interfaces: M0, I<dynamic, int>
+  interfaces: M0<dynamic>, I<dynamic, int>
   classMembers:
     Object.toString
     Object.runtimeType
@@ -122,11 +122,11 @@
     Object.==
   interfaceSetters:
 
-_A&Object&M0 with M1:
+_A&Object&M0 with M1<dynamic>:
   superclasses:
     Object
       -> _A&Object&M0
-  interfaces: M0, I<dynamic, int>, M1
+  interfaces: M0<dynamic>, I<dynamic, int>, M1<dynamic>
   classMembers:
     Object.toString
     Object.runtimeType
@@ -157,7 +157,7 @@
     Object
       -> _A&Object&M0
         -> _A&Object&M0&M1
-  interfaces: M0, I<dynamic, int>, M1
+  interfaces: M0<dynamic>, I<dynamic, int>, M1<dynamic>
   classMembers:
     Object.toString
     Object.runtimeType
diff --git a/pkg/front_end/testcases/inference/mixin_inference_unification_2.dart.hierarchy.expect b/pkg/front_end/testcases/inference/mixin_inference_unification_2.dart.hierarchy.expect
index a3e27de..e8cc39f 100644
--- a/pkg/front_end/testcases/inference/mixin_inference_unification_2.dart.hierarchy.expect
+++ b/pkg/front_end/testcases/inference/mixin_inference_unification_2.dart.hierarchy.expect
@@ -93,10 +93,10 @@
     Object.==
   interfaceSetters:
 
-Object with M0:
+Object with M0<dynamic>:
   superclasses:
     Object
-  interfaces: M0, I<dynamic, List<dynamic>>
+  interfaces: M0<dynamic>, I<dynamic, List<dynamic>>
   classMembers:
     Object.toString
     Object.runtimeType
@@ -122,11 +122,11 @@
     Object.==
   interfaceSetters:
 
-_A&Object&M0 with M1:
+_A&Object&M0 with M1<dynamic>:
   superclasses:
     Object
       -> _A&Object&M0
-  interfaces: M0, I<dynamic, List<dynamic>>, M1
+  interfaces: M0<dynamic>, I<dynamic, List<dynamic>>, M1<dynamic>
   classMembers:
     Object.toString
     Object.runtimeType
@@ -157,7 +157,7 @@
     Object
       -> _A&Object&M0
         -> _A&Object&M0&M1
-  interfaces: M0, I<dynamic, List<dynamic>>, M1
+  interfaces: M0<dynamic>, I<dynamic, List<dynamic>>, M1<dynamic>
   classMembers:
     Object.toString
     Object.runtimeType
diff --git a/pkg/front_end/testcases/rasta/super_mixin.dart.hierarchy.expect b/pkg/front_end/testcases/rasta/super_mixin.dart.hierarchy.expect
index ca47cf9..ff7667f 100644
--- a/pkg/front_end/testcases/rasta/super_mixin.dart.hierarchy.expect
+++ b/pkg/front_end/testcases/rasta/super_mixin.dart.hierarchy.expect
@@ -189,11 +189,11 @@
     Mixin.x
     Mixin.z
 
-Super with Mixin:
+Super with Mixin<dynamic>:
   superclasses:
     Object
       -> Super
-  interfaces: Mixin
+  interfaces: Mixin<dynamic>
   classMembers:
     Mixin.y
     Super.f
@@ -254,7 +254,7 @@
     Object
       -> Super
         -> _D&Super&Mixin
-  interfaces: Mixin
+  interfaces: Mixin<dynamic>
   classMembers:
     Mixin.y
     Super.f
@@ -374,7 +374,7 @@
   superclasses:
     Object
       -> Super
-  interfaces: Mixin
+  interfaces: Mixin<dynamic>
   classMembers:
     Mixin.y
     Super.f