Index: dart/sdk/lib/_internal/compiler/implementation/deferred_load.dart |
diff --git a/dart/sdk/lib/_internal/compiler/implementation/deferred_load.dart b/dart/sdk/lib/_internal/compiler/implementation/deferred_load.dart |
new file mode 100644 |
index 0000000000000000000000000000000000000000..244c24976170dfb12a6337528c3cfd3cca154bfc |
--- /dev/null |
+++ b/dart/sdk/lib/_internal/compiler/implementation/deferred_load.dart |
@@ -0,0 +1,51 @@ |
+// Copyright (c) 2013, 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. |
+ |
+class DeferredLoadTask extends CompilerTask { |
+ DeferredLoadTask(Compiler compiler) : super(compiler); |
+ String get name => 'Lazy'; |
+ final Set<LibraryElement> deferredLibraries = new Set<LibraryElement>(); |
kasperl
2013/02/05 08:30:53
I guess this will have to be replaced with some so
ahe
2013/02/05 13:54:22
Correct. Added a TODO.
|
+ |
+ bool isDeferred(Element element) => deferredLibraries.contains(element.getLibrary()); |
+ |
+ void registerMainApp(LibraryElement mainApp) { |
+ if (mainApp == null) return; |
+ compiler.withCurrentElement(mainApp, () { |
+ deferredLibraries.addAll(new List.from(findDeferredLibraries(mainApp))); |
+ }); |
+ } |
+ |
+ Link<Element> findDeferredLibraries(LibraryElement library) { |
+ Link<Element> link = const Link<Element>(); |
+ for (LibraryTag tag in library.tags) { |
+ for (MetadataAnnotation metadata in tag.metadata) { |
+ metadata.ensureResolved(compiler); |
+ if (metadata.value.type.element == compiler.deferLoadClass) { |
+ ConstructedConstant value = metadata.value; |
+ SourceString expectedName = value.fields[0].toDartString().source; |
+ LibraryElement deferredLibrary = library.getDependency(tag); |
+ link = link.prepend(deferredLibrary); |
+ note(tag, 'Defer loading of $deferredLibrary'); |
+ SourceString actualName = |
+ new SourceString(deferredLibrary.getLibraryOrScriptName()); |
+ if (expectedName != actualName) { |
+ compiler.reportErrorCode( |
+ metadata, |
+ MessageKind.GENERIC, |
+ {'text':'Library name mismatch "${expectedName.slowToString()}" != "${actualName.slowToString()}"'}); |
+ } else { |
+ note(metadata, '${actualName.slowToString()} matches $deferredLibrary'); |
+ } |
+ } |
+ } |
+ } |
+ return link; |
+ } |
+ |
+ void note(Spannable node, message) { |
+ compiler.reportMessage(compiler.spanFromSpannable(node), |
+ MessageKind.GENERIC.error({'text': message}), |
+ api.Diagnostic.INFO); |
+ } |
+} |