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

Side by Side Diff: pkg/analyzer2dart/lib/src/cps_generator.dart

Issue 662593003: Support dynamic get/invocation in analyzer2dart. (Closed) Base URL: https://dart.googlecode.com/svn/branches/bleeding_edge/dart
Patch Set: Rebased Created 6 years, 2 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 unified diff | Download patch | Annotate | Revision Log
OLDNEW
1 // Copyright (c) 2014, the Dart project authors. Please see the AUTHORS file 1 // Copyright (c) 2014, the Dart project authors. Please see the AUTHORS file
2 // for details. All rights reserved. Use of this source code is governed by a 2 // for details. All rights reserved. Use of this source code is governed by a
3 // BSD-style license that can be found in the LICENSE file. 3 // BSD-style license that can be found in the LICENSE file.
4 4
5 library analyzer2dart.cps_generator; 5 library analyzer2dart.cps_generator;
6 6
7 import 'package:analyzer/analyzer.dart'; 7 import 'package:analyzer/analyzer.dart';
8 8
9 import 'package:compiler/implementation/elements/elements.dart' as dart2js; 9 import 'package:compiler/implementation/elements/elements.dart' as dart2js;
10 import 'package:analyzer/src/generated/source.dart'; 10 import 'package:analyzer/src/generated/source.dart';
11 import 'package:analyzer/src/generated/element.dart' as analyzer; 11 import 'package:analyzer/src/generated/element.dart' as analyzer;
12 12
13 import 'package:compiler/implementation/dart2jslib.dart' 13 import 'package:compiler/implementation/dart2jslib.dart'
14 show DART_CONSTANT_SYSTEM; 14 show DART_CONSTANT_SYSTEM;
15 import 'package:compiler/implementation/cps_ir/cps_ir_nodes.dart' as ir; 15 import 'package:compiler/implementation/cps_ir/cps_ir_nodes.dart' as ir;
16 import 'package:compiler/implementation/cps_ir/cps_ir_builder.dart'; 16 import 'package:compiler/implementation/cps_ir/cps_ir_builder.dart';
17 import 'package:compiler/implementation/universe/universe.dart'; 17 import 'package:compiler/implementation/universe/universe.dart';
18 18
19 import 'semantic_visitor.dart'; 19 import 'semantic_visitor.dart';
20 import 'element_converter.dart'; 20 import 'element_converter.dart';
21 import 'util.dart'; 21 import 'util.dart';
22 import 'package:analyzer2dart/src/identifier_semantics.dart'; 22 import 'identifier_semantics.dart';
23 23
24 class CpsGeneratingVisitor extends SemanticVisitor<ir.Node> 24 class CpsGeneratingVisitor extends SemanticVisitor<ir.Node>
25 with IrBuilderMixin { 25 with IrBuilderMixin {
26 final analyzer.Element element; 26 final analyzer.Element element;
27 final ElementConverter converter; 27 final ElementConverter converter;
28 28
29 CpsGeneratingVisitor(this.converter, this.element); 29 CpsGeneratingVisitor(this.converter, this.element);
30 30
31 Source get currentSource => element.source; 31 Source get currentSource => element.source;
32 32
(...skipping 13 matching lines...) Expand all
46 irBuilder.createParameter(converter.convertElement(parameter), 46 irBuilder.createParameter(converter.convertElement(parameter),
47 isClosureVariable: false); 47 isClosureVariable: false);
48 }); 48 });
49 // Visit the body directly to avoid processing the signature as 49 // Visit the body directly to avoid processing the signature as
50 // expressions. 50 // expressions.
51 node.functionExpression.body.accept(this); 51 node.functionExpression.body.accept(this);
52 return irBuilder.buildFunctionDefinition(element, const []); 52 return irBuilder.buildFunctionDefinition(element, const []);
53 }); 53 });
54 } 54 }
55 55
56 @override 56 List<ir.Definition> visitArguments(ArgumentList argumentList) {
57 visitStaticMethodInvocation(MethodInvocation node,
58 AccessSemantics semantics) {
59 analyzer.Element staticElement = semantics.element;
60 dart2js.Element element = converter.convertElement(staticElement);
61 List<ir.Definition> arguments = <ir.Definition>[]; 57 List<ir.Definition> arguments = <ir.Definition>[];
62 for (Expression argument in node.argumentList.arguments) { 58 for (Expression argument in argumentList.arguments) {
63 ir.Definition value = argument.accept(this); 59 ir.Definition value = argument.accept(this);
64 if (value == null) { 60 if (value == null) {
65 giveUp(argument, 61 giveUp(argument,
66 'Unsupported argument: $argument (${argument.runtimeType}).'); 62 'Unsupported argument: $argument (${argument.runtimeType}).');
67 } 63 }
68 arguments.add(value); 64 arguments.add(value);
69 } 65 }
66 return arguments;
67 }
68
69 @override
70 ir.Primitive visitDynamicInvocation(MethodInvocation node,
71 AccessSemantics semantics) {
72 // TODO(johnniwinther): Handle implicit `this`.
73 ir.Primitive receiver = semantics.target.accept(this);
74 List<ir.Definition> arguments = visitArguments(node.argumentList);
75 return irBuilder.buildDynamicInvocation(
76 receiver,
77 createSelectorFromMethodInvocation(node, node.methodName.name),
78 arguments);
79 }
80
81 @override
82 ir.Primitive visitStaticMethodInvocation(MethodInvocation node,
83 AccessSemantics semantics) {
84 analyzer.Element staticElement = semantics.element;
85 dart2js.Element element = converter.convertElement(staticElement);
86 List<ir.Definition> arguments = visitArguments(node.argumentList);
70 return irBuilder.buildStaticInvocation( 87 return irBuilder.buildStaticInvocation(
71 element, 88 element,
72 createSelectorFromMethodInvocation(node, node.methodName.name), 89 createSelectorFromMethodInvocation(node, node.methodName.name),
73 arguments); 90 arguments);
74 } 91 }
75 92
76 @override 93 @override
77 ir.Constant visitNullLiteral(NullLiteral node) { 94 ir.Constant visitNullLiteral(NullLiteral node) {
78 return irBuilder.buildNullLiteral(); 95 return irBuilder.buildNullLiteral();
79 } 96 }
(...skipping 60 matching lines...) Expand 10 before | Expand all | Expand 10 after
140 } 157 }
141 irBuilder.declareLocalVariable( 158 irBuilder.declareLocalVariable(
142 converter.convertElement(node.element), 159 converter.convertElement(node.element),
143 initialValue: initialValue); 160 initialValue: initialValue);
144 } 161 }
145 162
146 ir.Primitive handleLocalAccess(AstNode node, AccessSemantics semantics) { 163 ir.Primitive handleLocalAccess(AstNode node, AccessSemantics semantics) {
147 analyzer.Element element = semantics.element; 164 analyzer.Element element = semantics.element;
148 dart2js.Element target = converter.convertElement(element); 165 dart2js.Element target = converter.convertElement(element);
149 assert(invariant(node, target.isLocal, '$target expected to be local.')); 166 assert(invariant(node, target.isLocal, '$target expected to be local.'));
150 return irBuilder.buildGetLocal(target); 167 return irBuilder.buildLocalGet(target);
151 } 168 }
152 169
153 @override 170 @override
171 ir.Node visitDynamicAccess(AstNode node, AccessSemantics semantics) {
172 // TODO(johnniwinther): Handle implicit `this`.
173 ir.Primitive receiver = semantics.target.accept(this);
174 return irBuilder.buildDynamicGet(receiver,
175 new Selector.getter(semantics.identifier.name,
176 converter.convertElement(element.library)));
177 }
178
179 @override
154 ir.Node visitStaticFieldAccess(AstNode node, AccessSemantics semantics) { 180 ir.Node visitStaticFieldAccess(AstNode node, AccessSemantics semantics) {
155 analyzer.Element element = semantics.element; 181 analyzer.Element element = semantics.element;
156 dart2js.Element target = converter.convertElement(element); 182 dart2js.Element target = converter.convertElement(element);
157 // TODO(johnniwinther): Selector information should be computed in the 183 // TODO(johnniwinther): Selector information should be computed in the
158 // [TreeShaker] and shared with the [CpsGeneratingVisitor]. 184 // [TreeShaker] and shared with the [CpsGeneratingVisitor].
159 assert(invariant(node, target.isTopLevel || target.isStatic, 185 assert(invariant(node, target.isTopLevel || target.isStatic,
160 '$target expected to be top-level or static.')); 186 '$target expected to be top-level or static.'));
161 return irBuilder.buildGetStatic(target, 187 return irBuilder.buildStaticGet(target,
162 new Selector.getter(target.name, target.library)); 188 new Selector.getter(target.name, target.library));
163 } 189 }
164 } 190 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698