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

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

Issue 1108783003: Refactor SsaBuilder.visitSuperSend. (Closed) Base URL: https://dart.googlecode.com/svn/branches/bleeding_edge/dart
Patch Set: 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, 20 SEND_SET,
21 NEW, 21 NEW,
22 SUPER_CONSTRUCTOR,
22 } 23 }
23 24
24 /// Abstract interface for a [ResolvedVisitor]. 25 /// Abstract interface for a [ResolvedVisitor].
25 // TODO(johnniwinther): Remove this. 26 // TODO(johnniwinther): Remove this.
26 abstract class ResolvedKindVisitor<R> { 27 abstract class ResolvedKindVisitor<R> {
27 R visitSuperSend(Send node); 28 R visitSuperSend(Send node);
28 29
29 @deprecated 30 @deprecated
30 R visitOperatorSend(Send node); 31 R visitOperatorSend(Send node);
31 R visitGetterSend(Send node); 32 R visitGetterSend(Send node);
32 33
33 @deprecated 34 @deprecated
34 R visitClosureSend(Send node); 35 R visitClosureSend(Send node);
35 R visitDynamicSend(Send node); 36 R visitDynamicSend(Send node);
36 R visitStaticSend(Send node); 37 R visitStaticSend(Send node);
38
39 R handleSuperConstructorInvoke(Send node);
37 R handleSendSet(SendSet node); 40 R handleSendSet(SendSet node);
38 R handleNewExpression(NewExpression node); 41 R handleNewExpression(NewExpression node);
39 42
40 /// Visitor callback for a type literal. 43 /// Visitor callback for a type literal.
41 @deprecated 44 @deprecated
42 R visitTypeLiteralSend(Send node); 45 R visitTypeLiteralSend(Send node);
43 46
44 /// Visitor callback for the class prefix of a static access, like `Foo` in 47 /// Visitor callback for the class prefix of a static access, like `Foo` in
45 /// `Foo.staticField`. 48 /// `Foo.staticField`.
46 // TODO(johnniwinther): Remove this when not needed by the inferrer. 49 // TODO(johnniwinther): Remove this when not needed by the inferrer.
(...skipping 13 matching lines...) Expand all
60 63
61 ResolvedKind visitSuperSend(Send node) => ResolvedKind.SUPER; 64 ResolvedKind visitSuperSend(Send node) => ResolvedKind.SUPER;
62 ResolvedKind visitOperatorSend(Send node) => ResolvedKind.OPERATOR; 65 ResolvedKind visitOperatorSend(Send node) => ResolvedKind.OPERATOR;
63 ResolvedKind visitGetterSend(Send node) => ResolvedKind.GETTER; 66 ResolvedKind visitGetterSend(Send node) => ResolvedKind.GETTER;
64 ResolvedKind visitClosureSend(Send node) => ResolvedKind.CLOSURE; 67 ResolvedKind visitClosureSend(Send node) => ResolvedKind.CLOSURE;
65 ResolvedKind visitDynamicSend(Send node) => ResolvedKind.DYNAMIC; 68 ResolvedKind visitDynamicSend(Send node) => ResolvedKind.DYNAMIC;
66 ResolvedKind visitStaticSend(Send node) => ResolvedKind.STATIC; 69 ResolvedKind visitStaticSend(Send node) => ResolvedKind.STATIC;
67 ResolvedKind visitTypeLiteralSend(Send node) => ResolvedKind.TYPE_LITERAL; 70 ResolvedKind visitTypeLiteralSend(Send node) => ResolvedKind.TYPE_LITERAL;
68 ResolvedKind visitTypePrefixSend(Send node) => ResolvedKind.TYPE_PREFIX; 71 ResolvedKind visitTypePrefixSend(Send node) => ResolvedKind.TYPE_PREFIX;
69 ResolvedKind visitAssertSend(Send node) => ResolvedKind.ASSERT; 72 ResolvedKind visitAssertSend(Send node) => ResolvedKind.ASSERT;
73 ResolvedKind handleSuperConstructorInvoke(Send node) {
74 return ResolvedKind.SUPER_CONSTRUCTOR;
75 }
70 ResolvedKind handleSendSet(SendSet node) => ResolvedKind.SEND_SET; 76 ResolvedKind handleSendSet(SendSet node) => ResolvedKind.SEND_SET;
71 ResolvedKind handleNewExpression(NewExpression node) => ResolvedKind.NEW; 77 ResolvedKind handleNewExpression(NewExpression node) => ResolvedKind.NEW;
72 internalError(Spannable node, String reason) => ResolvedKind.ERROR; 78 internalError(Spannable node, String reason) => ResolvedKind.ERROR;
73 } 79 }
74 80
75 abstract class ResolvedVisitor<R> 81 abstract class ResolvedVisitor<R>
76 implements Visitor<R>, ResolvedKindVisitor<R> {} 82 implements Visitor<R>, ResolvedKindVisitor<R> {}
77 83
78 abstract class BaseResolvedVisitor<R> extends Visitor<R> 84 abstract class BaseResolvedVisitor<R> extends Visitor<R>
79 implements ResolvedVisitor<R> { 85 implements ResolvedVisitor<R> {
80 86
81 TreeElements elements; 87 TreeElements elements;
82 88
83 BaseResolvedVisitor(this.elements); 89 BaseResolvedVisitor(this.elements);
84 90
85 /// Dispatch using the old [ResolvedVisitor] logic. 91 /// Dispatch using the old [ResolvedVisitor] logic.
86 // TODO(johnniwinther): Remove this. 92 // TODO(johnniwinther): Remove this.
87 _oldDispatch(Send node, ResolvedKindVisitor visitor) { 93 _oldDispatch(Send node, ResolvedKindVisitor visitor) {
88 Element element = elements[node]; 94 Element element = elements[node];
89 if (elements.isAssert(node)) { 95 if (elements.isAssert(node)) {
90 return visitor.visitAssertSend(node); 96 return visitor.visitAssertSend(node);
91 } else if (elements.isTypeLiteral(node)) { 97 } else if (elements.isTypeLiteral(node)) {
92 return visitor.visitTypeLiteralSend(node); 98 return visitor.visitTypeLiteralSend(node);
93 } else if (node.isSuperCall) { 99 } else if (node.isSuperCall) {
100 if (element != null && element.isConstructor) {
101 return visitor.handleSuperConstructorInvoke(node);
102 }
94 return visitor.visitSuperSend(node); 103 return visitor.visitSuperSend(node);
95 } else if (node.isOperator) { 104 } else if (node.isOperator) {
96 return visitor.visitOperatorSend(node); 105 return visitor.visitOperatorSend(node);
97 } else if (node.isPropertyAccess) { 106 } else if (node.isPropertyAccess) {
98 if (!Elements.isUnresolved(element) && element.impliesType) { 107 if (!Elements.isUnresolved(element) && element.impliesType) {
99 return visitor.visitTypePrefixSend(node); 108 return visitor.visitTypePrefixSend(node);
100 } else { 109 } else {
101 return visitor.visitGetterSend(node); 110 return visitor.visitGetterSend(node);
102 } 111 }
103 } else if (element != null && Initializers.isConstructorRedirect(node)) { 112 } else if (element != null && Initializers.isConstructorRedirect(node)) {
(...skipping 54 matching lines...) Expand 10 before | Expand all | Expand 10 after
158 167
159 NewResolvedVisitor(TreeElements elements) : super(elements); 168 NewResolvedVisitor(TreeElements elements) : super(elements);
160 169
161 /// Dispatch using the new [SemanticSendVisitor] logic. 170 /// Dispatch using the new [SemanticSendVisitor] logic.
162 _newDispatch(Send node, 171 _newDispatch(Send node,
163 ResolvedKindVisitor kindVisitor, 172 ResolvedKindVisitor kindVisitor,
164 SemanticSendVisitor sendVisitor) { 173 SemanticSendVisitor sendVisitor) {
165 Element element = elements[node]; 174 Element element = elements[node];
166 if (element != null && element.isConstructor) { 175 if (element != null && element.isConstructor) {
167 if (node.isSuperCall) { 176 if (node.isSuperCall) {
168 return kindVisitor.visitSuperSend(node); 177 return kindVisitor.handleSuperConstructorInvoke(node);
169 } else { 178 } else {
170 return kindVisitor.visitStaticSend(node); 179 return kindVisitor.visitStaticSend(node);
171 } 180 }
172 } else if (element != null && element.isPrefix) { 181 } else if (element != null && element.isPrefix) {
173 return kindVisitor.visitGetterSend(node); 182 return kindVisitor.visitGetterSend(node);
174 } else if (!elements.isTypeLiteral(node) && 183 } else if (!elements.isTypeLiteral(node) &&
175 node.isPropertyAccess && 184 node.isPropertyAccess &&
176 !Elements.isUnresolved(element) && 185 !Elements.isUnresolved(element) &&
177 element.impliesType) { 186 element.impliesType) {
178 return kindVisitor.visitTypePrefixSend(node); 187 return kindVisitor.visitTypePrefixSend(node);
(...skipping 282 matching lines...) Expand 10 before | Expand all | Expand 10 after
461 Node expression, 470 Node expression,
462 ResolvedKindVisitor<R> visitor) { 471 ResolvedKindVisitor<R> visitor) {
463 return visitor.visitOperatorSend(node); 472 return visitor.visitOperatorSend(node);
464 } 473 }
465 474
466 @override 475 @override
467 R errorUnresolvedGet( 476 R errorUnresolvedGet(
468 Send node, 477 Send node,
469 Element element, 478 Element element,
470 ResolvedKindVisitor<R> visitor) { 479 ResolvedKindVisitor<R> visitor) {
471 if (node.isSuperCall) {
472 return visitor.visitSuperSend(node);
473 }
474 return visitor.visitGetterSend(node); 480 return visitor.visitGetterSend(node);
475 } 481 }
476 482
477 @override 483 @override
478 R errorUnresolvedInvoke( 484 R errorUnresolvedInvoke(
479 Send node, 485 Send node,
480 Element element, 486 Element element,
481 NodeList arguments, 487 NodeList arguments,
482 Selector selector, 488 Selector selector,
483 ResolvedKindVisitor<R> visitor) { 489 ResolvedKindVisitor<R> visitor) {
484 if (node.isSuperCall) {
485 return visitor.visitSuperSend(node);
486 }
487 return visitor.visitStaticSend(node); 490 return visitor.visitStaticSend(node);
488 } 491 }
489 492
490 @override 493 @override
491 R errorUnresolvedPostfix( 494 R errorUnresolvedPostfix(
492 Send node, 495 Send node,
493 Element element, 496 Element element,
494 op.IncDecOperator operator, 497 op.IncDecOperator operator,
495 ResolvedKindVisitor<R> visitor) { 498 ResolvedKindVisitor<R> visitor) {
496 return visitor.handleSendSet(node); 499 return visitor.handleSendSet(node);
497 } 500 }
498 501
499 @override 502 @override
500 R errorUnresolvedPrefix( 503 R errorUnresolvedPrefix(
501 Send node, 504 Send node,
502 Element element, 505 Element element,
503 op.IncDecOperator operator, 506 op.IncDecOperator operator,
504 ResolvedKindVisitor<R> visitor) { 507 ResolvedKindVisitor<R> visitor) {
505 return visitor.handleSendSet(node); 508 return visitor.handleSendSet(node);
506 } 509 }
507 510
508 @override 511 @override
509 R errorUnresolvedSuperBinary(
510 Send node,
511 Element element,
512 op.BinaryOperator operator,
513 Node argument,
514 ResolvedKindVisitor<R> visitor) {
515 return visitor.visitSuperSend(node);
516 }
517
518 @override
519 R errorUnresolvedSuperUnary(
520 Send node,
521 op.UnaryOperator operator,
522 Element element,
523 ResolvedKindVisitor<R> visitor) {
524 return visitor.visitSuperSend(node);
525 }
526
527 @override
528 R visitAs( 512 R visitAs(
529 Send node, 513 Send node,
530 Node expression, 514 Node expression,
531 DartType type, 515 DartType type,
532 ResolvedKindVisitor<R> visitor) { 516 ResolvedKindVisitor<R> visitor) {
533 return visitor.visitOperatorSend(node); 517 return visitor.visitOperatorSend(node);
534 } 518 }
535 519
536 @override 520 @override
537 R visitAssert( 521 R visitAssert(
(...skipping 234 matching lines...) Expand 10 before | Expand all | Expand 10 after
772 } 756 }
773 757
774 @override 758 @override
775 R visitSuperIndex( 759 R visitSuperIndex(
776 Send node, 760 Send node,
777 FunctionElement function, 761 FunctionElement function,
778 Node index, 762 Node index,
779 ResolvedKindVisitor<R> visitor) { 763 ResolvedKindVisitor<R> visitor) {
780 return visitor.visitSuperSend(node); 764 return visitor.visitSuperSend(node);
781 } 765 }
782
783 @override
784 R errorUnresolvedSuperIndex(
785 Send node,
786 Element function,
787 Node index,
788 ResolvedKindVisitor<R> visitor) {
789 return visitor.visitSuperSend(node);
790 }
791 } 766 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698