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

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

Issue 1030103004: Implement ResolvedVisitor using SemanticSendVisitor. (Closed) Base URL: https://dart.googlecode.com/svn/branches/bleeding_edge/dart
Patch Set: Cleanups. Created 5 years, 9 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 abstract class ResolvedVisitor<R> extends Visitor<R> { 7 /// Enum for the visit methods added in [ResolvedVisitor].
8 TreeElements elements; 8 // TODO(johnniwinther): Remove this.
9 9 enum ResolvedKind {
10 ResolvedVisitor(this.elements); 10 ASSERT,
11 11 TYPE_LITERAL,
12 R visitSend(Send node) { 12 SUPER,
13 Element element = elements[node]; 13 OPERATOR,
14 if (elements.isAssert(node)) { 14 TYPE_PREFIX,
15 return visitAssert(node); 15 GETTER,
16 } else if (elements.isTypeLiteral(node)) { 16 STATIC,
17 return visitTypeLiteralSend(node); 17 CLOSURE,
18 } else if (node.isSuperCall) { 18 DYNAMIC,
19 return visitSuperSend(node); 19 ERROR,
20 } else if (node.isOperator) { 20 }
21 return visitOperatorSend(node); 21
22 } else if (node.isPropertyAccess) { 22 /// Abstract interface for a [ResolvedVisitor].
23 if (!Elements.isUnresolved(element) && element.impliesType) { 23 // TODO(johnniwinther): Remove this.
24 return visitTypePrefixSend(node); 24 abstract class ResolvedKindVisitor<R> {
25 } else {
26 return visitGetterSend(node);
27 }
28 } else if (element != null && Initializers.isConstructorRedirect(node)) {
29 return visitStaticSend(node);
30 } else if (Elements.isClosureSend(node, element)) {
31 return visitClosureSend(node);
32 } else {
33 if (Elements.isUnresolved(element)) {
34 if (element == null) {
35 // Example: f() with 'f' unbound.
36 // This can only happen inside an instance method.
37 return visitDynamicSend(node);
38 } else {
39 return visitStaticSend(node);
40 }
41 } else if (element.isInstanceMember) {
42 // Example: f() with 'f' bound to instance method.
43 return visitDynamicSend(node);
44 } else if (!element.isInstanceMember) {
45 // Example: A.f() or f() with 'f' bound to a static function.
46 // Also includes new A() or new A.named() which is treated like a
47 // static call to a factory.
48 return visitStaticSend(node);
49 } else {
50 internalError("Cannot generate code for send", node: node);
51 return null;
52 }
53 }
54 }
55
56 R visitSuperSend(Send node); 25 R visitSuperSend(Send node);
57 R visitOperatorSend(Send node); 26 R visitOperatorSend(Send node);
58 R visitGetterSend(Send node); 27 R visitGetterSend(Send node);
59 R visitClosureSend(Send node); 28 R visitClosureSend(Send node);
60 R visitDynamicSend(Send node); 29 R visitDynamicSend(Send node);
61 R visitStaticSend(Send node); 30 R visitStaticSend(Send node);
62 31
63 /// Visitor callback for a type literal. 32 /// Visitor callback for a type literal.
64 R visitTypeLiteralSend(Send node); 33 R visitTypeLiteralSend(Send node);
65 34
66 /// Visitor callback for the class prefix of a static access, like `Foo` in 35 /// Visitor callback for the class prefix of a static access, like `Foo` in
67 /// `Foo.staticField`. 36 /// `Foo.staticField`.
68 // TODO(johnniwinther): Remove this when not needed by the dart backend. 37 // TODO(johnniwinther): Remove this when not needed by the dart backend.
69 R visitTypePrefixSend(Send node); 38 R visitTypePrefixSend(Send node);
70 39
71 R visitAssert(Send node); 40 R visitAssertSend(Send node);
72 41
73 void internalError(String reason, {Node node}); 42 internalError(Spannable node, String reason);
43 }
44
45 /// Visitor that returns the [ResolvedKind] corresponding to the called visitor
46 /// method.
47 class ResolvedKindComputer implements ResolvedKindVisitor {
48 const ResolvedKindComputer();
49
50 ResolvedKind visitSuperSend(Send node) => ResolvedKind.SUPER;
51 ResolvedKind visitOperatorSend(Send node) => ResolvedKind.OPERATOR;
52 ResolvedKind visitGetterSend(Send node) => ResolvedKind.GETTER;
53 ResolvedKind visitClosureSend(Send node) => ResolvedKind.CLOSURE;
54 ResolvedKind visitDynamicSend(Send node) => ResolvedKind.DYNAMIC;
55 ResolvedKind visitStaticSend(Send node) => ResolvedKind.STATIC;
56 ResolvedKind visitTypeLiteralSend(Send node) => ResolvedKind.TYPE_LITERAL;
57 ResolvedKind visitTypePrefixSend(Send node) => ResolvedKind.TYPE_PREFIX;
58 ResolvedKind visitAssertSend(Send node) => ResolvedKind.ASSERT;
59 internalError(Spannable node, String reason) => ResolvedKind.ERROR;
60 }
61
62 abstract class ResolvedVisitor<R>
63 implements Visitor<R>, ResolvedKindVisitor<R> {}
64
65 abstract class BaseResolvedVisitor<R> extends Visitor<R>
66 implements ResolvedVisitor<R> {
67
68 TreeElements elements;
69
70 BaseResolvedVisitor(this.elements);
71
72 /// Dispatch using the old [ResolvedVisitor] logic.
73 // TODO(johnniwinther): Remove this.
74 _oldDispatch(Send node, ResolvedKindVisitor visitor) {
75 Element element = elements[node];
76 if (elements.isAssert(node)) {
77 return visitor.visitAssertSend(node);
78 } else if (elements.isTypeLiteral(node)) {
79 return visitor.visitTypeLiteralSend(node);
80 } else if (node.isSuperCall) {
81 return visitor.visitSuperSend(node);
82 } else if (node.isOperator) {
83 return visitor.visitOperatorSend(node);
84 } else if (node.isPropertyAccess) {
85 if (!Elements.isUnresolved(element) && element.impliesType) {
86 return visitor.visitTypePrefixSend(node);
87 } else {
88 return visitor.visitGetterSend(node);
89 }
90 } else if (element != null && Initializers.isConstructorRedirect(node)) {
91 return visitor.visitStaticSend(node);
92 } else if (Elements.isClosureSend(node, element)) {
93 return visitor.visitClosureSend(node);
94 } else {
95 if (Elements.isUnresolved(element)) {
96 if (element == null) {
97 // Example: f() with 'f' unbound.
98 // This can only happen inside an instance method.
99 return visitor.visitDynamicSend(node);
100 } else {
101 return visitor.visitStaticSend(node);
102 }
103 } else if (element.isInstanceMember) {
104 // Example: f() with 'f' bound to instance method.
105 return visitor.visitDynamicSend(node);
106 } else if (!element.isInstanceMember) {
107 // Example: A.f() or f() with 'f' bound to a static function.
108 // Also includes new A() or new A.named() which is treated like a
109 // static call to a factory.
110 return visitor.visitStaticSend(node);
111 } else {
112 return visitor.internalError(node, "Cannot generate code for send");
113 }
114 }
115 }
116
117 internalError(Spannable node, String reason);
74 118
75 R visitNode(Node node) { 119 R visitNode(Node node) {
76 internalError("Unhandled node", node: node); 120 internalError(node, "Unhandled node");
77 return null; 121 return null;
78 } 122 }
79 } 123 }
124
125 // TODO(johnniwinther): Remove this. Currently need by the old dart2dart
126 // backend.
127 abstract class OldResolvedVisitor<R> extends BaseResolvedVisitor<R> {
128 OldResolvedVisitor(TreeElements elements) : super(elements);
129
130 R visitSend(Send node) {
131 return _oldDispatch(node, this);
132 }
133 }
134
135 abstract class NewResolvedVisitor<R> extends BaseResolvedVisitor<R>
136 with SendResolverMixin,
137 GetBulkMixin<R, dynamic>,
138 SetBulkMixin<R, dynamic>,
139 ErrorBulkMixin<R, dynamic>,
140 InvokeBulkMixin<R, dynamic>,
141 IndexSetBulkMixin<R, dynamic>,
142 CompoundBulkMixin<R, dynamic>,
143 UnaryBulkMixin<R, dynamic>,
144 BaseBulkMixin<R, dynamic>,
145 BinaryBulkMixin<R, dynamic>,
146 PrefixBulkMixin<R, dynamic>,
147 PostfixBulkMixin<R, dynamic> {
148
149 final ResolvedSemanticDispatcher<R> _semanticDispatcher =
150 new ResolvedSemanticDispatcher<R>();
151
152 final ResolvedSemanticDispatcher<ResolvedKind> _resolvedKindDispatcher =
153 new ResolvedSemanticDispatcher<ResolvedKind>();
154
155 NewResolvedVisitor(TreeElements elements) : super(elements);
156
157 /// Dispatch using the new [SemanticSendVisitor] logic.
158 _newDispatch(Send node,
159 ResolvedKindVisitor kindVisitor,
160 SemanticSendVisitor sendVisitor) {
161 Element element = elements[node];
162 if (element != null && element.isConstructor) {
163 if (node.isSuperCall) {
164 return kindVisitor.visitSuperSend(node);
165 } else {
166 return kindVisitor.visitStaticSend(node);
167 }
168 } else if (element != null && element.isPrefix) {
169 return kindVisitor.visitGetterSend(node);
170 } else if (!elements.isTypeLiteral(node) &&
171 node.isPropertyAccess &&
172 !Elements.isUnresolved(element) &&
173 element.impliesType) {
174 return kindVisitor.visitTypePrefixSend(node);
175 } else {
176 SendStructure sendStructure = computeSendStructure(node);
177 if (sendStructure != null) {
178 var arg = sendVisitor == _resolvedKindDispatcher
179 ? kindVisitor : sendStructure;
180 return sendStructure.dispatch(sendVisitor, node, arg);
181 } else {
182 return kindVisitor.visitStaticSend(node);
183 }
184 }
185 }
186
187 R visitSend(Send node) {
188 ResolvedKind oldKind;
189 ResolvedKind newKind;
190 assert(invariant(node, () {
191 oldKind = _oldDispatch(node, const ResolvedKindComputer());
192 newKind = _newDispatch(
193 node, const ResolvedKindComputer(), _resolvedKindDispatcher);
194 return oldKind == newKind;
195 }, message: () => '$oldKind != $newKind'));
196 return _newDispatch(node, this, this);
197 }
198
199 @override
200 R apply(Node node, arg) {
201 return visitNode(node);
202 }
203
204 @override
205 R bulkHandleNode(
206 Node node,
207 String message,
208 SendStructure sendStructure) {
209 return sendStructure.dispatch(_semanticDispatcher, node, this);
210 }
211 }
212
213 /// Visitor that dispatches [SemanticSendVisitor] calls to the corresponding
214 /// visit methods in [ResolvedVisitor].
215 class ResolvedSemanticDispatcher<R> extends Object
216 with GetBulkMixin<R, ResolvedKindVisitor<R>>,
217 SetBulkMixin<R, ResolvedKindVisitor<R>>,
218 InvokeBulkMixin<R, ResolvedKindVisitor<R>>,
219 PrefixBulkMixin<R, ResolvedKindVisitor<R>>,
220 PostfixBulkMixin<R, ResolvedKindVisitor<R>>,
221 SuperBulkMixin<R, ResolvedKindVisitor<R>>,
222 CompoundBulkMixin<R, ResolvedKindVisitor<R>>,
223 IndexSetBulkMixin<R, ResolvedKindVisitor<R>>,
224 ErrorBulkMixin<R, ResolvedKindVisitor<R>>
225 implements SemanticSendVisitor<R, ResolvedKindVisitor<R>> {
226
227 ResolvedSemanticDispatcher();
228
229 @override
230 R apply(Node node, ResolvedKindVisitor<R> visitor) {
231 return visitor.internalError(
232 node, "ResolvedSemanticDispatcher.apply unsupported.");
233 }
234
235 @override
236 R bulkHandleNode(
237 Node node,
238 String message,
239 ResolvedKindVisitor<R> visitor) {
240 // Set, Compound and IndexSet are not handled by [ResolvedVisitor].
241 return bulkHandleError(node, visitor);
242 }
243
244 R bulkHandleError(Node node, ResolvedKindVisitor<R> visitor) {
245 return visitor.internalError(node, "No resolved kind for node.");
246 }
247
248 @override
249 R bulkHandleGet(Node node, ResolvedKindVisitor<R> visitor) {
250 return visitor.visitGetterSend(node);
251 }
252
253 @override
254 R bulkHandleInvoke(Node node, ResolvedKindVisitor<R> visitor) {
255 // Most invokes are static.
256 return visitor.visitStaticSend(node);
257 }
258
259 @override
260 R bulkHandlePrefix(Node node, ResolvedKindVisitor<R> visitor) {
261 return visitor.visitOperatorSend(node);
262 }
263
264 @override
265 R bulkHandlePostfix(Node node, ResolvedKindVisitor<R> visitor) {
266 return visitor.visitOperatorSend(node);
267 }
268
269 @override
270 R bulkHandleSuper(Node node, ResolvedKindVisitor<R> visitor) {
271 return visitor.visitSuperSend(node);
272 }
273
274 @override
275 R errorInvalidAssert(
276 Send node,
277 NodeList arguments,
278 ResolvedKindVisitor<R> visitor) {
279 return visitor.visitAssertSend(node);
280 }
281
282 @override
283 R errorLocalFunctionPostfix(
284 Send node,
285 LocalFunctionElement function,
286 op.IncDecOperator operator,
287 ResolvedKindVisitor<R> visitor) {
288 return visitor.visitOperatorSend(node);
289 }
290
291 @override
292 R errorLocalFunctionPrefix(
293 Send node,
294 LocalFunctionElement function,
295 op.IncDecOperator operator,
296 ResolvedKindVisitor<R> visitor) {
297 return visitor.visitOperatorSend(node);
298 }
299
300 @override
301 R errorStaticSetterGet(
302 Send node,
303 FunctionElement setter,
304 ResolvedKindVisitor<R> visitor) {
305 return visitor.visitGetterSend(node);
306 }
307
308 @override
309 R errorStaticSetterInvoke(
310 Send node,
311 FunctionElement setter,
312 NodeList arguments,
313 Selector selector,
314 ResolvedKindVisitor<R> visitor) {
315 return visitor.visitStaticSend(node);
316 }
317
318 @override
319 R errorSuperSetterGet(
320 Send node,
321 FunctionElement setter,
322 ResolvedKindVisitor<R> visitor) {
323 return visitor.visitGetterSend(node);
324 }
325
326 @override
327 R errorSuperSetterInvoke(
328 Send node,
329 FunctionElement setter,
330 NodeList arguments,
331 Selector selector,
332 ResolvedKindVisitor<R> visitor) {
333 return visitor.visitSuperSend(node);
334 }
335
336 @override
337 R errorTopLevelSetterGet(
338 Send node,
339 FunctionElement setter,
340 ResolvedKindVisitor<R> visitor) {
341 return visitor.visitGetterSend(node);
342 }
343
344 @override
345 R errorTopLevelSetterInvoke(
346 Send node,
347 FunctionElement setter,
348 NodeList arguments,
349 Selector selector,
350 ResolvedKindVisitor<R> visitor) {
351 return visitor.visitStaticSend(node);
352 }
353
354 @override
355 R errorUndefinedBinaryExpression(
356 Send node,
357 Node left,
358 Operator operator,
359 Node right,
360 ResolvedKindVisitor<R> visitor) {
361 return visitor.visitOperatorSend(node);
362 }
363
364 @override
365 R errorUndefinedUnaryExpression(
366 Send node,
367 Operator operator,
368 Node expression,
369 ResolvedKindVisitor<R> visitor) {
370 return visitor.visitOperatorSend(node);
371 }
372
373 @override
374 R errorUnresolvedGet(
375 Send node,
376 Element element,
377 ResolvedKindVisitor<R> visitor) {
378 if (node.isSuperCall) {
379 return visitor.visitSuperSend(node);
380 }
381 return visitor.visitGetterSend(node);
382 }
383
384 @override
385 R errorUnresolvedInvoke(
386 Send node,
387 Element element,
388 NodeList arguments,
389 Selector selector,
390 ResolvedKindVisitor<R> visitor) {
391 if (node.isSuperCall) {
392 return visitor.visitSuperSend(node);
393 }
394 return visitor.visitStaticSend(node);
395 }
396
397 @override
398 R errorUnresolvedPostfix(
399 Send node,
400 Element element,
401 op.IncDecOperator operator,
402 ResolvedKindVisitor<R> visitor) {
403 if (node.isSuperCall) {
404 return visitor.visitSuperSend(node);
405 }
406 return visitor.visitOperatorSend(node);
407 }
408
409 @override
410 R errorUnresolvedPrefix(
411 Send node,
412 Element element,
413 op.IncDecOperator operator,
414 ResolvedKindVisitor<R> visitor) {
415 if (node.isSuperCall) {
416 return visitor.visitSuperSend(node);
417 }
418 return visitor.visitOperatorSend(node);
419 }
420
421 @override
422 R errorUnresolvedSuperBinary(
423 Send node,
424 Element element,
425 op.BinaryOperator operator,
426 Node argument,
427 ResolvedKindVisitor<R> visitor) {
428 return visitor.visitSuperSend(node);
429 }
430
431 @override
432 R errorUnresolvedSuperUnary(
433 Send node,
434 op.UnaryOperator operator,
435 Element element,
436 ResolvedKindVisitor<R> visitor) {
437 return visitor.visitSuperSend(node);
438 }
439
440 @override
441 R visitAs(
442 Send node,
443 Node expression,
444 DartType type,
445 ResolvedKindVisitor<R> visitor) {
446 return visitor.visitOperatorSend(node);
447 }
448
449 @override
450 R visitAssert(
451 Send node,
452 Node expression,
453 ResolvedKindVisitor<R> visitor) {
454 return visitor.visitAssertSend(node);
455 }
456
457 @override
458 R visitBinary(
459 Send node,
460 Node left,
461 op.BinaryOperator operator,
462 Node right,
463 ResolvedKindVisitor<R> visitor) {
464 return visitor.visitOperatorSend(node);
465 }
466
467 @override
468 R visitEquals(
469 Send node,
470 Node left,
471 Node right,
472 ResolvedKindVisitor<R> visitor) {
473 return visitor.visitOperatorSend(node);
474 }
475
476 @override
477 R visitIs(
478 Send node,
479 Node expression,
480 DartType type,
481 ResolvedKindVisitor<R> visitor) {
482 return visitor.visitOperatorSend(node);
483 }
484
485 @override
486 R visitIsNot(
487 Send node,
488 Node expression,
489 DartType type,
490 ResolvedKindVisitor<R> visitor) {
491 return visitor.visitOperatorSend(node);
492 }
493
494 @override
495 R visitLogicalAnd(
496 Send node,
497 Node left,
498 Node right,
499 ResolvedKindVisitor<R> visitor) {
500 return visitor.visitOperatorSend(node);
501 }
502
503 @override
504 R visitLogicalOr(
505 Send node,
506 Node left,
507 Node right,
508 ResolvedKindVisitor<R> visitor) {
509 return visitor.visitOperatorSend(node);
510 }
511
512 @override
513 R visitNot(
514 Send node,
515 Node expression,
516 ResolvedKindVisitor<R> visitor) {
517 return visitor.visitOperatorSend(node);
518 }
519
520 @override
521 R visitNotEquals(
522 Send node,
523 Node left,
524 Node right,
525 ResolvedKindVisitor<R> visitor) {
526 return visitor.visitOperatorSend(node);
527 }
528
529 @override
530 R visitUnary(
531 Send node,
532 op.UnaryOperator operator,
533 Node expression,
534 ResolvedKindVisitor<R> visitor) {
535 return visitor.visitOperatorSend(node);
536 }
537
538 @override
539 R visitDynamicPropertyInvoke(
540 Send node,
541 Node receiver,
542 NodeList arguments,
543 Selector selector,
544 ResolvedKindVisitor<R> visitor) {
545 return visitor.visitDynamicSend(node);
546 }
547
548 @override
549 R visitThisPropertyInvoke(
550 Send node,
551 NodeList arguments,
552 Selector selector,
553 ResolvedKindVisitor<R> visitor) {
554 return visitor.visitDynamicSend(node);
555 }
556
557 @override
558 R visitExpressionInvoke(
559 Send node,
560 Node receiver,
561 NodeList arguments,
562 Selector selector,
563 ResolvedKindVisitor<R> visitor) {
564 return visitor.visitClosureSend(node);
565 }
566
567 @override
568 R visitParameterInvoke(
569 Send node,
570 ParameterElement parameter,
571 NodeList arguments,
572 Selector selector,
573 ResolvedKindVisitor<R> visitor) {
574 return visitor.visitClosureSend(node);
575 }
576
577 @override
578 R visitLocalVariableInvoke(
579 Send node,
580 LocalVariableElement variable,
581 NodeList arguments,
582 Selector selector,
583 ResolvedKindVisitor<R> visitor) {
584 return visitor.visitClosureSend(node);
585 }
586
587 @override
588 R visitLocalFunctionInvoke(
589 Send node,
590 LocalFunctionElement function,
591 NodeList arguments,
592 Selector selector,
593 ResolvedKindVisitor<R> visitor) {
594 return visitor.visitClosureSend(node);
595 }
596
597 @override
598 R visitThisInvoke(
599 Send node,
600 NodeList arguments,
601 Selector selector,
602 ResolvedKindVisitor<R> visitor) {
603 return visitor.visitClosureSend(node);
604 }
605
606 @override
607 R visitClassTypeLiteralGet(
608 Send node,
609 TypeConstantExpression constant,
610 ResolvedKindVisitor<R> visitor) {
611 return visitor.visitTypeLiteralSend(node);
612 }
613
614 @override
615 R visitTypedefTypeLiteralGet(
616 Send node,
617 TypeConstantExpression constant,
618 ResolvedKindVisitor<R> visitor) {
619 return visitor.visitTypeLiteralSend(node);
620 }
621
622 @override
623 R visitDynamicTypeLiteralGet(
624 Send node,
625 TypeConstantExpression constant,
626 ResolvedKindVisitor<R> visitor) {
627 return visitor.visitTypeLiteralSend(node);
628 }
629
630 @override
631 R visitTypeVariableTypeLiteralGet(
632 Send node,
633 TypeVariableElement element,
634 ResolvedKindVisitor<R> visitor) {
635 return visitor.visitTypeLiteralSend(node);
636 }
637
638 @override
639 R visitClassTypeLiteralInvoke(
640 Send node,
641 TypeConstantExpression constant,
642 NodeList arguments,
643 Selector selector,
644 ResolvedKindVisitor<R> visitor) {
645 return visitor.visitTypeLiteralSend(node);
646 }
647
648 @override
649 R visitTypedefTypeLiteralInvoke(
650 Send node,
651 TypeConstantExpression constant,
652 NodeList arguments,
653 Selector selector,
654 ResolvedKindVisitor<R> visitor) {
655 return visitor.visitTypeLiteralSend(node);
656 }
657
658 @override
659 R visitDynamicTypeLiteralInvoke(
660 Send node,
661 TypeConstantExpression constant,
662 NodeList arguments,
663 Selector selector,
664 ResolvedKindVisitor<R> visitor) {
665 return visitor.visitTypeLiteralSend(node);
666 }
667
668 @override
669 R visitTypeVariableTypeLiteralInvoke(
670 Send node,
671 TypeVariableElement element,
672 NodeList arguments,
673 Selector selector,
674 ResolvedKindVisitor<R> visitor) {
675 return visitor.visitTypeLiteralSend(node);
676 }
677
678 @override
679 R visitIndex(
680 Send node,
681 Node receiver,
682 Node index,
683 ResolvedKindVisitor<R> visitor) {
684 return visitor.visitOperatorSend(node);
685 }
686
687 @override
688 R visitSuperIndex(
689 Send node,
690 FunctionElement function,
691 Node index,
692 ResolvedKindVisitor<R> visitor) {
693 return visitor.visitSuperSend(node);
694 }
695
696 @override
697 R errorUnresolvedSuperIndex(
698 Send node,
699 Element function,
700 Node index,
701 ResolvedKindVisitor<R> visitor) {
702 return visitor.visitSuperSend(node);
703 }
704 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698