| Index: pkg/fasta/lib/src/kernel/kernel_interface_type_builder.dart
|
| diff --git a/pkg/fasta/lib/src/kernel/kernel_interface_type_builder.dart b/pkg/fasta/lib/src/kernel/kernel_interface_type_builder.dart
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..ffbe6cb2cfbce3a1d75e545a2503c944cb7c11f6
|
| --- /dev/null
|
| +++ b/pkg/fasta/lib/src/kernel/kernel_interface_type_builder.dart
|
| @@ -0,0 +1,94 @@
|
| +// Copyright (c) 2016, 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.kernel_interface_type_builder;
|
| +
|
| +import 'package:kernel/ast.dart' show
|
| + DartType,
|
| + DynamicType,
|
| + Supertype,
|
| + VoidType;
|
| +
|
| +import '../errors.dart' show
|
| + inputError;
|
| +
|
| +import 'kernel_builder.dart' show
|
| + InterfaceTypeBuilder,
|
| + KernelClassBuilder,
|
| + KernelInvalidTypeBuilder,
|
| + KernelTypeBuilder,
|
| + TypeBuilder,
|
| + TypeDeclarationBuilder,
|
| + TypeVariableBuilder;
|
| +
|
| +// TODO(ahe): This isn't really an interface type. Find better name, for
|
| +// example, KernelNamedTypeBuilder.
|
| +class KernelInterfaceTypeBuilder extends InterfaceTypeBuilder<KernelTypeBuilder>
|
| + implements KernelTypeBuilder {
|
| + TypeDeclarationBuilder<KernelTypeBuilder, DartType> builder;
|
| +
|
| + KernelInterfaceTypeBuilder(String name, List<KernelTypeBuilder> arguments)
|
| + : super(name, arguments);
|
| +
|
| + KernelInvalidTypeBuilder buildInvalidType(String name) {
|
| + // TODO(ahe): Report error somewhere.
|
| + print("Type not found: $name");
|
| + return new KernelInvalidTypeBuilder(name, null);
|
| + }
|
| +
|
| + DartType handleMissingType() {
|
| + // TODO(ahe): Fix this.
|
| + print("No type for: $name");
|
| + return const DynamicType();
|
| + }
|
| +
|
| + Supertype handleMissingSuperType() {
|
| + // TODO(ahe): Fix this.
|
| + return inputError(null, null, "No type for: $name");
|
| + }
|
| +
|
| + DartType build() {
|
| + if (name == "void") return const VoidType();
|
| + if (name == "dynamic") return const DynamicType();
|
| + if (builder == null) return handleMissingType();
|
| + return builder.buildType(arguments);
|
| + }
|
| +
|
| + Supertype buildSupertype() {
|
| + if (name == "void") return null;
|
| + if (name == "dynamic") return null;
|
| + if (builder == null) return handleMissingSuperType();
|
| + if (builder is KernelClassBuilder) {
|
| + KernelClassBuilder builder = this.builder;
|
| + return builder.buildSupertype(arguments);
|
| + } else {
|
| + return handleMissingSuperType();
|
| + }
|
| + }
|
| +
|
| + TypeBuilder subst(Map<TypeVariableBuilder, TypeBuilder> substitution) {
|
| + assert(builder != null);
|
| + TypeBuilder result = substitution[builder];
|
| + if (result != null) {
|
| + assert(builder is TypeVariableBuilder);
|
| + return result;
|
| + } else if (arguments != null) {
|
| + List<KernelTypeBuilder> arguments;
|
| + int i = 0;
|
| + for (KernelTypeBuilder argument in this.arguments) {
|
| + KernelTypeBuilder type = argument.subst(substitution);
|
| + if (type != argument) {
|
| + arguments ??= this.arguments.toList();
|
| + arguments[i] = type;
|
| + }
|
| + i++;
|
| + }
|
| + if (arguments != null) {
|
| + return new KernelInterfaceTypeBuilder(name, arguments)
|
| + ..builder = builder;
|
| + }
|
| + }
|
| + return this;
|
| + }
|
| +}
|
|
|