Handful of closure issues.

Implement forEachParameter in closures, deal with not all closures being localFunctions, and point to the constructor head instead of body when calling "getConstructorBody"

This reverts commit b74f53aa74.

BUG=
R=sra@google.com

Review-Url: https://codereview.chromium.org/2999453002 .
This commit is contained in:
Emily Fortuna 2017-08-04 13:31:12 -07:00
parent 4d53ef3449
commit 15fdc7ceb0
2 changed files with 36 additions and 8 deletions

View file

@ -131,7 +131,12 @@ class KernelClosureConversionTask extends ClosureConversionTask<ir.Node> {
// We want the original declaration where that function is used to point
// to the correct closure class.
_closureRepresentationMap[closureClass.callMethod] = closureClass;
Entity entity = localsMap.getLocalFunction(node.parent);
Entity entity;
if (node.parent is ir.Member) {
entity = _elementMap.getMember(node.parent);
} else {
entity = localsMap.getLocalFunction(node.parent);
}
assert(entity != null);
_closureRepresentationMap[entity] = closureClass;
}
@ -337,7 +342,9 @@ class KernelClosureClass extends JsScopeInfo
this.library,
KernelScopeInfo info,
KernelToLocalsMap localsMap)
: closureEntity = localsMap.getLocalFunction(closureSourceNode.parent),
: closureEntity = closureSourceNode.parent is ir.Member
? null
: localsMap.getLocalFunction(closureSourceNode.parent),
super.from(info, localsMap);
ClassEntity get closureClassEntity => this;
@ -434,15 +441,35 @@ class ClosureMemberData implements MemberData {
class ClosureFunctionData extends ClosureMemberData implements FunctionData {
final FunctionType functionType;
final ir.FunctionNode functionNode;
ClosureFunctionData(MemberDefinition definition, this.functionType)
ClosureFunctionData(
ClosureMemberDefinition definition, this.functionType, this.functionNode)
: super(definition);
@override
void forEachParameter(KernelToElementMapForBuilding elementMap,
void f(DartType type, String name, ConstantValue defaultValue)) {
// TODO(johnniwinther,efortuna): Implement this.
throw new UnimplementedError('ClosureFunctionData.forEachParameter');
void handleParameter(ir.VariableDeclaration node, {bool isOptional: true}) {
DartType type = elementMap.getDartType(node.type);
String name = node.name;
ConstantValue defaultValue;
if (isOptional) {
if (node.initializer != null) {
defaultValue = elementMap.getConstantValue(node.initializer);
} else {
defaultValue = new NullConstantValue();
}
}
f(type, name, defaultValue);
}
for (int i = 0; i < functionNode.positionalParameters.length; i++) {
handleParameter(functionNode.positionalParameters[i],
isOptional: i < functionNode.requiredParameterCount);
}
functionNode.namedParameters.toList()
..sort(namedOrdering)
..forEach(handleParameter);
}
@override

View file

@ -2026,7 +2026,8 @@ class JsKernelToElementMap extends KernelToElementMapBase
_memberData.add(new ClosureFunctionData(
new ClosureMemberDefinition(callMethod, closureData.definition.location,
MemberKind.closureCall, node.parent),
getFunctionType(node)));
getFunctionType(node),
node));
memberMap[cls.callMethod.name] = cls.callMethod;
return cls;
}
@ -2094,7 +2095,7 @@ class JsKernelToElementMap extends KernelToElementMapBase
(node is ir.Procedure && node.kind == ir.ProcedureKind.Factory)) {
FunctionEntity entity;
if (node.parent is ir.Constructor) {
entity = getConstructorBody(node);
entity = getConstructorBody(node.parent);
} else {
entity = getMember(node);
}