Index: pkg/fasta/lib/src/builder/interface_type_builder.dart |
diff --git a/pkg/fasta/lib/src/builder/interface_type_builder.dart b/pkg/fasta/lib/src/builder/interface_type_builder.dart |
new file mode 100644 |
index 0000000000000000000000000000000000000000..326d35e237e61de8e486f5e60c06208d6a916e9e |
--- /dev/null |
+++ b/pkg/fasta/lib/src/builder/interface_type_builder.dart |
@@ -0,0 +1,68 @@ |
+// 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.interface_type_builder; |
+ |
+import 'scope.dart' show |
+ Scope; |
+ |
+import 'builder.dart' show |
+ Builder, |
+ InvalidTypeBuilder, |
+ PrefixBuilder, |
+ TypeBuilder, |
+ TypeDeclarationBuilder; |
+ |
+// TODO(ahe): This isn't really an interface type. Find better name. |
Johnni Winther
2017/01/16 13:01:19
NamedTypeBuilder? GenericTypeBuilder?
ahe
2017/01/16 15:26:33
I like NamedTypeBuilder. GenericTypeBuilder is a b
|
+abstract class InterfaceTypeBuilder<T extends TypeBuilder> extends TypeBuilder { |
+ final String name; |
+ |
+ final List<T> arguments; |
+ |
+ TypeDeclarationBuilder get builder; |
+ |
+ void set builder(TypeDeclarationBuilder b); |
+ |
+ InterfaceTypeBuilder(this.name, this.arguments); |
+ |
+ InvalidTypeBuilder buildInvalidType(String name); |
+ |
+ void resolveIn(Scope scope) { |
+ Builder member = scope.lookup(name); |
+ if (member is TypeDeclarationBuilder) { |
+ builder = member; |
+ return; |
+ } |
+ if (name.contains(".")) { |
+ int index = name.lastIndexOf("."); |
+ String first = name.substring(0, index); |
+ String last = name.substring(name.lastIndexOf(".") + 1); |
+ var prefix = scope.lookup(first); |
+ if (prefix is PrefixBuilder) { |
+ member = prefix.exports[last]; |
+ } |
+ if (member is TypeDeclarationBuilder) { |
+ builder = member; |
+ return; |
+ } |
+ } |
+ builder = buildInvalidType(name); |
+ } |
+ |
+ String get debugName => "InterfaceTypeBuilder"; |
+ |
+ StringBuffer printOn(StringBuffer buffer) { |
+ buffer.write(name); |
+ if (arguments == null) return buffer; |
+ buffer.write("<"); |
+ bool first = true; |
+ for (T t in arguments) { |
+ if (!first) buffer.write(", "); |
+ first = false; |
+ t.printOn(buffer); |
+ } |
+ buffer.write(">"); |
+ return buffer; |
+ } |
+} |