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