Index: pkg/compiler/lib/src/ssa/builder_kernel.dart |
diff --git a/pkg/compiler/lib/src/ssa/builder_kernel.dart b/pkg/compiler/lib/src/ssa/builder_kernel.dart |
index 597d6fa9a55ef78c336b36dad2bf14199f7a9a31..ed3b4555efe4df498c5b697936017e8139072b7c 100644 |
--- a/pkg/compiler/lib/src/ssa/builder_kernel.dart |
+++ b/pkg/compiler/lib/src/ssa/builder_kernel.dart |
@@ -49,7 +49,6 @@ import 'type_builder.dart'; |
class KernelSsaGraphBuilder extends ir.Visitor |
with GraphBuilder, SsaBuilderFieldMixin { |
- final ir.Node target; |
final MemberEntity targetElement; |
/// The root node of [targetElement]. This is used as the key into the |
@@ -104,7 +103,6 @@ class KernelSsaGraphBuilder extends ir.Visitor |
KernelSsaGraphBuilder( |
this.targetElement, |
ClassEntity contextClass, |
- this.target, |
this.compiler, |
this._elementMap, |
this._typeInferenceMap, |
@@ -132,33 +130,42 @@ class KernelSsaGraphBuilder extends ir.Visitor |
return reporter.withCurrentElement(localsMap.currentMember, () { |
// TODO(het): no reason to do this here... |
HInstruction.idCounter = 0; |
- if (target is ir.Procedure) { |
- _targetFunction = (target as ir.Procedure).function; |
- buildFunctionNode(_targetFunction); |
- } else if (target is ir.Field) { |
- if (handleConstantField(targetElement, registry, closedWorld)) { |
- // No code is generated for `targetElement`: All references inline the |
- // constant value. |
- return null; |
- } else if (targetElement.isStatic || targetElement.isTopLevel) { |
- backend.constants.registerLazyStatic(targetElement); |
- } |
- buildField(target); |
- } else if (target is ir.Constructor) { |
- if (targetElement is ConstructorBodyEntity) { |
- buildConstructorBody(target); |
- } else { |
- buildConstructor(target); |
- } |
- } else if (target is ir.FunctionExpression) { |
- _targetFunction = (target as ir.FunctionExpression).function; |
- buildFunctionNode(_targetFunction); |
- } else if (target is ir.FunctionDeclaration) { |
- _targetFunction = (target as ir.FunctionDeclaration).function; |
- buildFunctionNode(_targetFunction); |
- } else { |
- throw 'No case implemented to handle target: ' |
- '$target for $targetElement'; |
+ MemberDefinition definition = |
+ _elementMap.getMemberDefinition(targetElement); |
+ |
+ switch (definition.kind) { |
+ case MemberKind.regular: |
+ case MemberKind.closureCall: |
+ ir.Node target = definition.node; |
+ if (target is ir.Procedure) { |
+ _targetFunction = target.function; |
+ buildFunctionNode(_targetFunction); |
+ } else if (target is ir.Field) { |
+ if (handleConstantField(targetElement, registry, closedWorld)) { |
+ // No code is generated for `targetElement`: All references inline the |
+ // constant value. |
+ return null; |
+ } else if (targetElement.isStatic || targetElement.isTopLevel) { |
+ backend.constants.registerLazyStatic(targetElement); |
+ } |
+ buildField(target); |
+ } else if (target is ir.FunctionExpression) { |
+ _targetFunction = target.function; |
+ buildFunctionNode(_targetFunction); |
+ } else if (target is ir.FunctionDeclaration) { |
+ _targetFunction = target.function; |
+ buildFunctionNode(_targetFunction); |
+ } else { |
+ throw 'No case implemented to handle target: ' |
+ '$target for $targetElement'; |
+ } |
+ break; |
+ case MemberKind.constructor: |
+ buildConstructor(definition.node); |
+ break; |
+ case MemberKind.constructorBody: |
+ buildConstructorBody(definition.node); |
+ break; |
} |
assert(graph.isValid()); |
return graph; |
@@ -168,7 +175,10 @@ class KernelSsaGraphBuilder extends ir.Visitor |
@override |
ConstantValue getFieldInitialConstantValue(FieldEntity field) { |
assert(field == targetElement); |
- return _elementMap.getFieldConstantValue(target); |
+ MemberDefinition definition = _elementMap.getMemberDefinition(field); |
+ assert(definition.kind == MemberKind.regular, |
+ failedAt(field, "Unexpected member definition: $definition")); |
+ return _elementMap.getFieldConstantValue(definition.node); |
} |
void buildField(ir.Field field) { |