Index: pkg/fasta/lib/src/builder/prefix_builder.dart |
diff --git a/pkg/fasta/lib/src/builder/prefix_builder.dart b/pkg/fasta/lib/src/builder/prefix_builder.dart |
new file mode 100644 |
index 0000000000000000000000000000000000000000..f76968ebf536f7fd696811e8fbefb007717e6962 |
--- /dev/null |
+++ b/pkg/fasta/lib/src/builder/prefix_builder.dart |
@@ -0,0 +1,57 @@ |
+// 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.prefix_builder; |
+ |
+import 'builder.dart' show |
+ Builder, |
+ LibraryBuilder, |
+ MemberBuilder; |
+ |
+import 'package:kernel/ast.dart' show |
+ Member; |
+ |
+import '../dill/dill_member_builder.dart' show |
+ DillMemberBuilder; |
+ |
+class PrefixBuilder extends Builder { |
+ final String name; |
+ |
+ final Map<String, Builder> exports; |
+ |
+ final LibraryBuilder parent; |
+ |
+ PrefixBuilder(this.name, this.exports, this.parent); |
+ |
+ Member findTopLevelMember(String name) { |
+ // TODO(ahe): Move this to KernelPrefixBuilder. |
+ Builder builder = exports[name]; |
+ if (builder == null) { |
+ // TODO(ahe): Report error? |
+ print("${this.name} has no member named $name"); |
+ } |
+ if (builder is DillMemberBuilder) { |
+ return builder.member.isInstanceMember ? null : builder.member; |
Johnni Winther
2017/01/16 13:01:19
How can an instance be returned from `exports[name
ahe
2017/01/16 15:26:33
That shouldn't happen. I've turned it into an inte
|
+ } else if (builder is MemberBuilder) { |
+ return builder.target; |
+ } else { |
+ return null; |
+ } |
+ } |
+ |
+ Builder combineAmbiguousImport(String name, Builder other, |
+ LibraryBuilder library) { |
+ if (other is PrefixBuilder) { |
+ other.exports.forEach((String name, Builder member) { |
+ Builder existing = exports[name]; |
Johnni Winther
2017/01/16 13:01:19
Why are we doing this for all names? Don't we risk
ahe
2017/01/16 15:26:33
This deals with the case where the same prefix is
|
+ if (existing != null) { |
+ member = existing.combineAmbiguousImport(name, member, library); |
+ } |
+ exports[name] = member; |
+ }); |
+ return this; |
+ } |
+ return super.combineAmbiguousImport(name, other, library); |
+ } |
+} |