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

Side by Side Diff: pkg/compiler/lib/src/resolution/send_structure.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) 2015, the Dart project authors. Please see the AUTHORS file 1 // Copyright (c) 2015, 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 dart2js.send_structure; 5 library dart2js.send_structure;
6 6
7 import 'access_semantics.dart'; 7 import 'access_semantics.dart';
8 import 'operators.dart'; 8 import 'operators.dart';
9 import 'semantic_visitor.dart'; 9 import 'semantic_visitor.dart';
10 import '../dart_types.dart'; 10 import '../dart_types.dart';
(...skipping 321 matching lines...) Expand 10 before | Expand all | Expand 10 after
332 node.argumentsNode, 332 node.argumentsNode,
333 callStructure, 333 callStructure,
334 arg); 334 arg);
335 case AccessKind.UNRESOLVED: 335 case AccessKind.UNRESOLVED:
336 return visitor.errorUnresolvedInvoke( 336 return visitor.errorUnresolvedInvoke(
337 node, 337 node,
338 semantics.element, 338 semantics.element,
339 node.argumentsNode, 339 node.argumentsNode,
340 selector, 340 selector,
341 arg); 341 arg);
342 case AccessKind.UNRESOLVED_SUPER:
343 return visitor.visitUnresolvedSuperInvoke(
344 node,
345 semantics.element,
346 node.argumentsNode,
347 selector,
348 arg);
342 case AccessKind.COMPOUND: 349 case AccessKind.COMPOUND:
343 // This is not a valid case. 350 // This is not a valid case.
344 break; 351 break;
345 } 352 }
346 throw new SpannableAssertionFailure(node, "Invalid invoke: ${semantics}"); 353 throw new SpannableAssertionFailure(node, "Invalid invoke: ${semantics}");
347 } 354 }
348 355
349 String toString() => 'invoke($selector,$semantics)'; 356 String toString() => 'invoke($selector,$semantics)';
350 } 357 }
351 358
359 /// The structure for a [Send] that is an incompatible invocation, i.e. an
360 /// invocation of a known target where the call structure does not match.
361 class IncompatibleInvokeStructure<R, A> implements SendStructure<R, A> {
362 /// The target of the invocation.
363 final AccessSemantics semantics;
364
365 /// The [Selector] for the invocation.
366 // TODO(johnniwinther): Store this only for dynamic invocations.
367 final Selector selector;
368
369 /// The [CallStructure] of the invocation.
370 // TODO(johnniwinther): Store this directly for static invocations.
371 CallStructure get callStructure => selector.callStructure;
372
373 IncompatibleInvokeStructure(this.semantics, this.selector);
374
375 R dispatch(SemanticSendVisitor<R, A> visitor, Send node, A arg) {
376 switch (semantics.kind) {
377 case AccessKind.SUPER_METHOD:
378 return visitor.visitSuperMethodIncompatibleInvoke(
379 node,
380 semantics.element,
381 node.argumentsNode,
382 callStructure,
383 arg);
384 default:
385 // TODO(johnniwinther): Support more variant of this invoke structure.
karlklose 2015/04/27 14:01:55 'variant' -> 'variants'.
Johnni Winther 2015/04/28 08:18:28 Done.
386 break;
387 }
388 throw new SpannableAssertionFailure(
389 node, "Invalid incompatible invoke: ${semantics}");
390 }
391
392 String toString() => 'invoke($selector,$semantics)';
karlklose 2015/04/27 14:01:55 Space after ', ?
Johnni Winther 2015/04/28 08:18:28 Done.
393 }
394
352 /// The structure for a [Send] that is a read access. 395 /// The structure for a [Send] that is a read access.
353 class GetStructure<R, A> implements SendStructure<R, A> { 396 class GetStructure<R, A> implements SendStructure<R, A> {
354 /// The target of the read access. 397 /// The target of the read access.
355 final AccessSemantics semantics; 398 final AccessSemantics semantics;
356 399
357 /// The [Selector] for the getter invocation. 400 /// The [Selector] for the getter invocation.
358 final Selector selector; 401 final Selector selector;
359 402
360 GetStructure(this.semantics, this.selector); 403 GetStructure(this.semantics, this.selector);
361 404
(...skipping 114 matching lines...) Expand 10 before | Expand all | Expand 10 after
476 case AccessKind.CONSTANT: 519 case AccessKind.CONSTANT:
477 return visitor.visitConstantGet( 520 return visitor.visitConstantGet(
478 node, 521 node,
479 semantics.constant, 522 semantics.constant,
480 arg); 523 arg);
481 case AccessKind.UNRESOLVED: 524 case AccessKind.UNRESOLVED:
482 return visitor.errorUnresolvedGet( 525 return visitor.errorUnresolvedGet(
483 node, 526 node,
484 semantics.element, 527 semantics.element,
485 arg); 528 arg);
529 case AccessKind.UNRESOLVED_SUPER:
530 return visitor.visitUnresolvedSuperGet(
531 node,
532 semantics.element,
533 arg);
486 case AccessKind.COMPOUND: 534 case AccessKind.COMPOUND:
487 // This is not a valid case. 535 // This is not a valid case.
488 break; 536 break;
489 } 537 }
490 throw new SpannableAssertionFailure(node, "Invalid getter: ${semantics}"); 538 throw new SpannableAssertionFailure(node, "Invalid getter: ${semantics}");
491 } 539 }
492 540
493 String toString() => 'get($selector,$semantics)'; 541 String toString() => 'get($selector,$semantics)';
494 } 542 }
495 543
(...skipping 138 matching lines...) Expand 10 before | Expand all | Expand 10 after
634 arg); 682 arg);
635 case AccessKind.SUPER_SETTER: 683 case AccessKind.SUPER_SETTER:
636 return visitor.visitSuperSetterSet( 684 return visitor.visitSuperSetterSet(
637 node, 685 node,
638 semantics.element, 686 semantics.element,
639 node.arguments.single, 687 node.arguments.single,
640 arg); 688 arg);
641 case AccessKind.CONSTANT: 689 case AccessKind.CONSTANT:
642 // TODO(johnniwinther): Should this be a valid case? 690 // TODO(johnniwinther): Should this be a valid case?
643 break; 691 break;
692 case AccessKind.UNRESOLVED_SUPER:
693 // TODO(johnniwinther): Handle this separately.
644 case AccessKind.UNRESOLVED: 694 case AccessKind.UNRESOLVED:
645 return visitor.errorUnresolvedSet( 695 return visitor.errorUnresolvedSet(
646 node, 696 node,
647 semantics.element, 697 semantics.element,
648 node.arguments.single, 698 node.arguments.single,
649 arg); 699 arg);
700 break;
650 case AccessKind.COMPOUND: 701 case AccessKind.COMPOUND:
651 // This is not a valid case. 702 // This is not a valid case.
652 break; 703 break;
653 } 704 }
654 throw new SpannableAssertionFailure(node, "Invalid setter: ${semantics}"); 705 throw new SpannableAssertionFailure(node, "Invalid setter: ${semantics}");
655 } 706 }
656 707
657 String toString() => 'set($selector,$semantics)'; 708 String toString() => 'set($selector,$semantics)';
658 } 709 }
659 710
(...skipping 46 matching lines...) Expand 10 before | Expand all | Expand 10 after
706 node, 757 node,
707 operator, 758 operator,
708 node.receiver, 759 node.receiver,
709 arg); 760 arg);
710 case AccessKind.SUPER_METHOD: 761 case AccessKind.SUPER_METHOD:
711 return visitor.visitSuperUnary( 762 return visitor.visitSuperUnary(
712 node, 763 node,
713 operator, 764 operator,
714 semantics.element, 765 semantics.element,
715 arg); 766 arg);
716 case AccessKind.UNRESOLVED: 767 case AccessKind.UNRESOLVED_SUPER:
717 return visitor.errorUnresolvedSuperUnary( 768 return visitor.visitUnresolvedSuperUnary(
718 node, 769 node,
719 operator, 770 operator,
720 semantics.element, 771 semantics.element,
721 arg); 772 arg);
722 default: 773 default:
723 // This is not a valid case. 774 // This is not a valid case.
724 break; 775 break;
725 } 776 }
726 throw new SpannableAssertionFailure(node, "Invalid setter: ${semantics}"); 777 throw new SpannableAssertionFailure(node, "Invalid setter: ${semantics}");
727 } 778 }
(...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after
765 node, 816 node,
766 node.receiver, 817 node.receiver,
767 node.arguments.single, 818 node.arguments.single,
768 arg); 819 arg);
769 case AccessKind.SUPER_METHOD: 820 case AccessKind.SUPER_METHOD:
770 return visitor.visitSuperIndex( 821 return visitor.visitSuperIndex(
771 node, 822 node,
772 semantics.element, 823 semantics.element,
773 node.arguments.single, 824 node.arguments.single,
774 arg); 825 arg);
775 case AccessKind.UNRESOLVED: 826 case AccessKind.UNRESOLVED_SUPER:
776 return visitor.errorUnresolvedSuperIndex( 827 return visitor.visitUnresolvedSuperIndex(
777 node, 828 node,
778 semantics.element, 829 semantics.element,
779 node.arguments.single, 830 node.arguments.single,
780 arg); 831 arg);
781 default: 832 default:
782 // This is not a valid case. 833 // This is not a valid case.
783 break; 834 break;
784 } 835 }
785 throw new SpannableAssertionFailure(node, "Invalid index: ${semantics}"); 836 throw new SpannableAssertionFailure(node, "Invalid index: ${semantics}");
786 } 837 }
(...skipping 96 matching lines...) Expand 10 before | Expand all | Expand 10 after
883 operator, 934 operator,
884 node.arguments.single, 935 node.arguments.single,
885 arg); 936 arg);
886 case AccessKind.SUPER_METHOD: 937 case AccessKind.SUPER_METHOD:
887 return visitor.visitSuperBinary( 938 return visitor.visitSuperBinary(
888 node, 939 node,
889 semantics.element, 940 semantics.element,
890 operator, 941 operator,
891 node.arguments.single, 942 node.arguments.single,
892 arg); 943 arg);
893 case AccessKind.UNRESOLVED: 944 case AccessKind.UNRESOLVED_SUPER:
894 return visitor.errorUnresolvedSuperBinary( 945 return visitor.visitUnresolvedSuperBinary(
895 node, 946 node,
896 semantics.element, 947 semantics.element,
897 operator, 948 operator,
898 node.arguments.single, 949 node.arguments.single,
899 arg); 950 arg);
900 default: 951 default:
901 // This is not a valid case. 952 // This is not a valid case.
902 break; 953 break;
903 } 954 }
904 throw new SpannableAssertionFailure( 955 throw new SpannableAssertionFailure(
(...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after
946 node.arguments.first, 997 node.arguments.first,
947 node.arguments.tail.head, 998 node.arguments.tail.head,
948 arg); 999 arg);
949 case AccessKind.SUPER_METHOD: 1000 case AccessKind.SUPER_METHOD:
950 return visitor.visitSuperIndexSet( 1001 return visitor.visitSuperIndexSet(
951 node, 1002 node,
952 semantics.element, 1003 semantics.element,
953 node.arguments.first, 1004 node.arguments.first,
954 node.arguments.tail.head, 1005 node.arguments.tail.head,
955 arg); 1006 arg);
1007 case AccessKind.UNRESOLVED_SUPER:
956 case AccessKind.UNRESOLVED: 1008 case AccessKind.UNRESOLVED:
1009 // TODO(johnniwinther): Support these through [AccessKind.COMPOUND].
957 return visitor.errorUnresolvedSuperIndexSet( 1010 return visitor.errorUnresolvedSuperIndexSet(
958 node, 1011 node,
959 semantics.element, 1012 semantics.element,
960 node.arguments.first, 1013 node.arguments.first,
961 node.arguments.tail.head, 1014 node.arguments.tail.head,
962 arg); 1015 arg);
963 default: 1016 default:
964 // This is not a valid case. 1017 // This is not a valid case.
965 break; 1018 break;
966 } 1019 }
(...skipping 28 matching lines...) Expand all
995 1048
996 R dispatch(SemanticSendVisitor<R, A> visitor, Send node, A arg) { 1049 R dispatch(SemanticSendVisitor<R, A> visitor, Send node, A arg) {
997 switch (semantics.kind) { 1050 switch (semantics.kind) {
998 case AccessKind.DYNAMIC_PROPERTY: 1051 case AccessKind.DYNAMIC_PROPERTY:
999 return visitor.visitIndexPrefix( 1052 return visitor.visitIndexPrefix(
1000 node, 1053 node,
1001 node.receiver, 1054 node.receiver,
1002 node.arguments.single, 1055 node.arguments.single,
1003 operator, 1056 operator,
1004 arg); 1057 arg);
1058 case AccessKind.UNRESOLVED_SUPER:
1005 case AccessKind.UNRESOLVED: 1059 case AccessKind.UNRESOLVED:
1060 // TODO(johnniwinther): Support these through [AccessKind.COMPOUND].
1006 return visitor.errorUnresolvedSuperIndexPrefix( 1061 return visitor.errorUnresolvedSuperIndexPrefix(
1007 node, 1062 node,
1008 semantics.element, 1063 semantics.element,
1009 node.arguments.single, 1064 node.arguments.single,
1010 operator, 1065 operator,
1011 arg); 1066 arg);
1012 case AccessKind.COMPOUND: 1067 case AccessKind.COMPOUND:
1013 CompoundAccessSemantics compoundSemantics = semantics; 1068 CompoundAccessSemantics compoundSemantics = semantics;
1014 switch (compoundSemantics.compoundAccessKind) { 1069 switch (compoundSemantics.compoundAccessKind) {
1015 case CompoundAccessKind.SUPER_GETTER_SETTER: 1070 case CompoundAccessKind.SUPER_GETTER_SETTER:
(...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after
1058 1113
1059 R dispatch(SemanticSendVisitor<R, A> visitor, Send node, A arg) { 1114 R dispatch(SemanticSendVisitor<R, A> visitor, Send node, A arg) {
1060 switch (semantics.kind) { 1115 switch (semantics.kind) {
1061 case AccessKind.DYNAMIC_PROPERTY: 1116 case AccessKind.DYNAMIC_PROPERTY:
1062 return visitor.visitIndexPostfix( 1117 return visitor.visitIndexPostfix(
1063 node, 1118 node,
1064 node.receiver, 1119 node.receiver,
1065 node.arguments.single, 1120 node.arguments.single,
1066 operator, 1121 operator,
1067 arg); 1122 arg);
1123 case AccessKind.UNRESOLVED_SUPER:
1068 case AccessKind.UNRESOLVED: 1124 case AccessKind.UNRESOLVED:
1125 // TODO(johnniwinther): Support these through [AccessKind.COMPOUND].
1069 return visitor.errorUnresolvedSuperIndexPostfix( 1126 return visitor.errorUnresolvedSuperIndexPostfix(
1070 node, 1127 node,
1071 semantics.element, 1128 semantics.element,
1072 node.arguments.single, 1129 node.arguments.single,
1073 operator, 1130 operator,
1074 arg); 1131 arg);
1075 case AccessKind.COMPOUND: 1132 case AccessKind.COMPOUND:
1076 CompoundAccessSemantics compoundSemantics = semantics; 1133 CompoundAccessSemantics compoundSemantics = semantics;
1077 switch (compoundSemantics.compoundAccessKind) { 1134 switch (compoundSemantics.compoundAccessKind) {
1078 case CompoundAccessKind.SUPER_GETTER_SETTER: 1135 case CompoundAccessKind.SUPER_GETTER_SETTER:
(...skipping 156 matching lines...) Expand 10 before | Expand all | Expand 10 after
1235 break; 1292 break;
1236 case AccessKind.SUPER_GETTER: 1293 case AccessKind.SUPER_GETTER:
1237 // This is not a valid case. 1294 // This is not a valid case.
1238 break; 1295 break;
1239 case AccessKind.SUPER_SETTER: 1296 case AccessKind.SUPER_SETTER:
1240 // This is not a valid case. 1297 // This is not a valid case.
1241 break; 1298 break;
1242 case AccessKind.CONSTANT: 1299 case AccessKind.CONSTANT:
1243 // TODO(johnniwinther): Should this be a valid case? 1300 // TODO(johnniwinther): Should this be a valid case?
1244 break; 1301 break;
1302 case AccessKind.UNRESOLVED_SUPER:
1245 case AccessKind.UNRESOLVED: 1303 case AccessKind.UNRESOLVED:
1304 // TODO(johnniwinther): Support these through [AccessKind.COMPOUND].
1246 return visitor.errorUnresolvedCompound( 1305 return visitor.errorUnresolvedCompound(
1247 node, 1306 node,
1248 semantics.element, 1307 semantics.element,
1249 operator, 1308 operator,
1250 node.arguments.single, 1309 node.arguments.single,
1251 arg); 1310 arg);
1252 case AccessKind.COMPOUND: 1311 case AccessKind.COMPOUND:
1253 CompoundAccessSemantics compoundSemantics = semantics; 1312 CompoundAccessSemantics compoundSemantics = semantics;
1254 switch (compoundSemantics.compoundAccessKind) { 1313 switch (compoundSemantics.compoundAccessKind) {
1255 case CompoundAccessKind.STATIC_GETTER_SETTER: 1314 case CompoundAccessKind.STATIC_GETTER_SETTER:
(...skipping 95 matching lines...) Expand 10 before | Expand all | Expand 10 after
1351 R dispatch(SemanticSendVisitor<R, A> visitor, Send node, A arg) { 1410 R dispatch(SemanticSendVisitor<R, A> visitor, Send node, A arg) {
1352 switch (semantics.kind) { 1411 switch (semantics.kind) {
1353 case AccessKind.DYNAMIC_PROPERTY: 1412 case AccessKind.DYNAMIC_PROPERTY:
1354 return visitor.visitCompoundIndexSet( 1413 return visitor.visitCompoundIndexSet(
1355 node, 1414 node,
1356 node.receiver, 1415 node.receiver,
1357 node.arguments.first, 1416 node.arguments.first,
1358 operator, 1417 operator,
1359 node.arguments.tail.head, 1418 node.arguments.tail.head,
1360 arg); 1419 arg);
1420 case AccessKind.UNRESOLVED_SUPER:
1361 case AccessKind.UNRESOLVED: 1421 case AccessKind.UNRESOLVED:
1422 // TODO(johnniwinther): Support these through [AccessKind.COMPOUND].
1362 return visitor.errorUnresolvedSuperCompoundIndexSet( 1423 return visitor.errorUnresolvedSuperCompoundIndexSet(
1363 node, 1424 node,
1364 semantics.element, 1425 semantics.element,
1365 node.arguments.first, 1426 node.arguments.first,
1366 operator, 1427 operator,
1367 node.arguments.tail.head, 1428 node.arguments.tail.head,
1368 arg); 1429 arg);
1369 case AccessKind.COMPOUND: 1430 case AccessKind.COMPOUND:
1370 CompoundAccessSemantics compoundSemantics = semantics; 1431 CompoundAccessSemantics compoundSemantics = semantics;
1371 switch (compoundSemantics.compoundAccessKind) { 1432 switch (compoundSemantics.compoundAccessKind) {
(...skipping 148 matching lines...) Expand 10 before | Expand all | Expand 10 after
1520 break; 1581 break;
1521 case AccessKind.SUPER_GETTER: 1582 case AccessKind.SUPER_GETTER:
1522 // This is not a valid case. 1583 // This is not a valid case.
1523 break; 1584 break;
1524 case AccessKind.SUPER_SETTER: 1585 case AccessKind.SUPER_SETTER:
1525 // This is not a valid case. 1586 // This is not a valid case.
1526 break; 1587 break;
1527 case AccessKind.CONSTANT: 1588 case AccessKind.CONSTANT:
1528 // TODO(johnniwinther): Should this be a valid case? 1589 // TODO(johnniwinther): Should this be a valid case?
1529 break; 1590 break;
1591 case AccessKind.UNRESOLVED_SUPER:
1530 case AccessKind.UNRESOLVED: 1592 case AccessKind.UNRESOLVED:
1593 // TODO(johnniwinther): Support these through [AccessKind.COMPOUND].
1531 return visitor.errorUnresolvedPrefix( 1594 return visitor.errorUnresolvedPrefix(
1532 node, 1595 node,
1533 semantics.element, 1596 semantics.element,
1534 operator, 1597 operator,
1535 arg); 1598 arg);
1536 case AccessKind.COMPOUND: 1599 case AccessKind.COMPOUND:
1537 CompoundAccessSemantics compoundSemantics = semantics; 1600 CompoundAccessSemantics compoundSemantics = semantics;
1538 switch (compoundSemantics.compoundAccessKind) { 1601 switch (compoundSemantics.compoundAccessKind) {
1539 case CompoundAccessKind.STATIC_GETTER_SETTER: 1602 case CompoundAccessKind.STATIC_GETTER_SETTER:
1540 return visitor.visitStaticGetterSetterPrefix( 1603 return visitor.visitStaticGetterSetterPrefix(
(...skipping 193 matching lines...) Expand 10 before | Expand all | Expand 10 after
1734 break; 1797 break;
1735 case AccessKind.SUPER_GETTER: 1798 case AccessKind.SUPER_GETTER:
1736 // This is not a valid case. 1799 // This is not a valid case.
1737 break; 1800 break;
1738 case AccessKind.SUPER_SETTER: 1801 case AccessKind.SUPER_SETTER:
1739 // This is not a valid case. 1802 // This is not a valid case.
1740 break; 1803 break;
1741 case AccessKind.CONSTANT: 1804 case AccessKind.CONSTANT:
1742 // TODO(johnniwinther): Should this be a valid case? 1805 // TODO(johnniwinther): Should this be a valid case?
1743 break; 1806 break;
1807 case AccessKind.UNRESOLVED_SUPER:
1744 case AccessKind.UNRESOLVED: 1808 case AccessKind.UNRESOLVED:
1809 // TODO(johnniwinther): Support these through [AccessKind.COMPOUND].
1745 return visitor.errorUnresolvedPostfix( 1810 return visitor.errorUnresolvedPostfix(
1746 node, 1811 node,
1747 semantics.element, 1812 semantics.element,
1748 operator, 1813 operator,
1749 arg); 1814 arg);
1750 case AccessKind.COMPOUND: 1815 case AccessKind.COMPOUND:
1751 CompoundAccessSemantics compoundSemantics = semantics; 1816 CompoundAccessSemantics compoundSemantics = semantics;
1752 switch (compoundSemantics.compoundAccessKind) { 1817 switch (compoundSemantics.compoundAccessKind) {
1753 case CompoundAccessKind.STATIC_GETTER_SETTER: 1818 case CompoundAccessKind.STATIC_GETTER_SETTER:
1754 return visitor.visitStaticGetterSetterPostfix( 1819 return visitor.visitStaticGetterSetterPostfix(
(...skipping 329 matching lines...) Expand 10 before | Expand all | Expand 10 after
2084 final ConstructorElement constructor; 2149 final ConstructorElement constructor;
2085 final Selector selector; 2150 final Selector selector;
2086 2151
2087 ThisConstructorInvokeStructure(this.constructor, this.selector); 2152 ThisConstructorInvokeStructure(this.constructor, this.selector);
2088 2153
2089 R dispatch(SemanticDeclarationVisitor<R, A> visitor, Send node, A arg) { 2154 R dispatch(SemanticDeclarationVisitor<R, A> visitor, Send node, A arg) {
2090 return visitor.visitThisConstructorInvoke( 2155 return visitor.visitThisConstructorInvoke(
2091 node, constructor, node.argumentsNode, selector, arg); 2156 node, constructor, node.argumentsNode, selector, arg);
2092 } 2157 }
2093 } 2158 }
OLDNEW
« no previous file with comments | « pkg/compiler/lib/src/resolution/send_resolver.dart ('k') | pkg/compiler/lib/src/resolved_visitor.dart » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698