Chromium Code Reviews| 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; |
| + } |
| +} |