| 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..76c83b78acf6e840ee73453ad6d24b7d566da9d8 100644
|
| --- a/pkg/compiler/lib/src/ssa/kernel_impact.dart
|
| +++ b/pkg/compiler/lib/src/ssa/kernel_impact.dart
|
| @@ -24,19 +24,27 @@ 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");
|
| + } else {
|
| + return builder.buildProcedure(function);
|
| + }
|
| + } else {
|
| + ir.Field field = kernel.fields[element];
|
| + if (field == null) {
|
| + print("FOUND NULL FUNCTION: $element");
|
| + } 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 +53,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 +163,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 +174,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 +205,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);
|
|
|