Chromium Code Reviews| 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 30f66a53625d9a73e85ef0f75af659f0dfa3b336..2c01e31b380d3a060c55c1baf936e83492659613 100644 |
| --- a/pkg/compiler/lib/src/ssa/kernel_impact.dart |
| +++ b/pkg/compiler/lib/src/ssa/kernel_impact.dart |
| @@ -24,19 +24,29 @@ ResolutionImpact build(Compiler compiler, ResolvedAst resolvedAst) { |
| AstElement element = resolvedAst.element.implementation; |
| JavaScriptBackend backend = compiler.backend; |
| Kernel kernel = backend.kernelTask.kernel; |
| - ir.Procedure function = kernel.functions[element]; |
| - if (function == null) { |
| - print("FOUND NULL FUNCTION: $element"); |
| - print(kernel.functions); |
| - } |
| KernelImpactBuilder builder = |
| - new KernelImpactBuilder(function, element, resolvedAst, compiler, kernel); |
| - return builder.build(); |
| + new KernelImpactBuilder(resolvedAst, compiler, kernel); |
| + if (element.isFunction) { |
| + ir.Procedure function = kernel.functions[element]; |
| + if (function == null) { |
| + print("FOUND NULL FUNCTION: $element"); |
| + print(kernel.functions); |
|
Harry Terkelsen
2016/09/13 17:15:59
I am working on a change that will make kernel res
Johnni Winther
2016/09/16 10:46:10
Done.
|
| + } else { |
| + return builder.buildProcedure(function); |
| + } |
| + } else { |
| + ir.Field field = kernel.fields[element]; |
| + if (field == null) { |
| + print("FOUND NULL FUNCTION: $element"); |
| + print(kernel.functions); |
|
Harry Terkelsen
2016/09/13 17:15:59
should be kernel.fields, or just remove
Johnni Winther
2016/09/16 10:46:10
Done.
|
| + } else { |
| + return builder.buildField(field); |
| + } |
| + } |
| + return null; |
| } |
| class KernelImpactBuilder extends ir.Visitor { |
| - final ir.Procedure function; |
| - final FunctionElement functionElement; |
| final ResolvedAst resolvedAst; |
| final Compiler compiler; |
| @@ -45,42 +55,53 @@ class KernelImpactBuilder extends ir.Visitor { |
| ResolutionWorldImpactBuilder impactBuilder; |
| KernelAstAdapter astAdapter; |
| - KernelImpactBuilder(this.function, this.functionElement, this.resolvedAst, |
| - this.compiler, Kernel kernel) { |
| - this.impactBuilder = new ResolutionWorldImpactBuilder('$functionElement'); |
| + KernelImpactBuilder(this.resolvedAst, this.compiler, Kernel kernel) { |
| + this.impactBuilder = |
| + new ResolutionWorldImpactBuilder('${resolvedAst.element}'); |
| this.astAdapter = new KernelAstAdapter( |
| compiler.backend, |
| resolvedAst, |
| kernel.nodeToAst, |
| kernel.nodeToElement, |
| kernel.functions, |
| + kernel.fields, |
| kernel.classes, |
| kernel.libraries); |
| } |
| - ResolutionImpact build() { |
| - if (function.kind == ir.ProcedureKind.Method || |
| - function.kind == ir.ProcedureKind.Operator) { |
| - buildMethod(function); |
| - } else { |
| - compiler.reporter.internalError( |
| - functionElement, |
| - "Unable to compute resolution impact for this kind of Kernel " |
| - "procedure: ${function.kind}"); |
| - } |
| - return impactBuilder; |
| - } |
| - |
| /// Add a checked-mode type use of [type] if it is not `dynamic`. |
| - DartType checkType(DartType type) { |
| + DartType checkType(ir.DartType irType) { |
| + DartType type = astAdapter.getDartType(irType); |
| if (!type.isDynamic) { |
| impactBuilder.registerTypeUse(new TypeUse.checkedModeCheck(type)); |
| } |
| return type; |
| } |
| - void buildMethod(ir.Procedure method) { |
| - method.function.body.accept(this); |
| + ResolutionImpact buildField(ir.Field field) { |
| + checkType(field.type); |
| + if (field.initializer != null) { |
| + field.initializer.accept(this); |
| + } else { |
| + impactBuilder.registerFeature(Feature.FIELD_WITHOUT_INITIALIZER); |
| + } |
| + return impactBuilder; |
| + } |
| + |
| + ResolutionImpact buildProcedure(ir.Procedure procedure) { |
| + if (procedure.kind == ir.ProcedureKind.Method || |
| + procedure.kind == ir.ProcedureKind.Operator) { |
| + checkType(procedure.function.returnType); |
| + procedure.function.positionalParameters.forEach((v) => checkType(v.type)); |
| + procedure.function.namedParameters.forEach((v) => checkType(v.type)); |
| + procedure.function.body.accept(this); |
| + } else { |
| + compiler.reporter.internalError( |
| + resolvedAst.element, |
| + "Unable to compute resolution impact for this kind of Kernel " |
| + "procedure: ${procedure.kind}"); |
| + } |
| + return impactBuilder; |
| } |
| void visitNodes(Iterable<ir.Node> nodes) { |
| @@ -144,8 +165,7 @@ class KernelImpactBuilder extends ir.Visitor { |
| @override |
| void visitListLiteral(ir.ListLiteral literal) { |
| visitNodes(literal.expressions); |
| - DartType elementType = |
| - checkType(astAdapter.getDartType(literal.typeArgument)); |
| + DartType elementType = checkType(literal.typeArgument); |
| impactBuilder.registerListLiteral(new ListLiteralUse( |
| compiler.coreTypes.listType(elementType), |
| @@ -156,8 +176,8 @@ class KernelImpactBuilder extends ir.Visitor { |
| @override |
| void visitMapLiteral(ir.MapLiteral literal) { |
| visitNodes(literal.entries); |
| - DartType keyType = checkType(astAdapter.getDartType(literal.keyType)); |
| - DartType valueType = checkType(astAdapter.getDartType(literal.valueType)); |
| + DartType keyType = checkType(literal.keyType); |
| + DartType valueType = checkType(literal.valueType); |
| impactBuilder.registerMapLiteral(new MapLiteralUse( |
| compiler.coreTypes.mapType(keyType, valueType), |
| isConstant: literal.isConst, |
| @@ -187,6 +207,12 @@ class KernelImpactBuilder extends ir.Visitor { |
| } |
| @override |
| + void visitStaticGet(ir.StaticGet node) { |
| + Element target = astAdapter.getElement(node.target).declaration; |
| + impactBuilder.registerStaticUse(new StaticUse.staticGet(target)); |
| + } |
| + |
| + @override |
| void visitMethodInvocation(ir.MethodInvocation invocation) { |
| invocation.receiver.accept(this); |
| _visitArguments(invocation.arguments); |