Chromium Code Reviews| Index: pkg/compiler/lib/src/kernel/kernel_visitor.dart |
| diff --git a/pkg/compiler/lib/src/kernel/kernel_visitor.dart b/pkg/compiler/lib/src/kernel/kernel_visitor.dart |
| index 8ba98d0bea7888a493cd276aa5633eabf2f41ff5..f947a3f247d06f498b39de8e6e96385fbeba7574 100644 |
| --- a/pkg/compiler/lib/src/kernel/kernel_visitor.dart |
| +++ b/pkg/compiler/lib/src/kernel/kernel_visitor.dart |
| @@ -214,6 +214,10 @@ class KernelVisitor extends Object |
| bool isVoidContext = false; |
| + /// If non-null, reference to a deferred library that a subsequent getter is |
| + /// using. |
| + ir.DeferredImport _deferredLibrary; |
| + |
| KernelVisitor(this.currentElement, this.elements, this.kernel); |
| KernelVisitor get sendVisitor => this; |
| @@ -363,7 +367,16 @@ class KernelVisitor extends Object |
| } |
| @override |
| - void previsitDeferredAccess(Send node, PrefixElement prefix, _) {} |
| + void previsitDeferredAccess(Send node, PrefixElement prefix, _) { |
| + // This is visited before any element access, and if it is deferred, |
| + // prefix.isDeferred = true. |
| + if (prefix != null && prefix.isDeferred) { |
| + _deferredLibrary = new ir.DeferredImport( |
| + kernel.libraries[prefix.deferredImport.importedLibrary], prefix.name); |
| + } else { |
| + _deferredLibrary = null; |
| + } |
| + } |
| @override |
| internalError(Spannable spannable, String message) { |
| @@ -1994,7 +2007,14 @@ class KernelVisitor extends Object |
| } |
| ir.Expression buildStaticGet(Element element) { |
| - return buildStaticAccessor(element).buildSimpleRead(); |
| + var expression = buildStaticAccessor(element).buildSimpleRead(); |
| + if (_deferredLibrary != null) { |
| + ir.Let let = new ir.Let( |
| + makeOrReuseVariable(new ir.CheckLibraryIsLoaded(_deferredLibrary)), |
| + expression); |
| + return let; |
| + } |
| + return expression; |
| } |
| @override |
| @@ -2232,21 +2252,31 @@ class KernelVisitor extends Object |
| @override |
| ir.Expression handleStaticGetterGet(Send node, FunctionElement getter, _) { |
| if (getter.isDeferredLoaderGetter) { |
| - // TODO(ahe): Support deferred load. |
| - return new ir.InvalidExpression(); |
| + // This is the LoadLibrary call. |
| + var deferredLibrary = new ir.DeferredImport( |
|
sra1
2017/02/14 03:14:06
I would expect there to be a single shared Deferre
Emily Fortuna
2017/02/14 20:56:28
Changed to PutIfAbsent. I'm not convinced this is
|
| + kernel.libraries[getter.prefix.deferredImport.importedLibrary], |
| + getter.prefix.name); |
| + assert(deferredLibrary != null); |
| + return new ir.LoadLibrary(deferredLibrary); |
| } |
| - return buildStaticGet(getter); |
| + var expression = buildStaticGet(getter); |
| + return expression; |
| } |
| @override |
| ir.Expression handleStaticGetterInvoke(Send node, FunctionElement getter, |
| NodeList arguments, CallStructure callStructure, _) { |
| + var expression; |
| if (getter.isDeferredLoaderGetter) { |
| - // TODO(ahe): Support deferred load. |
| - return new ir.InvalidExpression(); |
| + var deferredLibrary = new ir.DeferredImport( |
| + kernel.libraries[getter.prefix.deferredImport.importedLibrary], |
| + getter.prefix.name); |
| + assert(deferredLibrary != null); |
| + expression = new ir.LoadLibrary(deferredLibrary); |
|
sra1
2017/02/14 03:14:06
This code is the same as above.
I'd put it in a se
Emily Fortuna
2017/02/14 20:56:28
done. See above.
|
| + } else { |
| + expression = buildStaticGet(getter); |
| } |
| - return associateNode( |
| - buildCall(buildStaticGet(getter), callStructure, arguments), node); |
| + return associateNode(buildCall(expression, callStructure, arguments), node); |
| } |
| @override |
| @@ -2816,7 +2846,8 @@ class KernelVisitor extends Object |
| if (currentElement.isGenerativeConstructor) { |
| return buildGenerativeConstructor(currentElement, null, null); |
| } else { |
| - return internalError(currentElement, "Unhandled synthetic function."); |
| + return internalError(currentElement, |
| + "Unhandled synthetic function."); |
| } |
| } else { |
| Node node = currentElement.node; |