Add Loader.computeTypeBuilder

Change-Id: Ida90356e4675b95bdeebe2962aa7359e64c6bc93
Reviewed-on: https://dart-review.googlesource.com/c/92123
Reviewed-by: Dmitry Stefantsov <dmitryas@google.com>
diff --git a/pkg/front_end/lib/src/fasta/dill/dill_loader.dart b/pkg/front_end/lib/src/fasta/dill/dill_loader.dart
index 63af1f2..aa5785b 100644
--- a/pkg/front_end/lib/src/fasta/dill/dill_loader.dart
+++ b/pkg/front_end/lib/src/fasta/dill/dill_loader.dart
@@ -6,35 +6,15 @@
 
 import 'dart:async' show Future;
 
-import 'package:kernel/ast.dart'
-    show
-        BottomType,
-        Class,
-        Component,
-        DartType,
-        DartTypeVisitor,
-        DynamicType,
-        FunctionType,
-        InterfaceType,
-        InvalidType,
-        Library,
-        TypeParameter,
-        TypeParameterType,
-        TypedefType,
-        VoidType;
+import 'package:kernel/ast.dart' show Class, Component, DartType, Library;
 
 import '../fasta_codes.dart'
     show SummaryTemplate, Template, templateDillOutlineSummary;
 
 import '../kernel/kernel_builder.dart'
-    show
-        DynamicTypeBuilder,
-        KernelClassBuilder,
-        KernelNamedTypeBuilder,
-        KernelTypeBuilder,
-        KernelTypeVariableBuilder,
-        LibraryBuilder,
-        VoidTypeBuilder;
+    show KernelClassBuilder, KernelTypeBuilder, LibraryBuilder;
+
+import '../kernel/type_builder_computer.dart' show TypeBuilderComputer;
 
 import '../loader.dart' show Loader;
 
@@ -42,8 +22,6 @@
 
 import '../target_implementation.dart' show TargetImplementation;
 
-import 'dill_class_builder.dart' show DillClassBuilder;
-
 import 'dill_library_builder.dart' show DillLibraryBuilder;
 
 import 'dill_target.dart' show DillTarget;
@@ -107,68 +85,8 @@
     return library[cls.name];
   }
 
+  @override
   KernelTypeBuilder computeTypeBuilder(DartType type) {
     return type.accept(new TypeBuilderComputer(this));
   }
 }
-
-class TypeBuilderComputer implements DartTypeVisitor<KernelTypeBuilder> {
-  final DillLoader loader;
-
-  const TypeBuilderComputer(this.loader);
-
-  KernelTypeBuilder defaultDartType(DartType node) {
-    throw "Unsupported";
-  }
-
-  KernelTypeBuilder visitInvalidType(InvalidType node) {
-    throw "Not implemented";
-  }
-
-  KernelTypeBuilder visitDynamicType(DynamicType node) {
-    return new KernelNamedTypeBuilder("dynamic", null)
-      ..bind(new DynamicTypeBuilder<KernelTypeBuilder, DartType>(
-          const DynamicType(), loader.coreLibrary, -1));
-  }
-
-  KernelTypeBuilder visitVoidType(VoidType node) {
-    return new KernelNamedTypeBuilder("void", null)
-      ..bind(new VoidTypeBuilder<KernelTypeBuilder, VoidType>(
-          const VoidType(), loader.coreLibrary, -1));
-  }
-
-  KernelTypeBuilder visitBottomType(BottomType node) {
-    throw "Not implemented";
-  }
-
-  KernelTypeBuilder visitInterfaceType(InterfaceType node) {
-    DillClassBuilder cls =
-        loader.computeClassBuilderFromTargetClass(node.classNode);
-    List<KernelTypeBuilder> arguments;
-    List<DartType> kernelArguments = node.typeArguments;
-    if (kernelArguments.isNotEmpty) {
-      arguments = new List<KernelTypeBuilder>(kernelArguments.length);
-      for (int i = 0; i < kernelArguments.length; i++) {
-        arguments[i] = kernelArguments[i].accept(this);
-      }
-    }
-    return new KernelNamedTypeBuilder(cls.name, arguments)..bind(cls);
-  }
-
-  KernelTypeBuilder visitFunctionType(FunctionType node) {
-    throw "Not implemented";
-  }
-
-  KernelTypeBuilder visitTypeParameterType(TypeParameterType node) {
-    TypeParameter parameter = node.parameter;
-    Class kernelClass = parameter.parent;
-    Library kernelLibrary = kernelClass.enclosingLibrary;
-    DillLibraryBuilder library = loader.builders[kernelLibrary.importUri];
-    return new KernelNamedTypeBuilder(parameter.name, null)
-      ..bind(new KernelTypeVariableBuilder.fromKernel(parameter, library));
-  }
-
-  KernelTypeBuilder visitTypedefType(TypedefType node) {
-    throw "Not implemented";
-  }
-}
diff --git a/pkg/front_end/lib/src/fasta/kernel/kernel_target.dart b/pkg/front_end/lib/src/fasta/kernel/kernel_target.dart
index 861f6cc..bbb6e4f 100644
--- a/pkg/front_end/lib/src/fasta/kernel/kernel_target.dart
+++ b/pkg/front_end/lib/src/fasta/kernel/kernel_target.dart
@@ -119,7 +119,7 @@
   /// The [MetadataCollector] to write metadata to.
   final MetadataCollector metadataCollector;
 
-  SourceLoader<Library> loader;
+  SourceLoader loader;
 
   Component component;
 
@@ -147,8 +147,8 @@
 
   void set builderHierarchy(ClassHierarchyBuilder o) {}
 
-  SourceLoader<Library> createLoader() =>
-      new SourceLoader<Library>(fileSystem, includeComments, this);
+  SourceLoader createLoader() =>
+      new SourceLoader(fileSystem, includeComments, this);
 
   void addSourceInformation(
       Uri uri, List<int> lineStarts, List<int> sourceCode) {
diff --git a/pkg/front_end/lib/src/fasta/kernel/transform_set_literals.dart b/pkg/front_end/lib/src/fasta/kernel/transform_set_literals.dart
index e32f179..abc2f4d 100644
--- a/pkg/front_end/lib/src/fasta/kernel/transform_set_literals.dart
+++ b/pkg/front_end/lib/src/fasta/kernel/transform_set_literals.dart
@@ -55,8 +55,7 @@
     return coreTypes.index.getMember('dart:core', 'Set', 'add');
   }
 
-  static Constructor _findUnmodifiableSetConstructor(
-      SourceLoader<Library> loader) {
+  static Constructor _findUnmodifiableSetConstructor(SourceLoader loader) {
     // We should not generally dig into libraries like this, and we should
     // avoid dependencies on libraries other than the ones indexed by
     // CoreTypes. This is a temporary solution until all backends have
@@ -77,7 +76,7 @@
     return null;
   }
 
-  SetLiteralTransformer(SourceLoader<Library> loader)
+  SetLiteralTransformer(SourceLoader loader)
       : coreTypes = loader.coreTypes,
         nullType = new InterfaceType(loader.coreTypes.nullClass, []),
         setFactory = _findSetFactory(loader.coreTypes),
diff --git a/pkg/front_end/lib/src/fasta/kernel/type_builder_computer.dart b/pkg/front_end/lib/src/fasta/kernel/type_builder_computer.dart
new file mode 100644
index 0000000..390f4e4
--- /dev/null
+++ b/pkg/front_end/lib/src/fasta/kernel/type_builder_computer.dart
@@ -0,0 +1,95 @@
+// Copyright (c) 2019, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library fasta.type_builder_computer;
+
+import 'package:kernel/ast.dart'
+    show
+        BottomType,
+        Class,
+        DartType,
+        DartTypeVisitor,
+        DynamicType,
+        FunctionType,
+        InterfaceType,
+        InvalidType,
+        Library,
+        TypeParameter,
+        TypeParameterType,
+        TypedefType,
+        VoidType;
+
+import '../kernel/kernel_builder.dart'
+    show
+        DynamicTypeBuilder,
+        KernelClassBuilder,
+        KernelNamedTypeBuilder,
+        KernelTypeBuilder,
+        KernelTypeVariableBuilder,
+        LibraryBuilder,
+        VoidTypeBuilder;
+
+import '../loader.dart' show Loader;
+
+class TypeBuilderComputer implements DartTypeVisitor<KernelTypeBuilder> {
+  final Loader<Library> loader;
+
+  const TypeBuilderComputer(this.loader);
+
+  KernelTypeBuilder defaultDartType(DartType node) {
+    throw "Unsupported";
+  }
+
+  KernelTypeBuilder visitInvalidType(InvalidType node) {
+    throw "Not implemented";
+  }
+
+  KernelTypeBuilder visitDynamicType(DynamicType node) {
+    return new KernelNamedTypeBuilder("dynamic", null)
+      ..bind(new DynamicTypeBuilder<KernelTypeBuilder, DartType>(
+          const DynamicType(), loader.coreLibrary, -1));
+  }
+
+  KernelTypeBuilder visitVoidType(VoidType node) {
+    return new KernelNamedTypeBuilder("void", null)
+      ..bind(new VoidTypeBuilder<KernelTypeBuilder, VoidType>(
+          const VoidType(), loader.coreLibrary, -1));
+  }
+
+  KernelTypeBuilder visitBottomType(BottomType node) {
+    throw "Not implemented";
+  }
+
+  KernelTypeBuilder visitInterfaceType(InterfaceType node) {
+    KernelClassBuilder cls =
+        loader.computeClassBuilderFromTargetClass(node.classNode);
+    List<KernelTypeBuilder> arguments;
+    List<DartType> kernelArguments = node.typeArguments;
+    if (kernelArguments.isNotEmpty) {
+      arguments = new List<KernelTypeBuilder>(kernelArguments.length);
+      for (int i = 0; i < kernelArguments.length; i++) {
+        arguments[i] = kernelArguments[i].accept(this);
+      }
+    }
+    return new KernelNamedTypeBuilder(cls.name, arguments)..bind(cls);
+  }
+
+  KernelTypeBuilder visitFunctionType(FunctionType node) {
+    throw "Not implemented";
+  }
+
+  KernelTypeBuilder visitTypeParameterType(TypeParameterType node) {
+    TypeParameter parameter = node.parameter;
+    Class kernelClass = parameter.parent;
+    Library kernelLibrary = kernelClass.enclosingLibrary;
+    LibraryBuilder<KernelTypeBuilder, Library> library =
+        loader.builders[kernelLibrary.importUri];
+    return new KernelNamedTypeBuilder(parameter.name, null)
+      ..bind(new KernelTypeVariableBuilder.fromKernel(parameter, library));
+  }
+
+  KernelTypeBuilder visitTypedefType(TypedefType node) {
+    throw "Not implemented";
+  }
+}
diff --git a/pkg/front_end/lib/src/fasta/loader.dart b/pkg/front_end/lib/src/fasta/loader.dart
index 74e73fa6..da5a124 100644
--- a/pkg/front_end/lib/src/fasta/loader.dart
+++ b/pkg/front_end/lib/src/fasta/loader.dart
@@ -307,4 +307,6 @@
 
   ClassBuilder<TypeBuilder, Object> computeClassBuilderFromTargetClass(
       covariant Object cls);
+
+  TypeBuilder computeTypeBuilder(covariant Object type);
 }
diff --git a/pkg/front_end/lib/src/fasta/source/source_loader.dart b/pkg/front_end/lib/src/fasta/source/source_loader.dart
index 6702683..05cc836 100644
--- a/pkg/front_end/lib/src/fasta/source/source_loader.dart
+++ b/pkg/front_end/lib/src/fasta/source/source_loader.dart
@@ -82,6 +82,7 @@
         KernelClassBuilder,
         KernelFieldBuilder,
         KernelProcedureBuilder,
+        KernelTypeBuilder,
         LibraryBuilder,
         NamedTypeBuilder,
         TypeBuilder;
@@ -92,6 +93,8 @@
 
 import '../kernel/transform_set_literals.dart' show SetLiteralTransformer;
 
+import '../kernel/type_builder_computer.dart' show TypeBuilderComputer;
+
 import '../loader.dart' show Loader, untranslatableUriScheme;
 
 import '../parser/class_member_parser.dart' show ClassMemberParser;
@@ -119,7 +122,7 @@
 
 import 'source_library_builder.dart' show SourceLibraryBuilder;
 
-class SourceLoader<L> extends Loader<L> {
+class SourceLoader extends Loader<Library> {
   /// The [FileSystem] which should be used to access files.
   final FileSystem fileSystem;
 
@@ -754,7 +757,7 @@
     builders.forEach((Uri uri, LibraryBuilder library) {
       if (library.loader == this) {
         SourceLibraryBuilder sourceLibrary = library;
-        L target = sourceLibrary.build(coreLibrary);
+        Library target = sourceLibrary.build(coreLibrary);
         if (!library.isPatch) {
           libraries.add(target);
         }
@@ -1115,6 +1118,11 @@
     LibraryBuilder library = builders[kernelLibrary.importUri];
     return library[cls.name];
   }
+
+  @override
+  KernelTypeBuilder computeTypeBuilder(DartType type) {
+    return type.accept(new TypeBuilderComputer(this));
+  }
 }
 
 /// A minimal implementation of dart:core that is sufficient to create an