| Index: sdk/lib/_internal/compiler/implementation/elements/modelx.dart
|
| diff --git a/sdk/lib/_internal/compiler/implementation/elements/modelx.dart b/sdk/lib/_internal/compiler/implementation/elements/modelx.dart
|
| index eb48b99e04a22800f2bd563b2ab8db66228b09dc..0216cf4a00eaaadeed5142d8c3870c34204a6af3 100644
|
| --- a/sdk/lib/_internal/compiler/implementation/elements/modelx.dart
|
| +++ b/sdk/lib/_internal/compiler/implementation/elements/modelx.dart
|
| @@ -76,6 +76,7 @@ abstract class ElementX implements Element {
|
| return enclosingElement != null && enclosingElement.isClass();
|
| }
|
| bool isInstanceMember() => false;
|
| + bool isDeferredLoaderGetter() => false;
|
|
|
| bool isFactoryConstructor() => modifiers.isFactory();
|
| bool isGenerativeConstructor() =>
|
| @@ -696,6 +697,12 @@ class ImportScope {
|
| Importers importers = library.importers;
|
|
|
| String name = element.name;
|
| +
|
| + // The loadLibrary function always shadows existing bindings to that name.
|
| + if (element.isDeferredLoaderGetter()) {
|
| + importScope.remove(name);
|
| + // TODO(sigurdm): Print a hint.
|
| + }
|
| Element existing = importScope.putIfAbsent(name, () => element);
|
| importers.registerImport(element, import);
|
|
|
| @@ -1025,7 +1032,11 @@ class PrefixElementX extends ElementX implements PrefixElement {
|
|
|
| final ImportScope importScope = new ImportScope();
|
|
|
| - bool isDeferred = false;
|
| + bool get isDeferred => _deferredImport != null;
|
| +
|
| + // Only needed for deferred imports.
|
| + Import _deferredImport;
|
| + Import get deferredImport => _deferredImport;
|
|
|
| PrefixElementX(String prefix, Element enclosing, this.firstPosition)
|
| : super(prefix, ElementKind.PREFIX, enclosing);
|
| @@ -1042,8 +1053,8 @@ class PrefixElementX extends ElementX implements PrefixElement {
|
|
|
| accept(ElementVisitor visitor) => visitor.visitPrefixElement(this);
|
|
|
| - void markAsDeferred() {
|
| - isDeferred = true;
|
| + void markAsDeferred(Import deferredImport) {
|
| + _deferredImport = deferredImport;
|
| }
|
| }
|
|
|
| @@ -1655,6 +1666,44 @@ class FunctionElementX extends ElementX with AnalyzableElement
|
| accept(ElementVisitor visitor) => visitor.visitFunctionElement(this);
|
| }
|
|
|
| +class DeferredLoaderGetterElementX extends FunctionElementX {
|
| +
|
| + final PrefixElement prefix;
|
| +
|
| + DeferredLoaderGetterElementX(PrefixElement prefix)
|
| + : this.prefix = prefix,
|
| + super("loadLibrary",
|
| + ElementKind.FUNCTION,
|
| + Modifiers.EMPTY,
|
| + prefix, true);
|
| +
|
| + FunctionSignature computeSignature(Compiler compiler) {
|
| + if (functionSignature != null) return functionSignature;
|
| + compiler.withCurrentElement(this, () {
|
| + DartType inner = new FunctionType(this, compiler.types.dynamicType);
|
| + functionSignature = new FunctionSignatureX(const Link(),
|
| + const Link(), 0, 0, false, inner);
|
| + });
|
| + return functionSignature;
|
| + }
|
| +
|
| + bool isMember() => false;
|
| +
|
| + bool isForeign(Compiler compiler) => true;
|
| +
|
| + bool get isSynthesized => true;
|
| +
|
| + bool isFunction() => false;
|
| +
|
| + bool isDeferredLoaderGetter() => true;
|
| +
|
| + bool isGetter() => true;
|
| +
|
| + // By having position null, the enclosing elements location is printed in
|
| + // error messages.
|
| + Token position() => null;
|
| +}
|
| +
|
| class ConstructorBodyElementX extends FunctionElementX
|
| implements ConstructorBodyElement {
|
| FunctionElement constructor;
|
|
|