mirror of
https://github.com/dart-lang/sdk
synced 2024-10-14 08:51:21 +00:00
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:
parent
4d53ef3449
commit
15fdc7ceb0
|
@ -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
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
|
Loading…
Reference in a new issue