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; |
+ } |
+} |