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

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

Issue 609783002: Support static field access in analyzer2dart. (Closed) Base URL: https://dart.googlecode.com/svn/branches/bleeding_edge/dart
Patch Set: Updated cf. comments. Created 6 years, 3 months 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/element_converter.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 db15b8fe39f88687540799182df83a20dc9d9327..ca4b66f5c9909cbf873cb97b75f4ae6ee81c88f5 100644
--- a/pkg/analyzer2dart/lib/src/cps_generator.dart
+++ b/pkg/analyzer2dart/lib/src/cps_generator.dart
@@ -7,24 +7,26 @@ library analyzer2dart.cps_generator;
import 'package:analyzer/analyzer.dart';
import 'package:compiler/implementation/elements/elements.dart' as dart2js;
+import 'package:analyzer/src/generated/source.dart';
import 'package:analyzer/src/generated/element.dart' as analyzer;
import 'package:compiler/implementation/cps_ir/cps_ir_nodes.dart' as ir;
import 'package:compiler/implementation/cps_ir/cps_ir_builder.dart';
+import 'package:compiler/implementation/universe/universe.dart';
+import 'semantic_visitor.dart';
import 'element_converter.dart';
-import 'tree_shaker.dart';
+import 'util.dart';
+import 'package:analyzer2dart/src/identifier_semantics.dart';
-
-class CpsGeneratingVisitor extends RecursiveAstVisitor<ir.Node> {
+class CpsGeneratingVisitor extends SemanticVisitor<ir.Node> {
+ final analyzer.Element element;
final ElementConverter converter;
final IrBuilder irBuilder = new IrBuilder();
- CpsGeneratingVisitor(this.converter);
+ CpsGeneratingVisitor(this.converter, this.element);
- giveUp(String reason) {
- throw new UnsupportedError(reason);
- }
+ Source get currentSource => element.source;
@override
ir.FunctionDefinition visitFunctionDeclaration(FunctionDeclaration node) {
@@ -42,21 +44,23 @@ class CpsGeneratingVisitor extends RecursiveAstVisitor<ir.Node> {
}
@override
- visitMethodInvocation(MethodInvocation node) {
- analyzer.Element staticElement = node.methodName.staticElement;
- if (staticElement != null) {
- dart2js.Element element = converter.convertElement(staticElement);
- List<ir.Definition> arguments = <ir.Definition>[];
- for (Expression argument in node.argumentList.arguments) {
- ir.Definition value = argument.accept(this);
- if (value == null) {
- giveUp('Unsupported argument: $argument (${argument.runtimeType}).');
- }
- arguments.add(value);
+ visitStaticMethodInvocation(MethodInvocation node,
+ AccessSemantics semantics) {
+ analyzer.Element staticElement = semantics.element;
+ dart2js.Element element = converter.convertElement(staticElement);
+ List<ir.Definition> arguments = <ir.Definition>[];
+ for (Expression argument in node.argumentList.arguments) {
+ ir.Definition value = argument.accept(this);
+ if (value == null) {
+ giveUp(argument,
+ 'Unsupported argument: $argument (${argument.runtimeType}).');
}
- return irBuilder.buildStaticInvocation(
- element, createSelectorFromMethodInvocation(node), arguments);
+ arguments.add(value);
}
+ return irBuilder.buildStaticInvocation(
+ element,
+ createSelectorFromMethodInvocation(node, node.methodName.name),
+ arguments);
}
@override
@@ -85,7 +89,7 @@ class CpsGeneratingVisitor extends RecursiveAstVisitor<ir.Node> {
if (value != null) {
return irBuilder.buildStringLiteral(value);
}
- giveUp("Non constant adjacent strings.");
+ giveUp(node, "Non constant adjacent strings.");
}
@override
@@ -95,7 +99,7 @@ class CpsGeneratingVisitor extends RecursiveAstVisitor<ir.Node> {
@override
visitStringInterpolation(StringInterpolation node) {
- giveUp("String interpolation.");
+ giveUp(node, "String interpolation.");
}
@override
@@ -108,16 +112,31 @@ class CpsGeneratingVisitor extends RecursiveAstVisitor<ir.Node> {
}
@override
- visitSimpleIdentifier(SimpleIdentifier node) {
- analyzer.Element element = node.staticElement;
- if (element != null) {
- dart2js.Element target = converter.convertElement(element);
- if (dart2js.Elements.isLocal(target)) {
- return irBuilder.buildGetLocal(target);
- }
- giveUp('Unhandled static reference: '
- '$node -> $target (${target.runtimeType})');
- }
- giveUp('Unresolved identifier: $node.');
+ ir.Node visitLocalVariableAccess(AstNode node, AccessSemantics semantics) {
+ return handleLocalAccess(node, semantics);
+ }
+
+ @override
+ ir.Node visitParameterAccess(AstNode node, AccessSemantics semantics) {
+ return handleLocalAccess(node, semantics);
+ }
+
+ ir.Primitive handleLocalAccess(AstNode node, AccessSemantics semantics) {
+ analyzer.Element element = semantics.element;
+ dart2js.Element target = converter.convertElement(element);
+ assert(invariant(node, target.isLocal, '$target expected to be local.'));
+ return irBuilder.buildGetLocal(target);
+ }
+
+ @override
+ ir.Node visitStaticFieldAccess(AstNode node, AccessSemantics semantics) {
+ 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.buildGetStatic(target,
+ new Selector.getter(target.name, target.library));
}
}
« no previous file with comments | « pkg/analyzer2dart/lib/src/converted_world.dart ('k') | pkg/analyzer2dart/lib/src/element_converter.dart » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698