| Index: pkg/analyzer2dart/lib/src/cps_generator.dart
|
| diff --git a/pkg/analyzer2dart/lib/src/cps_generator.dart b/pkg/analyzer2dart/lib/src/cps_generator.dart
|
| index 905e60885898d08e2304c3bff4a07195fedc74f0..55b5dfd01de76a1b8e4190fc31844d7e077ed170 100644
|
| --- a/pkg/analyzer2dart/lib/src/cps_generator.dart
|
| +++ b/pkg/analyzer2dart/lib/src/cps_generator.dart
|
| @@ -36,8 +36,13 @@ class CpsGeneratingVisitor extends SemanticVisitor<ir.Node>
|
| ir.Node visit(AstNode node) => node.accept(this);
|
|
|
| @override
|
| - ir.FunctionDefinition visitFunctionDeclaration(FunctionDeclaration node) {
|
| - analyzer.FunctionElement function = node.element;
|
| + ir.Primitive visitFunctionExpression(FunctionExpression node) {
|
| + return irBuilder.buildFunctionExpression(
|
| + handleFunctionDeclaration(node.element, node));
|
| + }
|
| +
|
| + ir.FunctionDefinition handleFunctionDeclaration(
|
| + analyzer.FunctionElement function, FunctionExpression node) {
|
| dart2js.FunctionElement element = converter.convertElement(function);
|
| return withBuilder(
|
| new IrBuilder(DART_CONSTANT_SYSTEM,
|
| @@ -52,11 +57,26 @@ class CpsGeneratingVisitor extends SemanticVisitor<ir.Node>
|
| });
|
| // Visit the body directly to avoid processing the signature as
|
| // expressions.
|
| - visit(node.functionExpression.body);
|
| + visit(node.body);
|
| return irBuilder.buildFunctionDefinition(element, const []);
|
| });
|
| }
|
|
|
| + @override
|
| + ir.FunctionDefinition visitFunctionDeclaration(FunctionDeclaration node) {
|
| + return handleFunctionDeclaration(node.element, node.functionExpression);
|
| + }
|
| +
|
| + @override
|
| + visitFunctionDeclarationStatement(FunctionDeclarationStatement node) {
|
| + FunctionDeclaration functionDeclaration = node.functionDeclaration;
|
| + analyzer.FunctionElement function = functionDeclaration.element;
|
| + dart2js.FunctionElement element = converter.convertElement(function);
|
| + ir.FunctionDefinition definition = handleFunctionDeclaration(
|
| + function, functionDeclaration.functionExpression);
|
| + irBuilder.declareLocalFunction(element, definition);
|
| + }
|
| +
|
| List<ir.Definition> visitArguments(ArgumentList argumentList) {
|
| List<ir.Definition> arguments = <ir.Definition>[];
|
| for (Expression argument in argumentList.arguments) {
|
| @@ -103,6 +123,46 @@ class CpsGeneratingVisitor extends SemanticVisitor<ir.Node>
|
| }
|
|
|
| @override
|
| + ir.Node visitLocalFunctionAccess(AstNode node, AccessSemantics semantics) {
|
| + return handleLocalAccess(node, semantics);
|
| + }
|
| +
|
| + ir.Primitive handleLocalInvocation(MethodInvocation node,
|
| + AccessSemantics semantics) {
|
| + analyzer.Element staticElement = semantics.element;
|
| + dart2js.Element element = converter.convertElement(staticElement);
|
| + List<ir.Definition> arguments = visitArguments(node.argumentList);
|
| + return irBuilder.buildLocalInvocation(
|
| + element,
|
| + createSelectorFromMethodInvocation(
|
| + node.argumentList, node.methodName.name),
|
| + arguments);
|
| + }
|
| +
|
| + @override
|
| + ir.Node visitLocalVariableInvocation(MethodInvocation node,
|
| + AccessSemantics semantics) {
|
| + return handleLocalInvocation(node, semantics);
|
| + }
|
| +
|
| + @override
|
| + ir.Primitive visitLocalFunctionInvocation(MethodInvocation node,
|
| + AccessSemantics semantics) {
|
| + return handleLocalInvocation(node, semantics);
|
| + }
|
| +
|
| + @override
|
| + ir.Primitive visitFunctionExpressionInvocation(
|
| + FunctionExpressionInvocation node) {
|
| + ir.Primitive target = build(node.function);
|
| + List<ir.Definition> arguments = visitArguments(node.argumentList);
|
| + return irBuilder.buildFunctionExpressionInvocation(
|
| + target,
|
| + createSelectorFromMethodInvocation(node.argumentList, 'call'),
|
| + arguments);
|
| + }
|
| +
|
| + @override
|
| ir.Primitive visitInstanceCreationExpression(
|
| InstanceCreationExpression node) {
|
| analyzer.Element staticElement = node.staticElement;
|
|
|