Index: pkg/front_end/lib/src/fasta/dill/dill_library_builder.dart |
diff --git a/pkg/front_end/lib/src/fasta/dill/dill_library_builder.dart b/pkg/front_end/lib/src/fasta/dill/dill_library_builder.dart |
index 48bcb98b9f1cf622846ee2cc37ff69860621e3a9..e07e6a063dbf28fd690e2e2b11dac446c57f7736 100644 |
--- a/pkg/front_end/lib/src/fasta/dill/dill_library_builder.dart |
+++ b/pkg/front_end/lib/src/fasta/dill/dill_library_builder.dart |
@@ -13,13 +13,14 @@ import 'package:kernel/ast.dart' |
Library, |
ListLiteral, |
Member, |
+ Procedure, |
StaticGet, |
StringLiteral, |
Typedef; |
import '../fasta_codes.dart' show templateUnspecified; |
-import '../problems.dart' show unimplemented; |
+import '../problems.dart' show unhandled, unimplemented; |
import '../kernel/kernel_builder.dart' |
show |
@@ -47,18 +48,11 @@ class DillLibraryBuilder extends LibraryBuilder<KernelTypeBuilder, Library> { |
Library library; |
- /// Exports in addition to the members declared in this library. |
+ /// Exports that can't be serialized. |
/// |
- /// Each entry in the list is either two or three elements long. |
- /// |
- /// The first element is the library URI, if it is null, this is an ambiguous |
- /// export and the list has three elements. Otherwise the list has two |
- /// elements. |
- /// |
- /// The second element is the name of the exported element. |
- /// |
- /// The third element (if present) is an error message. |
- List<List<String>> additionalExports; |
+ /// The elements of this map are documented in |
+ /// [../source/source_library_builder.dart]. |
+ Map<String, String> additionalExports; |
Johnni Winther
2017/09/01 12:32:32
Rename this to [unserializableExports] to avoid co
ahe
2017/09/01 14:05:39
Done.
|
DillLibraryBuilder(this.uri, this.loader) |
: super(uri, new Scope.top(), new Scope.top()); |
@@ -145,21 +139,59 @@ class DillLibraryBuilder extends LibraryBuilder<KernelTypeBuilder, Library> { |
} |
void finalizeExports() { |
- if (additionalExports != null) { |
- for (List<String> additionalExport in additionalExports) { |
- String uriString = additionalExport[0]; |
- String name = additionalExport[1]; |
- Builder builder; |
- if (uriString == null) { |
- builder = new KernelInvalidTypeBuilder(name, -1, null, |
- templateUnspecified.withArguments(additionalExport[2])); |
- } else { |
- DillLibraryBuilder library = loader.read(uri.resolve(uriString), -1); |
- builder = library?.exportScopeBuilder[name] ?? |
- new KernelInvalidTypeBuilder(name, -1, null); |
- } |
+ additionalExports?.forEach((String name, String message) { |
+ Builder builder; |
+ switch (name) { |
+ case "dynamic": |
+ case "void": |
+ // TODO(ahe): It's likely that we shouldn't be exporting these types |
+ // from dart:core, and this case can be removed. |
+ builder = loader.coreLibrary.exportScopeBuilder[name]; |
+ break; |
+ |
+ default: |
+ builder = new KernelInvalidTypeBuilder( |
+ name, |
+ -1, |
+ null, |
+ message == null |
+ ? null |
+ : templateUnspecified.withArguments(message)); |
+ } |
+ exportScopeBuilder.addMember(name, builder); |
+ }); |
+ |
+ for (var reference in library.additionalExports) { |
+ var node = reference.node; |
+ Uri libraryUri; |
+ String name; |
+ bool isSetter = false; |
+ if (node is Class) { |
+ libraryUri = node.enclosingLibrary.importUri; |
+ name = node.name; |
+ } else if (node is Procedure) { |
+ libraryUri = node.enclosingLibrary.importUri; |
+ name = node.name.name; |
+ isSetter = node.isSetter; |
+ } else if (node is Member) { |
+ libraryUri = node.enclosingLibrary.importUri; |
+ name = node.name.name; |
+ } else if (node is Typedef) { |
+ libraryUri = node.enclosingLibrary.importUri; |
+ name = node.name; |
+ } else { |
+ unhandled("${node.runtimeType}", "finalizeExports", -1, fileUri); |
+ } |
+ var library = loader.read(libraryUri, -1); |
+ Builder builder; |
+ if (isSetter) { |
+ builder = library.exportScope.setters[name]; |
+ exportScopeBuilder.addSetter(name, builder); |
+ } else { |
+ builder = library.exportScope.local[name]; |
exportScopeBuilder.addMember(name, builder); |
} |
+ assert(node == builder.target); |
} |
} |
} |