blob: 390f4e45e89216c0d1d032d0d77b31e162bb22be [file] [log] [blame]
// 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";
}
}