Chromium Code Reviews| Index: sdk/lib/_internal/compiler/implementation/deferred_load.dart |
| diff --git a/sdk/lib/_internal/compiler/implementation/deferred_load.dart b/sdk/lib/_internal/compiler/implementation/deferred_load.dart |
| index fc1b601ba1d95725cfb581b2d55c95ba3a132527..95d7174cc6e70122a3e5436847ebb76b0dee3ddd 100644 |
| --- a/sdk/lib/_internal/compiler/implementation/deferred_load.dart |
| +++ b/sdk/lib/_internal/compiler/implementation/deferred_load.dart |
| @@ -13,6 +13,9 @@ import 'dart2jslib.dart' show |
| StringConstant, |
| invariant; |
| +import 'dart_backend/dart_backend.dart' show |
| + DartBackend; |
| + |
| import 'elements/elements.dart' show |
| Element, |
| ClassElement, |
| @@ -22,6 +25,7 @@ import 'elements/elements.dart' show |
| LibraryElement, |
| MetadataAnnotation, |
| ScopeContainerElement, |
| + PrefixElement, |
| ClosureContainer; |
| import 'util/util.dart' show |
| @@ -186,17 +190,28 @@ class DeferredLoadTask extends CompilerTask { |
| /// Answers whether the [import] has a [DeferredLibrary] annotation. |
| bool _isImportDeferred(Import import) { |
| + return _allDeferredImports.containsKey(import); |
| + } |
| + |
| + /// Checks whether the [import] has a [DeferredLibrary] annotation and stores |
| + /// the information in [_allDeferredImports] and on the corresponding |
| + /// prefixElement. |
| + void _computeImportDeferred(Import import, LibraryElement library) { |
|
floitsch
2014/02/28 12:58:15
the name doesn't work for me.
maybe?
markIfDeferre
sigurdm
2014/03/03 13:18:49
Done.
|
| Link<MetadataAnnotation> metadatalist = import.metadata; |
| - if (metadatalist == null) return false; |
| + if (metadatalist == null) return; |
| for (MetadataAnnotation metadata in metadatalist) { |
| metadata.ensureResolved(compiler); |
| Element element = metadata.value.computeType(compiler).element; |
| if (metadata.value.computeType(compiler).element |
| == deferredLibraryClass) { |
|
floitsch
2014/02/28 12:58:15
please move the "==" into the previous line.
sigurdm
2014/03/03 13:18:49
Done.
|
| - return true; |
| + _allDeferredImports[import] = library.getLibraryFromTag(import); |
| + Element maybePrefix = library.find(import.prefix.toString()); |
|
floitsch
2014/02/28 12:58:15
Isn't it an error if there is no prefix?
sigurdm
2014/03/03 13:18:49
Yes - but it is not fatal - we try compile as much
floitsch
2014/03/03 14:18:06
At least add a comment.
|
| + if (maybePrefix != null && maybePrefix.isPrefix()) { |
| + PrefixElement prefix = maybePrefix; |
| + prefix.markAsDeferred(); |
| + } |
| } |
| } |
| - return false; |
| } |
| /// Answers whether [element] is explicitly deferred when referred to from |
| @@ -632,7 +647,7 @@ class DeferredLoadTask extends CompilerTask { |
| // import "lib.dart" as a; |
| // import "lib2.dart" as a; |
| // We must be able to signal error for case 1, 2, 3, but accept case 4. |
| - |
| + |
| // The prefixes that have been used by any imports in this library. |
| Setlet<String> usedPrefixes = new Setlet<String>(); |
| // The last deferred import we saw with a given prefix (if any). |
| @@ -646,6 +661,7 @@ class DeferredLoadTask extends CompilerTask { |
| for (LibraryTag tag in library.tags) { |
| if (tag is! Import) continue; |
| Import import = tag; |
| + _computeImportDeferred(import, library); |
| String prefix = (import.prefix != null) |
| ? import.prefix.toString() |
| : null; |
| @@ -660,7 +676,6 @@ class DeferredLoadTask extends CompilerTask { |
| prefixDeferredImport[prefix] = import; |
| } |
| splitProgram = true; |
| - _allDeferredImports[tag] = library.getLibraryFromTag(tag); |
| lastDeferred = import.metadata.first; |
| if (library == compiler.mainApp) { |
| deferredUsedFromMain = true; |
| @@ -680,6 +695,13 @@ class DeferredLoadTask extends CompilerTask { |
| } |
| }); |
| } |
| + if (splitProgram && compiler.backend is DartBackend) { |
| + // TODO(sigurdm): Implement deferred loading for dart2dart. |
| + splitProgram = false; |
| + compiler.reportInfo( |
| + lastDeferred, |
| + MessageKind.DEFERRED_LIBRARY_DART_2_DART); |
| + } |
| if (splitProgram && !deferredUsedFromMain) { |
| compiler.reportInfo( |
| lastDeferred, |