Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(428)

Unified Diff: pkg/analyzer2dart/lib/src/cps_generator.dart

Issue 762213002: Support top-level field declaration and assignment in analyzer2dart. (Closed) Base URL: https://dart.googlecode.com/svn/branches/bleeding_edge/dart
Patch Set: Updated cf. comments. Created 6 years ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « pkg/analyzer2dart/lib/src/converted_world.dart ('k') | pkg/analyzer2dart/lib/src/modely.dart » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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);
« no previous file with comments | « pkg/analyzer2dart/lib/src/converted_world.dart ('k') | pkg/analyzer2dart/lib/src/modely.dart » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698