Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(644)

Unified Diff: pkg/compiler/lib/src/ssa/kernel_impact.dart

Issue 2396173003: Handle constructor declarations. (Closed)
Patch Set: Created 4 years, 2 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « pkg/compiler/lib/src/resolution/members.dart ('k') | tests/compiler/dart2js/kernel/impact_test.dart » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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 4149291e819c35b3db4d9ef124976c027a06b6b6..16543987cedfbe3f3f19021cadbeeceabffcd06e 100644
--- a/pkg/compiler/lib/src/ssa/kernel_impact.dart
+++ b/pkg/compiler/lib/src/ssa/kernel_impact.dart
@@ -29,22 +29,33 @@ ResolutionImpact build(Compiler compiler, ResolvedAst resolvedAst) {
Kernel kernel = backend.kernelTask.kernel;
KernelImpactBuilder builder =
new KernelImpactBuilder(resolvedAst, compiler, kernel);
- if (element.isFunction || element.isGetter || element.isSetter) {
+ if (element.isFunction ||
+ element.isGetter ||
+ element.isSetter ||
+ element.isFactoryConstructor) {
ir.Procedure function = kernel.functions[element];
if (function == null) {
- print("FOUND NULL FUNCTION: $element");
+ throw "FOUND NULL FUNCTION: $element";
} else {
return builder.buildProcedure(function);
}
- } else {
+ } else if (element.isGenerativeConstructor) {
+ ir.Constructor constructor = kernel.functions[element];
+ if (constructor == null) {
+ throw "FOUND NULL CONSTRUCTOR: $element";
+ } else {
+ return builder.buildConstructor(constructor);
+ }
+ } else if (element.isField) {
ir.Field field = kernel.fields[element];
if (field == null) {
- print("FOUND NULL FIELD: $element");
+ throw "FOUND NULL FIELD: $element";
} else {
return builder.buildField(field);
}
+ } else {
+ throw new UnsupportedError("Unsupported element: $element");
}
- return null;
}
class KernelImpactBuilder extends ir.Visitor {
@@ -72,11 +83,21 @@ class KernelImpactBuilder extends ir.Visitor {
return type;
}
- /// Add a checked-mode type use of return type and parameters of [node].
- void checkFunctionTypes(ir.FunctionNode node) {
- checkType(node.returnType);
- node.positionalParameters.forEach((v) => checkType(v.type));
- node.namedParameters.forEach((v) => checkType(v.type));
+ /// Add checked-mode type use for the parameter type and constant for the
+ /// default value of [parameter].
+ void handleParameter(ir.VariableDeclaration parameter) {
+ checkType(parameter.type);
+ visitNode(parameter.initializer);
+ }
+
+ /// Add checked-mode type use for parameter and return types, and add
+ /// constants for default values.
+ void handleSignature(ir.FunctionNode node, {bool checkReturnType: true}) {
+ if (checkReturnType) {
+ checkType(node.returnType);
+ }
+ node.positionalParameters.forEach(handleParameter);
+ node.namedParameters.forEach(handleParameter);
}
ResolutionImpact buildField(ir.Field field) {
@@ -92,31 +113,31 @@ class KernelImpactBuilder extends ir.Visitor {
return impactBuilder;
}
+ ResolutionImpact buildConstructor(ir.Constructor constructor) {
+ handleSignature(constructor.function, checkReturnType: false);
+ visitNodes(constructor.initializers);
+ visitNode(constructor.function.body);
+ return impactBuilder;
+ }
+
ResolutionImpact buildProcedure(ir.Procedure procedure) {
- if (procedure.kind != ir.ProcedureKind.Factory) {
- 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,
- "Unable to compute resolution impact for this kind of Kernel "
- "procedure: ${procedure.kind}");
+ handleSignature(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}");
}
return impactBuilder;
}
@@ -233,6 +254,14 @@ class KernelImpactBuilder extends ir.Visitor {
}
@override
+ void visitSuperInitializer(ir.SuperInitializer node) {
+ Element target = astAdapter.getElement(node.target).declaration;
+ _visitArguments(node.arguments);
+ impactBuilder.registerStaticUse(new StaticUse.superConstructorInvoke(
+ target, astAdapter.getCallStructure(node.arguments)));
+ }
+
+ @override
void visitStaticInvocation(ir.StaticInvocation node) {
Element target = astAdapter.getElement(node.target).declaration;
if (target.isFactoryConstructor) {
@@ -333,7 +362,7 @@ class KernelImpactBuilder extends ir.Visitor {
void visitFunctionDeclaration(ir.FunctionDeclaration node) {
impactBuilder
.registerStaticUse(new StaticUse.closure(astAdapter.getElement(node)));
- checkFunctionTypes(node.function);
+ handleSignature(node.function);
visitNode(node.function.body);
}
@@ -341,7 +370,7 @@ class KernelImpactBuilder extends ir.Visitor {
void visitFunctionExpression(ir.FunctionExpression node) {
impactBuilder
.registerStaticUse(new StaticUse.closure(astAdapter.getElement(node)));
- checkFunctionTypes(node.function);
+ handleSignature(node.function);
visitNode(node.function.body);
}
« no previous file with comments | « pkg/compiler/lib/src/resolution/members.dart ('k') | tests/compiler/dart2js/kernel/impact_test.dart » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698