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 81fba7f2e24ee2b806c4a7e567914439852eaeaa..e661e50df2c2ae1f9fac051a0afb32ce577ff038 100644 |
| --- a/sdk/lib/_internal/compiler/implementation/deferred_load.dart |
| +++ b/sdk/lib/_internal/compiler/implementation/deferred_load.dart |
| @@ -12,11 +12,15 @@ import 'dart2jslib.dart' show |
| ConstructedConstant, |
| MessageKind, |
| StringConstant, |
| - invariant; |
| + invariant, |
| + Backend; |
| import 'dart_backend/dart_backend.dart' show |
| DartBackend; |
| +import 'js_backend/js_backend.dart' show |
| + JavaScriptBackend; |
| + |
| import 'elements/elements.dart' show |
| Element, |
| ClassElement, |
| @@ -43,6 +47,8 @@ import 'tree/tree.dart' show |
| LiteralString, |
| LiteralDartString; |
| +import 'tree/tree.dart' as ast; |
| + |
| import 'resolution/resolution.dart' show |
| TreeElements; |
| @@ -180,6 +186,11 @@ class DeferredLoadTask extends CompilerTask { |
| return outputUnitForElement(element) != mainOutputUnit; |
| } |
| + /// Returns true if e1 and e2 are in the same output unit. |
| + bool inSameOutputUnit(Element e1, Element e2) { |
| + return outputUnitForElement(e1) == outputUnitForElement(e2); |
| + } |
| + |
| /// Mark that [import] is part of the [OutputputUnit] for [element]. |
| /// |
| /// [element] can be either a [Constant] or an [Element]. |
| @@ -257,10 +268,12 @@ class DeferredLoadTask extends CompilerTask { |
| /// Returns a [Link] of every [Import] that imports [element] into [library]. |
| Link<Import> _getImports(Element element, LibraryElement library) { |
| - if (!element.isTopLevel()) { |
| + if (element.isMember()) { |
| element = element.getEnclosingClass(); |
| } |
| - |
| + if (element.isAccessor()) { |
| + element = (element as FunctionElement).abstractField; |
| + } |
| return library.getImportsFor(element); |
| } |
| @@ -802,6 +815,10 @@ class DeferredLoadTask extends CompilerTask { |
| } |
| }); |
| } |
| + Backend backend = compiler.backend; |
| + if (splitProgram && backend is JavaScriptBackend) { |
| + backend.registerCheckDeferredIsLoaded(compiler.globalDependencies); |
| + } |
| if (splitProgram && backend is DartBackend) { |
| // TODO(sigurdm): Implement deferred loading for dart2dart. |
| splitProgram = false; |
| @@ -810,4 +827,59 @@ class DeferredLoadTask extends CompilerTask { |
| MessageKind.DEFERRED_LIBRARY_DART_2_DART); |
| } |
| } |
| + |
| + /// If [send] is a static send with a deferred element, returns the |
| + /// [PrefixElement] that the first prefix of the send resolves to. |
| + /// Otherwise returns null. |
| + /// Precondition: send must be static. |
|
floitsch
2014/04/22 12:33:44
New line before Precondition.
sigurdm
2014/04/23 14:01:46
Done.
|
| + /// |
| + /// Example: |
| + /// |
| + /// import "a.dart" deferred as a; |
| + /// |
| + /// main() { |
| + /// print(a.loadLibrary.toString()); |
| + /// a.loadLibrary().then((_) { |
| + /// a.run(); |
| + /// a.foo.method(); |
| + /// }); |
| + /// } |
| + /// |
| + /// Returns null for a.loadLibrary() (the special |
| + /// function loadLibrary is not deferred). And returns the PrefixElement for |
| + /// a.run() and a.foo. |
| + /// a.loadLibrary.toString() and a.foo.method() are dynamic sends - and |
| + /// this functions should not be called on them. |
| + PrefixElement deferredPrefixElement(ast.Send send, TreeElements elements) { |
| + Element element = elements[send]; |
| + // The DeferredLoaderGetter is not deferred, therefore we do not return the |
| + // prefix. |
| + if (element != null && element.isDeferredLoaderGetter()) return null; |
| + |
| + ast.Node firstNode(ast.Node node) { |
| + if (node is! ast.Send) { |
| + return node; |
| + } else { |
| + ast.Send send = node; |
| + ast.Node receiver = send.receiver; |
| + ast.Node receiverFirst = firstNode(receiver); |
| + if (receiverFirst != null) { |
| + return receiverFirst; |
| + } else { |
| + return firstNode(send.selector); |
| + } |
| + } |
| + } |
| + ast.Node first = firstNode(send); |
| + ast.Node identifier = first.asIdentifier(); |
| + if (identifier == null) return null; |
| + Element maybePrefix = elements[identifier]; |
| + if (maybePrefix != null && maybePrefix.isPrefix()) { |
| + PrefixElement prefixElement = maybePrefix; |
| + if (prefixElement.isDeferred) { |
| + return prefixElement; |
| + } |
| + } |
| + return null; |
| + } |
| } |