Index: pkg/compiler/lib/src/ssa/kernel_impact.dart |
diff --git a/pkg/compiler/lib/src/ssa/kernel_impact.dart b/pkg/compiler/lib/src/ssa/kernel_impact.dart |
index c1f53ca930d876de0c02be960e284e3a72f59fcf..81b6358ac9ee5e56485d707b6ecf918c31b96d27 100644 |
--- a/pkg/compiler/lib/src/ssa/kernel_impact.dart |
+++ b/pkg/compiler/lib/src/ssa/kernel_impact.dart |
@@ -24,7 +24,7 @@ import '../common/resolution.dart'; |
/// Computes the [ResolutionImpact] for [resolvedAst] through kernel. |
ResolutionImpact build(Compiler compiler, ResolvedAst resolvedAst) { |
- AstElement element = resolvedAst.element.implementation; |
+ AstElement element = resolvedAst.element; |
JavaScriptBackend backend = compiler.backend; |
Kernel kernel = backend.kernelTask.kernel; |
KernelImpactBuilder builder = |
@@ -97,6 +97,22 @@ class KernelImpactBuilder extends ir.Visitor { |
procedure.kind == ir.ProcedureKind.Operator) { |
checkFunctionTypes(procedure.function); |
visitNode(procedure.function.body); |
+ switch (procedure.function.asyncMarker) { |
+ case ir.AsyncMarker.Sync: |
+ break; |
+ case ir.AsyncMarker.SyncStar: |
+ impactBuilder.registerFeature(Feature.SYNC_STAR); |
+ break; |
+ case ir.AsyncMarker.Async: |
+ impactBuilder.registerFeature(Feature.ASYNC); |
+ break; |
+ case ir.AsyncMarker.AsyncStar: |
+ impactBuilder.registerFeature(Feature.ASYNC_STAR); |
+ break; |
+ case ir.AsyncMarker.SyncYielding: |
+ compiler.reporter.internalError(resolvedAst.element, |
+ "Unexpected async marker: ${procedure.function.asyncMarker}"); |
+ } |
} else { |
compiler.reporter.internalError( |
resolvedAst.element, |
@@ -199,12 +215,29 @@ class KernelImpactBuilder extends ir.Visitor { |
} |
@override |
- void visitStaticInvocation(ir.StaticInvocation invocation) { |
- _visitArguments(invocation.arguments); |
- Element target = astAdapter.getElement(invocation.target).declaration; |
+ void visitConstructorInvocation(ir.ConstructorInvocation node) { |
+ handleNew(node, node.target); |
+ } |
+ |
+ void handleNew(ir.InvocationExpression node, ir.Member target) { |
+ _visitArguments(node.arguments); |
+ Element element = astAdapter.getElement(target).declaration; |
+ impactBuilder.registerStaticUse(new StaticUse.constructorInvoke( |
+ element, astAdapter.getCallStructure(node.arguments))); |
+ ClassElement cls = astAdapter.getElement(target.enclosingClass); |
+ List<DartType> typeArguments = |
+ astAdapter.getDartTypes(node.arguments.types); |
+ impactBuilder.registerTypeUse( |
+ new TypeUse.instantiation(new InterfaceType(cls, typeArguments))); |
+ if (typeArguments.any((DartType type) => !type.isDynamic)) { |
+ impactBuilder.registerFeature(Feature.TYPE_VARIABLE_BOUNDS_CHECK); |
+ } |
+ } |
+ |
+ @override |
+ void visitStaticInvocation(ir.StaticInvocation node) { |
+ Element target = astAdapter.getElement(node.target).declaration; |
if (target.isFactoryConstructor) { |
- impactBuilder.registerStaticUse(new StaticUse.constructorInvoke( |
- target, astAdapter.getCallStructure(invocation.arguments))); |
// TODO(johnniwinther): We should not mark the type as instantiated but |
// rather follow the type arguments directly. |
// |
@@ -227,18 +260,11 @@ class KernelImpactBuilder extends ir.Visitor { |
// to B. Currently, we only do this soundly if we register A<int> and |
// A<String> as instantiated. We should instead register that A.T is |
// instantiated as int and String. |
- ClassElement cls = |
- astAdapter.getElement(invocation.target.enclosingClass); |
- List<DartType> typeArguments = |
- astAdapter.getDartTypes(invocation.arguments.types); |
- impactBuilder.registerTypeUse( |
- new TypeUse.instantiation(new InterfaceType(cls, typeArguments))); |
- if (typeArguments.any((DartType type) => !type.isDynamic)) { |
- impactBuilder.registerFeature(Feature.TYPE_VARIABLE_BOUNDS_CHECK); |
- } |
+ handleNew(node, node.target); |
} else { |
+ _visitArguments(node.arguments); |
impactBuilder.registerStaticUse(new StaticUse.staticInvoke( |
- target, astAdapter.getCallStructure(invocation.arguments))); |
+ target, astAdapter.getCallStructure(node.arguments))); |
} |
} |
@@ -324,6 +350,40 @@ class KernelImpactBuilder extends ir.Visitor { |
} |
} |
+ @override |
+ void visitIsExpression(ir.IsExpression node) { |
+ impactBuilder.registerTypeUse( |
+ new TypeUse.isCheck(astAdapter.getDartType(node.type))); |
+ } |
+ |
+ @override |
+ void visitAsExpression(ir.AsExpression node) { |
+ impactBuilder |
+ .registerTypeUse(new TypeUse.asCast(astAdapter.getDartType(node.type))); |
+ } |
+ |
+ @override |
+ void visitThrow(ir.Throw node) { |
+ impactBuilder.registerFeature(Feature.THROW_EXPRESSION); |
+ visitNode(node.expression); |
+ } |
+ |
+ @override |
+ void visitForInStatement(ir.ForInStatement node) { |
+ visitNode(node.variable); |
+ visitNode(node.iterable); |
+ visitNode(node.body); |
+ if (node.isAsync) { |
+ impactBuilder.registerFeature(Feature.ASYNC_FOR_IN); |
+ } else { |
+ impactBuilder.registerFeature(Feature.SYNC_FOR_IN); |
+ impactBuilder |
+ .registerDynamicUse(new DynamicUse(Selectors.iterator, null)); |
+ } |
+ impactBuilder.registerDynamicUse(new DynamicUse(Selectors.current, null)); |
+ impactBuilder.registerDynamicUse(new DynamicUse(Selectors.moveNext, null)); |
+ } |
+ |
// TODO(johnniwinther): Make this throw and visit child nodes explicitly |
// instead to ensure that we don't visit unwanted parts of the ir. |
@override |