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

Side by Side Diff: pkg/compiler/lib/src/resolved_visitor.dart

Issue 1079533002: Handle SendSet and NewExpression through NewResolvedVisitor. (Closed) Base URL: https://dart.googlecode.com/svn/branches/bleeding_edge/dart
Patch Set: Fix problems with prefix/postfix and erroneous const invocations. Created 5 years, 8 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) 2012, the Dart project authors. Please see the AUTHORS file 1 // Copyright (c) 2012, 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 part of dart2js; 5 part of dart2js;
6 6
7 /// Enum for the visit methods added in [ResolvedVisitor]. 7 /// Enum for the visit methods added in [ResolvedVisitor].
8 // TODO(johnniwinther): Remove this. 8 // TODO(johnniwinther): Remove this.
9 enum ResolvedKind { 9 enum ResolvedKind {
10 ASSERT, 10 ASSERT,
11 TYPE_LITERAL, 11 TYPE_LITERAL,
12 SUPER, 12 SUPER,
13 OPERATOR, 13 OPERATOR,
14 TYPE_PREFIX, 14 TYPE_PREFIX,
15 GETTER, 15 GETTER,
16 STATIC, 16 STATIC,
17 CLOSURE, 17 CLOSURE,
18 DYNAMIC, 18 DYNAMIC,
19 ERROR, 19 ERROR,
20 SEND_SET,
21 NEW,
20 } 22 }
21 23
22 /// Abstract interface for a [ResolvedVisitor]. 24 /// Abstract interface for a [ResolvedVisitor].
23 // TODO(johnniwinther): Remove this. 25 // TODO(johnniwinther): Remove this.
24 abstract class ResolvedKindVisitor<R> { 26 abstract class ResolvedKindVisitor<R> {
25 R visitSuperSend(Send node); 27 R visitSuperSend(Send node);
26 R visitOperatorSend(Send node); 28 R visitOperatorSend(Send node);
27 R visitGetterSend(Send node); 29 R visitGetterSend(Send node);
28 R visitClosureSend(Send node); 30 R visitClosureSend(Send node);
29 R visitDynamicSend(Send node); 31 R visitDynamicSend(Send node);
30 R visitStaticSend(Send node); 32 R visitStaticSend(Send node);
33 R handleSendSet(SendSet node);
34 R handleNewExpression(NewExpression node);
31 35
32 /// Visitor callback for a type literal. 36 /// Visitor callback for a type literal.
33 R visitTypeLiteralSend(Send node); 37 R visitTypeLiteralSend(Send node);
34 38
35 /// Visitor callback for the class prefix of a static access, like `Foo` in 39 /// Visitor callback for the class prefix of a static access, like `Foo` in
36 /// `Foo.staticField`. 40 /// `Foo.staticField`.
37 // TODO(johnniwinther): Remove this when not needed by the dart backend. 41 // TODO(johnniwinther): Remove this when not needed by the dart backend.
38 R visitTypePrefixSend(Send node); 42 R visitTypePrefixSend(Send node);
39 43
40 R visitAssertSend(Send node); 44 R visitAssertSend(Send node);
41 45
42 internalError(Spannable node, String reason); 46 internalError(Spannable node, String reason);
43 } 47 }
44 48
45 /// Visitor that returns the [ResolvedKind] corresponding to the called visitor 49 /// Visitor that returns the [ResolvedKind] corresponding to the called visitor
46 /// method. 50 /// method.
47 class ResolvedKindComputer implements ResolvedKindVisitor { 51 class ResolvedKindComputer implements ResolvedKindVisitor {
48 const ResolvedKindComputer(); 52 const ResolvedKindComputer();
49 53
50 ResolvedKind visitSuperSend(Send node) => ResolvedKind.SUPER; 54 ResolvedKind visitSuperSend(Send node) => ResolvedKind.SUPER;
51 ResolvedKind visitOperatorSend(Send node) => ResolvedKind.OPERATOR; 55 ResolvedKind visitOperatorSend(Send node) => ResolvedKind.OPERATOR;
52 ResolvedKind visitGetterSend(Send node) => ResolvedKind.GETTER; 56 ResolvedKind visitGetterSend(Send node) => ResolvedKind.GETTER;
53 ResolvedKind visitClosureSend(Send node) => ResolvedKind.CLOSURE; 57 ResolvedKind visitClosureSend(Send node) => ResolvedKind.CLOSURE;
54 ResolvedKind visitDynamicSend(Send node) => ResolvedKind.DYNAMIC; 58 ResolvedKind visitDynamicSend(Send node) => ResolvedKind.DYNAMIC;
55 ResolvedKind visitStaticSend(Send node) => ResolvedKind.STATIC; 59 ResolvedKind visitStaticSend(Send node) => ResolvedKind.STATIC;
56 ResolvedKind visitTypeLiteralSend(Send node) => ResolvedKind.TYPE_LITERAL; 60 ResolvedKind visitTypeLiteralSend(Send node) => ResolvedKind.TYPE_LITERAL;
57 ResolvedKind visitTypePrefixSend(Send node) => ResolvedKind.TYPE_PREFIX; 61 ResolvedKind visitTypePrefixSend(Send node) => ResolvedKind.TYPE_PREFIX;
58 ResolvedKind visitAssertSend(Send node) => ResolvedKind.ASSERT; 62 ResolvedKind visitAssertSend(Send node) => ResolvedKind.ASSERT;
63 ResolvedKind handleSendSet(SendSet node) => ResolvedKind.SEND_SET;
64 ResolvedKind handleNewExpression(NewExpression node) => ResolvedKind.NEW;
59 internalError(Spannable node, String reason) => ResolvedKind.ERROR; 65 internalError(Spannable node, String reason) => ResolvedKind.ERROR;
60 } 66 }
61 67
62 abstract class ResolvedVisitor<R> 68 abstract class ResolvedVisitor<R>
63 implements Visitor<R>, ResolvedKindVisitor<R> {} 69 implements Visitor<R>, ResolvedKindVisitor<R> {}
64 70
65 abstract class BaseResolvedVisitor<R> extends Visitor<R> 71 abstract class BaseResolvedVisitor<R> extends Visitor<R>
66 implements ResolvedVisitor<R> { 72 implements ResolvedVisitor<R> {
67 73
68 TreeElements elements; 74 TreeElements elements;
(...skipping 54 matching lines...) Expand 10 before | Expand all | Expand 10 after
123 } 129 }
124 130
125 // TODO(johnniwinther): Remove this. Currently need by the old dart2dart 131 // TODO(johnniwinther): Remove this. Currently need by the old dart2dart
126 // backend. 132 // backend.
127 abstract class OldResolvedVisitor<R> extends BaseResolvedVisitor<R> { 133 abstract class OldResolvedVisitor<R> extends BaseResolvedVisitor<R> {
128 OldResolvedVisitor(TreeElements elements) : super(elements); 134 OldResolvedVisitor(TreeElements elements) : super(elements);
129 135
130 R visitSend(Send node) { 136 R visitSend(Send node) {
131 return _oldDispatch(node, this); 137 return _oldDispatch(node, this);
132 } 138 }
139
140 R visitSendSet(SendSet node) {
141 return handleSendSet(node);
142 }
143
144 R visitNewExpression(NewExpression node) {
145 return handleNewExpression(node);
146 }
133 } 147 }
134 148
135 abstract class NewResolvedVisitor<R> extends BaseResolvedVisitor<R> 149 abstract class NewResolvedVisitor<R> extends BaseResolvedVisitor<R>
136 with SendResolverMixin, 150 with SendResolverMixin,
137 GetBulkMixin<R, dynamic>, 151 GetBulkMixin<R, dynamic>,
138 SetBulkMixin<R, dynamic>, 152 SetBulkMixin<R, dynamic>,
139 ErrorBulkMixin<R, dynamic>, 153 ErrorBulkMixin<R, dynamic>,
140 InvokeBulkMixin<R, dynamic>, 154 InvokeBulkMixin<R, dynamic>,
141 IndexSetBulkMixin<R, dynamic>, 155 IndexSetBulkMixin<R, dynamic>,
142 CompoundBulkMixin<R, dynamic>, 156 CompoundBulkMixin<R, dynamic>,
(...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after
178 if (sendStructure != null) { 192 if (sendStructure != null) {
179 var arg = sendVisitor == _resolvedKindDispatcher 193 var arg = sendVisitor == _resolvedKindDispatcher
180 ? kindVisitor : sendStructure; 194 ? kindVisitor : sendStructure;
181 return sendStructure.dispatch(sendVisitor, node, arg); 195 return sendStructure.dispatch(sendVisitor, node, arg);
182 } else { 196 } else {
183 return kindVisitor.visitStaticSend(node); 197 return kindVisitor.visitStaticSend(node);
184 } 198 }
185 } 199 }
186 } 200 }
187 201
202 bool checkResolvedKind(Node node,
203 ResolvedKind oldKind,
204 ResolvedKind newKind) {
205 return invariant(node, oldKind == newKind, message: '$oldKind != $newKind');
206 }
207
208 ResolvedKind computeResolvedKindFromStructure(
209 Node node, SemanticSendStructure structure) {
210 return structure.dispatch(
211 _resolvedKindDispatcher, node, const ResolvedKindComputer());
212 }
213
214 @override
188 R visitSend(Send node) { 215 R visitSend(Send node) {
189 ResolvedKind oldKind; 216 assert(checkResolvedKind(
190 ResolvedKind newKind; 217 node,
191 assert(invariant(node, () { 218 _oldDispatch(node, const ResolvedKindComputer()),
192 oldKind = _oldDispatch(node, const ResolvedKindComputer()); 219 _newDispatch(node, const ResolvedKindComputer(),
193 newKind = _newDispatch( 220 _resolvedKindDispatcher)));
194 node, const ResolvedKindComputer(), _resolvedKindDispatcher);
195 return oldKind == newKind;
196 }, message: () => '$oldKind != $newKind'));
197 return _newDispatch(node, this, this); 221 return _newDispatch(node, this, this);
198 } 222 }
199 223
200 @override 224 @override
225 R visitSendSet(Send node) {
226 SendStructure structure = computeSendStructure(node);
227 if (structure == null) {
228 return internalError(node, 'No structure for $node');
229 } else {
230 assert(checkResolvedKind(node,
231 ResolvedKind.SEND_SET,
232 computeResolvedKindFromStructure(node, structure)));
233 return structure.dispatch(this, node, structure);
234 }
235 }
236
237 @override
238 R visitNewExpression(NewExpression node) {
239 NewStructure structure = computeNewStructure(node);
240 if (structure == null) {
241 return internalError(node, 'No structure for $node');
242 } else {
243 assert(checkResolvedKind(node,
244 ResolvedKind.NEW,
245 computeResolvedKindFromStructure(node, structure)));
246 return structure.dispatch(this, node, structure);
247 }
248 }
249
250 @override
201 R apply(Node node, arg) { 251 R apply(Node node, arg) {
202 return visitNode(node); 252 return visitNode(node);
203 } 253 }
204 254
205 @override 255 @override
206 R bulkHandleNode( 256 R bulkHandleNode(
207 Node node, 257 Node node,
208 String message, 258 String message,
209 SendStructure sendStructure) { 259 SemanticSendStructure structure) {
210 return sendStructure.dispatch(_semanticDispatcher, node, this); 260 return structure.dispatch(_semanticDispatcher, node, this);
211 } 261 }
212 } 262 }
213 263
214 /// Visitor that dispatches [SemanticSendVisitor] calls to the corresponding 264 /// Visitor that dispatches [SemanticSendVisitor] calls to the corresponding
215 /// visit methods in [ResolvedVisitor]. 265 /// visit methods in [ResolvedVisitor].
216 class ResolvedSemanticDispatcher<R> extends Object 266 class ResolvedSemanticDispatcher<R> extends Object
217 with GetBulkMixin<R, ResolvedKindVisitor<R>>, 267 with GetBulkMixin<R, ResolvedKindVisitor<R>>,
218 SetBulkMixin<R, ResolvedKindVisitor<R>>, 268 SetBulkMixin<R, ResolvedKindVisitor<R>>,
219 InvokeBulkMixin<R, ResolvedKindVisitor<R>>, 269 InvokeBulkMixin<R, ResolvedKindVisitor<R>>,
220 PrefixBulkMixin<R, ResolvedKindVisitor<R>>, 270 PrefixBulkMixin<R, ResolvedKindVisitor<R>>,
(...skipping 11 matching lines...) Expand all
232 R apply(Node node, ResolvedKindVisitor<R> visitor) { 282 R apply(Node node, ResolvedKindVisitor<R> visitor) {
233 return visitor.internalError( 283 return visitor.internalError(
234 node, "ResolvedSemanticDispatcher.apply unsupported."); 284 node, "ResolvedSemanticDispatcher.apply unsupported.");
235 } 285 }
236 286
237 @override 287 @override
238 R bulkHandleNode( 288 R bulkHandleNode(
239 Node node, 289 Node node,
240 String message, 290 String message,
241 ResolvedKindVisitor<R> visitor) { 291 ResolvedKindVisitor<R> visitor) {
242 // Set, Compound, IndexSet, and NewExpression are not handled by
243 // [ResolvedVisitor].
244 return bulkHandleError(node, visitor); 292 return bulkHandleError(node, visitor);
245 } 293 }
246 294
247 R bulkHandleError(Node node, ResolvedKindVisitor<R> visitor) { 295 R bulkHandleError(Node node, ResolvedKindVisitor<R> visitor) {
248 return visitor.internalError(node, "No resolved kind for node."); 296 if (node.asSendSet() != null) {
297 return visitor.handleSendSet(node);
298 } else if (node.asNewExpression() != null) {
299 return visitor.handleNewExpression(node);
300 }
301 return visitor.internalError(node, "No resolved kind for $node.");
249 } 302 }
250 303
251 @override 304 @override
252 R bulkHandleGet(Node node, ResolvedKindVisitor<R> visitor) { 305 R bulkHandleGet(Node node, ResolvedKindVisitor<R> visitor) {
253 return visitor.visitGetterSend(node); 306 return visitor.visitGetterSend(node);
254 } 307 }
255 308
256 @override 309 @override
257 R bulkHandleInvoke(Node node, ResolvedKindVisitor<R> visitor) { 310 R bulkHandleInvoke(Node node, ResolvedKindVisitor<R> visitor) {
258 // Most invokes are static. 311 // Most invokes are static.
259 return visitor.visitStaticSend(node); 312 return visitor.visitStaticSend(node);
260 } 313 }
261 314
262 @override 315 @override
263 R bulkHandlePrefix(Node node, ResolvedKindVisitor<R> visitor) { 316 R bulkHandlePrefix(Node node, ResolvedKindVisitor<R> visitor) {
264 return visitor.visitOperatorSend(node); 317 return visitor.handleSendSet(node);
265 } 318 }
266 319
267 @override 320 @override
268 R bulkHandlePostfix(Node node, ResolvedKindVisitor<R> visitor) { 321 R bulkHandlePostfix(Node node, ResolvedKindVisitor<R> visitor) {
269 return visitor.visitOperatorSend(node); 322 return visitor.handleSendSet(node);
270 } 323 }
271 324
272 @override 325 @override
273 R bulkHandleSuper(Node node, ResolvedKindVisitor<R> visitor) { 326 R bulkHandleSuper(Node node, ResolvedKindVisitor<R> visitor) {
327 if (node.asSendSet() != null) {
328 return visitor.handleSendSet(node);
329 }
274 return visitor.visitSuperSend(node); 330 return visitor.visitSuperSend(node);
275 } 331 }
276 332
277 @override 333 @override
334 R bulkHandleSet(SendSet node, ResolvedKindVisitor<R> visitor) {
335 return visitor.handleSendSet(node);
336 }
337
338 @override
339 R bulkHandleCompound(SendSet node, ResolvedKindVisitor<R> visitor) {
340 return visitor.handleSendSet(node);
341 }
342
343 @override
344 R bulkHandleIndexSet(SendSet node, ResolvedKindVisitor<R> visitor) {
345 return visitor.handleSendSet(node);
346 }
347
348 @override
349 R bulkHandleNew(NewExpression node, ResolvedKindVisitor<R> visitor) {
350 return visitor.handleNewExpression(node);
351 }
352
353 @override
278 R errorInvalidAssert( 354 R errorInvalidAssert(
279 Send node, 355 Send node,
280 NodeList arguments, 356 NodeList arguments,
281 ResolvedKindVisitor<R> visitor) { 357 ResolvedKindVisitor<R> visitor) {
282 return visitor.visitAssertSend(node); 358 return visitor.visitAssertSend(node);
283 } 359 }
284 360
285 @override 361 @override
286 R errorLocalFunctionPostfix( 362 R errorLocalFunctionPostfix(
287 Send node, 363 Send node,
288 LocalFunctionElement function, 364 LocalFunctionElement function,
289 op.IncDecOperator operator, 365 op.IncDecOperator operator,
290 ResolvedKindVisitor<R> visitor) { 366 ResolvedKindVisitor<R> visitor) {
291 return visitor.visitOperatorSend(node); 367 return visitor.handleSendSet(node);
292 } 368 }
293 369
294 @override 370 @override
295 R errorLocalFunctionPrefix( 371 R errorLocalFunctionPrefix(
296 Send node, 372 Send node,
297 LocalFunctionElement function, 373 LocalFunctionElement function,
298 op.IncDecOperator operator, 374 op.IncDecOperator operator,
299 ResolvedKindVisitor<R> visitor) { 375 ResolvedKindVisitor<R> visitor) {
300 return visitor.visitOperatorSend(node); 376 return visitor.handleSendSet(node);
301 } 377 }
302 378
303 @override 379 @override
304 R errorStaticSetterGet( 380 R errorStaticSetterGet(
305 Send node, 381 Send node,
306 FunctionElement setter, 382 FunctionElement setter,
307 ResolvedKindVisitor<R> visitor) { 383 ResolvedKindVisitor<R> visitor) {
308 return visitor.visitGetterSend(node); 384 return visitor.visitGetterSend(node);
309 } 385 }
310 386
(...skipping 85 matching lines...) Expand 10 before | Expand all | Expand 10 after
396 } 472 }
397 return visitor.visitStaticSend(node); 473 return visitor.visitStaticSend(node);
398 } 474 }
399 475
400 @override 476 @override
401 R errorUnresolvedPostfix( 477 R errorUnresolvedPostfix(
402 Send node, 478 Send node,
403 Element element, 479 Element element,
404 op.IncDecOperator operator, 480 op.IncDecOperator operator,
405 ResolvedKindVisitor<R> visitor) { 481 ResolvedKindVisitor<R> visitor) {
406 if (node.isSuperCall) { 482 return visitor.handleSendSet(node);
407 return visitor.visitSuperSend(node);
408 }
409 return visitor.visitOperatorSend(node);
410 } 483 }
411 484
412 @override 485 @override
413 R errorUnresolvedPrefix( 486 R errorUnresolvedPrefix(
414 Send node, 487 Send node,
415 Element element, 488 Element element,
416 op.IncDecOperator operator, 489 op.IncDecOperator operator,
417 ResolvedKindVisitor<R> visitor) { 490 ResolvedKindVisitor<R> visitor) {
418 if (node.isSuperCall) { 491 return visitor.handleSendSet(node);
419 return visitor.visitSuperSend(node);
420 }
421 return visitor.visitOperatorSend(node);
422 } 492 }
423 493
424 @override 494 @override
425 R errorUnresolvedSuperBinary( 495 R errorUnresolvedSuperBinary(
426 Send node, 496 Send node,
427 Element element, 497 Element element,
428 op.BinaryOperator operator, 498 op.BinaryOperator operator,
429 Node argument, 499 Node argument,
430 ResolvedKindVisitor<R> visitor) { 500 ResolvedKindVisitor<R> visitor) {
431 return visitor.visitSuperSend(node); 501 return visitor.visitSuperSend(node);
(...skipping 266 matching lines...) Expand 10 before | Expand all | Expand 10 after
698 768
699 @override 769 @override
700 R errorUnresolvedSuperIndex( 770 R errorUnresolvedSuperIndex(
701 Send node, 771 Send node,
702 Element function, 772 Element function,
703 Node index, 773 Node index,
704 ResolvedKindVisitor<R> visitor) { 774 ResolvedKindVisitor<R> visitor) {
705 return visitor.visitSuperSend(node); 775 return visitor.visitSuperSend(node);
706 } 776 }
707 } 777 }
OLDNEW
« no previous file with comments | « pkg/compiler/lib/src/resolution/send_structure.dart ('k') | pkg/compiler/lib/src/ssa/builder.dart » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698