| 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 a27b429ebe750b96651950d8dbe2d8b87f8cdb56..b8ca03926356dc802591007acea44cf0bd8e4482 100644
|
| --- a/pkg/analyzer2dart/lib/src/cps_generator.dart
|
| +++ b/pkg/analyzer2dart/lib/src/cps_generator.dart
|
| @@ -22,6 +22,32 @@ import 'element_converter.dart';
|
| import 'util.dart';
|
| import 'identifier_semantics.dart';
|
|
|
| +/// Visitor that converts the AST node of an analyzer element into a CPS ir
|
| +/// node.
|
| +class CpsElementVisitor extends analyzer.SimpleElementVisitor<ir.Node> {
|
| + final ElementConverter converter;
|
| + final AstNode node;
|
| +
|
| + CpsElementVisitor(this.converter, this.node);
|
| +
|
| + @override
|
| + ir.FunctionDefinition visitFunctionElement(analyzer.FunctionElement element) {
|
| + CpsGeneratingVisitor visitor = new CpsGeneratingVisitor(converter, element);
|
| + FunctionDeclaration functionDeclaration = node;
|
| + return visitor.handleFunctionDeclaration(
|
| + element, functionDeclaration.functionExpression);
|
| + }
|
| +
|
| + @override
|
| + ir.FieldDefinition visitTopLevelVariableElement(
|
| + analyzer.TopLevelVariableElement element) {
|
| + CpsGeneratingVisitor visitor = new CpsGeneratingVisitor(converter, element);
|
| + VariableDeclaration variableDeclaration = node;
|
| + return visitor.handleFieldDeclaration(element, variableDeclaration);
|
| + }
|
| +}
|
| +
|
| +/// Visitor that converts analyzer AST nodes into CPS ir nodes.
|
| class CpsGeneratingVisitor extends SemanticVisitor<ir.Node>
|
| with IrBuilderMixin<AstNode> {
|
| final analyzer.Element element;
|
| @@ -35,10 +61,18 @@ class CpsGeneratingVisitor extends SemanticVisitor<ir.Node>
|
|
|
| ir.Node visit(AstNode node) => node.accept(this);
|
|
|
| - @override
|
| - ir.Primitive visitFunctionExpression(FunctionExpression node) {
|
| - return irBuilder.buildFunctionExpression(
|
| - handleFunctionDeclaration(node.element, node));
|
| + ir.FieldDefinition handleFieldDeclaration(
|
| + analyzer.PropertyInducingElement field, VariableDeclaration node) {
|
| + dart2js.FieldElement element = converter.convertElement(field);
|
| + return withBuilder(
|
| + new IrBuilder(DART_CONSTANT_SYSTEM,
|
| + element,
|
| + // TODO(johnniwinther): Supported closure variables.
|
| + const <dart2js.Local>[]),
|
| + () {
|
| + ir.Primitive initializer = build(node.initializer);
|
| + return irBuilder.makeFieldDefinition(initializer);
|
| + });
|
| }
|
|
|
| ir.FunctionDefinition handleFunctionDeclaration(
|
| @@ -58,11 +92,17 @@ class CpsGeneratingVisitor extends SemanticVisitor<ir.Node>
|
| // Visit the body directly to avoid processing the signature as
|
| // expressions.
|
| visit(node.body);
|
| - return irBuilder.buildFunctionDefinition(const []);
|
| + return irBuilder.makeFunctionDefinition(const []);
|
| });
|
| }
|
|
|
| @override
|
| + ir.Primitive visitFunctionExpression(FunctionExpression node) {
|
| + return irBuilder.buildFunctionExpression(
|
| + handleFunctionDeclaration(node.element, node));
|
| + }
|
| +
|
| + @override
|
| ir.FunctionDefinition visitFunctionDeclaration(FunctionDeclaration node) {
|
| return handleFunctionDeclaration(node.element, node.functionExpression);
|
| }
|
| @@ -292,6 +332,24 @@ class CpsGeneratingVisitor extends SemanticVisitor<ir.Node>
|
| }
|
|
|
| @override
|
| + ir.Node visitStaticFieldAssignment(AssignmentExpression node,
|
| + AccessSemantics semantics) {
|
| + if (node.operator.lexeme != '=') {
|
| + return giveUp(node, 'Assignment operator: ${node.operator.lexeme}');
|
| + }
|
| + analyzer.Element element = semantics.element;
|
| + dart2js.Element target = converter.convertElement(element);
|
| + // TODO(johnniwinther): Selector information should be computed in the
|
| + // [TreeShaker] and shared with the [CpsGeneratingVisitor].
|
| + assert(invariant(node, target.isTopLevel || target.isStatic,
|
| + '$target expected to be top-level or static.'));
|
| + return irBuilder.buildStaticSet(
|
| + target,
|
| + new Selector.setter(target.name, target.library),
|
| + build(node.rightHandSide));
|
| + }
|
| +
|
| + @override
|
| ir.Node visitDynamicAccess(AstNode node, AccessSemantics semantics) {
|
| // TODO(johnniwinther): Handle implicit `this`.
|
| ir.Primitive receiver = build(semantics.target);
|
|
|