Index: pkg/kernel/lib/transformations/closure/converter.dart |
diff --git a/pkg/kernel/lib/transformations/closure/converter.dart b/pkg/kernel/lib/transformations/closure/converter.dart |
index e1865f7fd6d90a6c04a8e0dbeba37456490f612f..d03da68508882601d79cab1f09f254952c9ce674 100644 |
--- a/pkg/kernel/lib/transformations/closure/converter.dart |
+++ b/pkg/kernel/lib/transformations/closure/converter.dart |
@@ -230,6 +230,7 @@ class ClosureConverter extends Transformer { |
} |
} |
rewriter = null; |
+ context = null; |
// Transform constructor body. |
FunctionNode function = node.function; |
if (function.body != null && function.body is! EmptyStatement) { |
@@ -424,6 +425,8 @@ class ClosureConverter extends Transformer { |
FunctionNode function = node.function; |
if (function.body != null) { |
+ bool hadSingleStatementBody = function.body is! Block; |
karlklose
2017/06/19 11:58:14
Please check if this is still required.
Dmitry Stefantsov
2017/06/19 12:12:44
Thanks for pointing to this! Apparently, DillLibr
|
+ |
setupContextForFunctionBody(function); |
VariableDeclaration self = thisAccess[currentMemberFunction]; |
if (self != null) { |
@@ -431,6 +434,22 @@ class ClosureConverter extends Transformer { |
} |
node.transformChildren(this); |
resetContext(); |
+ |
+ // Here a special case is handled: the body of the procedure was a single |
+ // statement and after the transformation it is a block with a single |
+ // statement inside. In this case we make this statement the body of the |
+ // procedure again. It is required to follow the conventions imposed by |
+ // [addClass] in [DillLibraryBuilder]. |
+ // See [dill_library_builder.dart] |
+ // (../../../../front_end/lib/src/fasta/dill/dill_library_builder.dart) |
+ // for details. |
+ if (hadSingleStatementBody && function.body is Block) { |
+ Block body = function.body; |
+ if (body.statements.length == 1) { |
+ function.body = body.statements[0]; |
+ function.body.parent = function; |
+ } |
+ } |
} |
return node; |
@@ -483,7 +502,7 @@ class ClosureConverter extends Transformer { |
TreeNode visitBlock(Block node) { |
return saveContext(() { |
BlockRewriter blockRewriter = rewriter = rewriter.forNestedBlock(node); |
- blockRewriter.transformStatements(node, this); |
+ blockRewriter.transformStatements(this); |
return node; |
}); |
} |
@@ -627,25 +646,26 @@ class ClosureConverter extends Transformer { |
} |
TreeNode visitStaticGet(StaticGet node) { |
- Member target = node.target; |
- if (target is Procedure && target.kind == ProcedureKind.Method) { |
- VariableDeclaration contextVariable = new VariableDeclaration( |
- "#contextParameter", |
- type: const VectorType()); |
- Expression expression = getTearOffExpression( |
- null, node.target, contextVariable, new NullLiteral()); |
- expression.transformChildren(this); |
- return expression; |
- } |
+ // TODO(dmitryas): Add support for tear-offs. When added, uncomment this. |
+ // |
+ // Member target = node.target; |
+ // if (target is Procedure && target.kind == ProcedureKind.Method) { |
+ // VariableDeclaration contextVariable = new VariableDeclaration( |
+ // "#contextParameter", |
+ // type: const VectorType()); |
+ // Expression expression = getTearOffExpression( |
+ // null, node.target, contextVariable, new NullLiteral()); |
+ // expression.transformChildren(this); |
+ // return expression; |
+ // } |
return super.visitStaticGet(node); |
} |
TreeNode visitPropertyGet(PropertyGet node) { |
Name tearOffName = tearOffGetterNames[node.name]; |
if (tearOffName != null) { |
- MethodInvocation replacement = new MethodInvocation( |
- node.receiver, tearOffName, new Arguments(<Expression>[])); |
- return super.visitMethodInvocation(replacement); |
+ PropertyGet replacement = new PropertyGet(node.receiver, tearOffName); |
+ return super.visitPropertyGet(replacement); |
} |
return super.visitPropertyGet(node); |
} |
@@ -871,7 +891,7 @@ class ClosureConverter extends Transformer { |
self, procedure, contextVariable, parent.expression))); |
Procedure tearOffMethod = new Procedure( |
- name, ProcedureKind.Method, tearOffMethodFunction, |
+ name, ProcedureKind.Getter, tearOffMethodFunction, |
fileUri: currentFileUri); |
newClassMembers.add(tearOffMethod); |