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

Side by Side Diff: pkg/compiler/lib/src/serialization/equivalence.dart

Issue 1884583002: Add structural equivalence test for AST nodes. (Closed) Base URL: https://github.com/dart-lang/sdk.git@master
Patch Set: Created 4 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
« no previous file with comments | « no previous file | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright (c) 2016, the Dart project authors. Please see the AUTHORS file 1 // Copyright (c) 2016, 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 /// Functions for asserting equivalence across serialization. 5 /// Functions for asserting equivalence across serialization.
6 6
7 library dart2js.serialization.equivalence; 7 library dart2js.serialization.equivalence;
8 8
9 import '../common/resolution.dart'; 9 import '../common/resolution.dart';
10 import '../constants/expressions.dart'; 10 import '../constants/expressions.dart';
11 import '../dart_types.dart'; 11 import '../dart_types.dart';
12 import '../elements/elements.dart'; 12 import '../elements/elements.dart';
13 import '../elements/visitor.dart'; 13 import '../elements/visitor.dart';
14 import '../resolution/send_structure.dart'; 14 import '../resolution/send_structure.dart';
15 import '../resolution/tree_elements.dart'; 15 import '../resolution/tree_elements.dart';
16 import '../tokens/token.dart'; 16 import '../tokens/token.dart';
17 import '../tree/nodes.dart'; 17 import '../tree/nodes.dart';
18 import '../universe/selector.dart'; 18 import '../universe/selector.dart';
19 import '../universe/use.dart'; 19 import '../universe/use.dart';
20 import '../util/util.dart';
20 import 'resolved_ast_serialization.dart'; 21 import 'resolved_ast_serialization.dart';
21 22
22 /// Equality based equivalence function. 23 /// Equality based equivalence function.
23 bool equality(a, b) => a == b; 24 bool equality(a, b) => a == b;
24 25
25 /// Returns `true` if the elements in [a] and [b] are pair-wise equivalent 26 /// Returns `true` if the elements in [a] and [b] are pair-wise equivalent
26 /// according to [elementEquivalence]. 27 /// according to [elementEquivalence].
27 bool areListsEquivalent(List a, List b, 28 bool areListsEquivalent(List a, List b,
28 [bool elementEquivalence(a, b) = equality]) { 29 [bool elementEquivalence(a, b) = equality]) {
29 if (a.length != b.length) return false; 30 if (a.length != b.length) return false;
(...skipping 600 matching lines...) Expand 10 before | Expand all | Expand 10 after
630 strategy.testSets(impact1, impact2, 'typeUses', impact1.typeUses, 631 strategy.testSets(impact1, impact2, 'typeUses', impact1.typeUses,
631 impact2.typeUses, areTypeUsesEquivalent); 632 impact2.typeUses, areTypeUsesEquivalent);
632 } 633 }
633 634
634 /// Tests the equivalence of [resolvedAst1] and [resolvedAst2] using [strategy]. 635 /// Tests the equivalence of [resolvedAst1] and [resolvedAst2] using [strategy].
635 bool testResolvedAstEquivalence( 636 bool testResolvedAstEquivalence(
636 ResolvedAst resolvedAst1, ResolvedAst resolvedAst2, 637 ResolvedAst resolvedAst1, ResolvedAst resolvedAst2,
637 [TestStrategy strategy = const TestStrategy()]) { 638 [TestStrategy strategy = const TestStrategy()]) {
638 return strategy.testElements(resolvedAst1, resolvedAst2, 'element', 639 return strategy.testElements(resolvedAst1, resolvedAst2, 'element',
639 resolvedAst1.element, resolvedAst2.element) && 640 resolvedAst1.element, resolvedAst2.element) &&
640 // Compute AST equivalence by structural comparison. 641 new NodeEquivalenceVisitor(strategy).testNodes(resolvedAst1, resolvedAst2,
641 strategy.test( 642 'node', resolvedAst1.node, resolvedAst2.node) &&
642 resolvedAst1,
643 resolvedAst2,
644 'node',
645 resolvedAst1.node.toDebugString(),
646 resolvedAst2.node.toDebugString()) &&
647 testTreeElementsEquivalence(resolvedAst1, resolvedAst2, strategy); 643 testTreeElementsEquivalence(resolvedAst1, resolvedAst2, strategy);
648 } 644 }
649 645
650 /// Tests the equivalence of the data stored in the [TreeElements] of 646 /// Tests the equivalence of the data stored in the [TreeElements] of
651 /// [resolvedAst1] and [resolvedAst2] using [strategy]. 647 /// [resolvedAst1] and [resolvedAst2] using [strategy].
652 bool testTreeElementsEquivalence( 648 bool testTreeElementsEquivalence(
653 ResolvedAst resolvedAst1, ResolvedAst resolvedAst2, 649 ResolvedAst resolvedAst1, ResolvedAst resolvedAst2,
654 [TestStrategy strategy = const TestStrategy()]) { 650 [TestStrategy strategy = const TestStrategy()]) {
655 AstIndexComputer indices1 = new AstIndexComputer(); 651 AstIndexComputer indices1 = new AstIndexComputer();
656 resolvedAst1.node.accept(indices1); 652 resolvedAst1.node.accept(indices1);
(...skipping 141 matching lines...) Expand 10 before | Expand all | Expand 10 after
798 int index = indices1.nodeIndices[node1]; 794 int index = indices1.nodeIndices[node1];
799 RedirectingFactoryBody node2 = indices2.nodeList[index]; 795 RedirectingFactoryBody node2 = indices2.nodeList[index];
800 success = strategy.testElements( 796 success = strategy.testElements(
801 node1, 797 node1,
802 node2, 798 node2,
803 'getRedirectingTargetConstructor($index)', 799 'getRedirectingTargetConstructor($index)',
804 elements1.getRedirectingTargetConstructor(node1), 800 elements1.getRedirectingTargetConstructor(node1),
805 elements2.getRedirectingTargetConstructor(node2)); 801 elements2.getRedirectingTargetConstructor(node2));
806 } 802 }
807 } 803 }
804
805 class NodeEquivalenceVisitor implements Visitor1<bool, Node> {
806 final TestStrategy strategy;
807
808 const NodeEquivalenceVisitor([this.strategy = const TestStrategy()]);
809
810 bool testNodes(
811 var object1, var object2, String property, Node node1, Node node2) {
Siggi Cherem (dart-lang) 2016/04/12 17:36:06 do you need `property`? seems unused in all test*
Johnni Winther 2016/04/13 07:34:02 These were meant for the CheckStrategy. I'll leave
812 if (node1 == node2) return true;
813 if (node1 == null || node2 == null) return false;
814 return node1.accept1(this, node2);
815 }
816
817 bool testNodeLists(var object1, var object2, String property,
818 Link<Node> list1, Link<Node> list2) {
819 if (list1 == list2) return true;
820 if (list1 == null || list2 == null) return false;
821 while (list1.isNotEmpty && list2.isNotEmpty) {
822 if (!list1.head.accept1(this, list2.head)) {
823 return false;
824 }
825 list1 = list1.tail;
826 list2 = list2.tail;
827 }
828 return list1.isEmpty && list2.isEmpty;
829 }
830
831 bool testTokens(
832 var object1, var object2, String property, Token token1, Token token2) {
833 if (token1 == token2) return true;
834 if (token1 == null || token2 == null) return false;
835 return token1.hashCode == token2.hashCode;
836 }
837
838 @override
839 bool visitAssert(Assert node1, Assert node2) {
840 return testTokens(node1, node2, 'assertToken', node1.assertToken,
841 node2.assertToken) &&
842 testNodes(
843 node1, node2, 'condition', node1.condition, node2.condition) &&
844 testNodes(node1, node2, 'message', node1.message, node2.message);
845 }
846
847 @override
848 bool visitAsyncForIn(AsyncForIn node1, AsyncForIn node2) {
849 return visitForIn(node1, node2) &&
850 testTokens(
851 node1, node2, 'awaitToken', node1.awaitToken, node2.awaitToken);
852 }
853
854 @override
855 bool visitAsyncModifier(AsyncModifier node1, AsyncModifier node2) {
856 return testTokens(
857 node1, node2, 'asyncToken', node1.asyncToken, node2.asyncToken) &&
858 testTokens(node1, node2, 'starToken', node1.starToken, node2.starToken);
859 }
860
861 @override
862 bool visitAwait(Await node1, Await node2) {
863 return testTokens(
864 node1, node2, 'awaitToken', node1.awaitToken, node2.awaitToken) &&
865 testNodes(
866 node1, node2, 'expression', node1.expression, node2.expression);
867 }
868
869 @override
870 bool visitBlock(Block node1, Block node2) {
871 return testNodes(
872 node1, node2, 'statements', node1.statements, node2.statements);
873 }
874
875 @override
876 bool visitBreakStatement(BreakStatement node1, BreakStatement node2) {
877 return testTokens(node1, node2, 'keywordToken', node1.keywordToken,
878 node2.keywordToken) &&
879 testNodes(node1, node2, 'target', node1.target, node2.target);
880 }
881
882 @override
883 bool visitCascade(Cascade node1, Cascade node2) {
884 return testNodes(
885 node1, node2, 'expression', node1.expression, node2.expression);
886 }
887
888 @override
889 bool visitCascadeReceiver(CascadeReceiver node1, CascadeReceiver node2) {
890 return testTokens(node1, node2, 'cascadeOperator', node1.cascadeOperator,
891 node2.cascadeOperator) &&
892 testNodes(
893 node1, node2, 'expression', node1.expression, node2.expression);
894 }
895
896 @override
897 bool visitCaseMatch(CaseMatch node1, CaseMatch node2) {
898 return testTokens(node1, node2, 'caseKeyword', node1.caseKeyword,
899 node2.caseKeyword) &&
900 testNodes(
901 node1, node2, 'expression', node1.expression, node2.expression);
902 }
903
904 @override
905 bool visitCatchBlock(CatchBlock node1, CatchBlock node2) {
906 return testTokens(node1, node2, 'catchKeyword', node1.catchKeyword,
907 node2.catchKeyword) &&
908 testTokens(
909 node1, node2, 'onKeyword', node1.onKeyword, node2.onKeyword) &&
910 testNodes(node1, node2, 'type', node1.type, node2.type) &&
911 testNodes(node1, node2, 'formals', node1.formals, node2.formals) &&
912 testNodes(node1, node2, 'block', node1.block, node2.block);
913 }
914
915 @override
916 bool visitClassNode(ClassNode node1, ClassNode node2) {
917 return testTokens(
918 node1, node2, 'beginToken', node1.beginToken, node2.beginToken) &&
919 testTokens(node1, node2, 'extendsKeyword', node1.extendsKeyword,
920 node2.extendsKeyword) &&
921 testTokens(node1, node2, 'endToken', node1.endToken, node2.endToken) &&
922 testNodes(
923 node1, node2, 'modifiers', node1.modifiers, node2.modifiers) &&
924 testNodes(node1, node2, 'name', node1.name, node2.name) &&
925 testNodes(
926 node1, node2, 'superclass', node1.superclass, node2.superclass) &&
927 testNodes(
928 node1, node2, 'interfaces', node1.interfaces, node2.interfaces) &&
929 testNodes(node1, node2, 'typeParameters', node1.typeParameters,
930 node2.typeParameters) &&
931 testNodes(node1, node2, 'body', node1.body, node2.body);
932 }
933
934 @override
935 bool visitCombinator(Combinator node1, Combinator node2) {
936 return testTokens(node1, node2, 'keywordToken', node1.keywordToken,
937 node2.keywordToken) &&
938 testNodes(
939 node1, node2, 'identifiers', node1.identifiers, node2.identifiers);
940 }
941
942 @override
943 bool visitConditional(Conditional node1, Conditional node2) {
944 return testTokens(node1, node2, 'questionToken', node1.questionToken,
945 node2.questionToken) &&
946 testTokens(
947 node1, node2, 'colonToken', node1.colonToken, node2.colonToken) &&
948 testNodes(
949 node1, node2, 'condition', node1.condition, node2.condition) &&
950 testNodes(node1, node2, 'thenExpression', node1.thenExpression,
951 node2.thenExpression) &&
952 testNodes(node1, node2, 'elseExpression', node1.elseExpression,
953 node2.elseExpression);
954 }
955
956 @override
957 bool visitConditionalUri(ConditionalUri node1, ConditionalUri node2) {
958 return testTokens(node1, node2, 'ifToken', node1.ifToken, node2.ifToken) &&
959 testNodes(node1, node2, 'key', node1.key, node2.key) &&
960 testNodes(node1, node2, 'value', node1.value, node2.value) &&
961 testNodes(node1, node2, 'uri', node1.uri, node2.uri);
962 }
963
964 @override
965 bool visitContinueStatement(
966 ContinueStatement node1, ContinueStatement node2) {
967 return testTokens(node1, node2, 'keywordToken', node1.keywordToken,
968 node2.keywordToken) &&
969 testNodes(node1, node2, 'target', node1.target, node2.target);
970 }
971
972 @override
973 bool visitDoWhile(DoWhile node1, DoWhile node2) {
974 return testTokens(
975 node1, node2, 'doKeyword', node1.doKeyword, node2.doKeyword) &&
976 testTokens(node1, node2, 'whileKeyword', node1.whileKeyword,
977 node2.whileKeyword) &&
978 testTokens(node1, node2, 'endToken', node1.endToken, node2.endToken) &&
979 testNodes(
980 node1, node2, 'condition', node1.condition, node2.condition) &&
981 testNodes(node1, node2, 'body', node1.body, node2.body);
982 }
983
984 @override
985 bool visitDottedName(DottedName node1, DottedName node2) {
986 return testTokens(node1, node2, 'token', node1.token, node2.token) &&
987 testNodes(
988 node1, node2, 'identifiers', node1.identifiers, node2.identifiers);
989 }
990
991 @override
992 bool visitEmptyStatement(EmptyStatement node1, EmptyStatement node2) {
993 return testTokens(node1, node2, 'semicolonToken', node1.semicolonToken,
994 node2.semicolonToken);
995 }
996
997 @override
998 bool visitEnum(Enum node1, Enum node2) {
999 return testTokens(
1000 node1, node2, 'enumToken', node1.enumToken, node2.enumToken) &&
1001 testNodes(node1, node2, 'name', node1.name, node2.name) &&
1002 testNodes(node1, node2, 'names', node1.names, node2.names);
1003 }
1004
1005 @override
1006 bool visitExport(Export node1, Export node2) {
1007 return visitLibraryDependency(node1, node2) &&
1008 testTokens(node1, node2, 'exportKeyword', node1.exportKeyword,
1009 node2.exportKeyword);
1010 }
1011
1012 @override
1013 bool visitExpressionStatement(
1014 ExpressionStatement node1, ExpressionStatement node2) {
1015 return testTokens(
1016 node1, node2, 'endToken', node1.endToken, node2.endToken) &&
1017 testNodes(
1018 node1, node2, 'expression', node1.expression, node2.expression);
1019 }
1020
1021 @override
1022 bool visitFor(For node1, For node2) {
1023 return testTokens(
1024 node1, node2, 'forToken', node1.forToken, node2.forToken) &&
1025 testNodes(node1, node2, 'initializer', node1.initializer,
1026 node2.initializer) &&
1027 testNodes(node1, node2, 'conditionStatement', node1.conditionStatement,
1028 node2.conditionStatement) &&
1029 testNodes(node1, node2, 'update', node1.update, node2.update) &&
1030 testNodes(node1, node2, 'body', node1.body, node2.body);
1031 }
1032
1033 @override
1034 bool visitForIn(ForIn node1, ForIn node2) {
1035 return testNodes(
1036 node1, node2, 'condition', node1.condition, node2.condition) &&
1037 testNodes(
1038 node1, node2, 'expression', node1.expression, node2.expression) &&
1039 testNodes(node1, node2, 'body', node1.expression, node2.body) &&
1040 testNodes(node1, node2, 'declaredIdentifier', node1.declaredIdentifier,
1041 node2.declaredIdentifier);
1042 }
1043
1044 @override
1045 bool visitFunctionDeclaration(
1046 FunctionDeclaration node1, FunctionDeclaration node2) {
1047 return testNodes(node1, node2, 'function', node1.function, node2.function);
1048 }
1049
1050 @override
1051 bool visitFunctionExpression(
1052 FunctionExpression node1, FunctionExpression node2) {
1053 return testTokens(
1054 node1, node2, 'getOrSet', node1.getOrSet, node2.getOrSet) &&
1055 testNodes(node1, node2, 'name', node1.name, node2.name) &&
1056 testNodes(
1057 node1, node2, 'parameters', node1.parameters, node2.parameters) &&
1058 testNodes(node1, node2, 'body', node1.body, node2.body) &&
1059 testNodes(
1060 node1, node2, 'returnType', node1.returnType, node2.returnType) &&
1061 testNodes(
1062 node1, node2, 'modifiers', node1.modifiers, node2.modifiers) &&
1063 testNodes(node1, node2, 'initializers', node1.initializers,
1064 node2.initializers) &&
1065 testNodes(node1, node2, 'asyncModifier', node1.asyncModifier,
1066 node2.asyncModifier);
1067 }
1068
1069 @override
1070 bool visitGotoStatement(GotoStatement node1, GotoStatement node2) {
1071 return testTokens(node1, node2, 'keywordToken', node1.keywordToken,
1072 node2.keywordToken) &&
1073 testTokens(node1, node2, 'semicolonToken', node1.semicolonToken,
1074 node2.semicolonToken) &&
1075 testNodes(node1, node2, 'target', node1.target, node2.target);
1076 }
1077
1078 @override
1079 bool visitIdentifier(Identifier node1, Identifier node2) {
1080 return testTokens(node1, node2, 'token', node1.token, node2.token);
1081 }
1082
1083 @override
1084 bool visitIf(If node1, If node2) {
1085 return testTokens(node1, node2, 'ifToken', node1.ifToken, node2.ifToken) &&
1086 testTokens(
1087 node1, node2, 'elseToken', node1.elseToken, node2.elseToken) &&
1088 testNodes(
1089 node1, node2, 'condition', node1.condition, node2.condition) &&
1090 testNodes(node1, node2, 'thenPart', node1.thenPart, node2.thenPart) &&
1091 testNodes(node1, node2, 'elsePart', node1.elsePart, node2.elsePart);
1092 }
1093
1094 @override
1095 bool visitImport(Import node1, Import node2) {
1096 return visitLibraryDependency(node1, node2) &&
1097 testTokens(node1, node2, 'importKeyword', node1.importKeyword,
1098 node2.importKeyword) &&
1099 testNodes(node1, node2, 'prefix', node1.prefix, node2.prefix) &&
1100 strategy.test(
1101 node1, node2, 'isDeferred', node1.isDeferred, node2.isDeferred);
1102 }
1103
1104 @override
1105 bool visitLabel(Label node1, Label node2) {
1106 return testTokens(
1107 node1, node2, 'colonToken', node1.colonToken, node2.colonToken) &&
1108 testNodes(
1109 node1, node2, 'identifier', node1.identifier, node2.identifier);
1110 }
1111
1112 @override
1113 bool visitLabeledStatement(LabeledStatement node1, LabeledStatement node2) {
1114 return testNodes(node1, node2, 'labels', node1.labels, node2.labels) &&
1115 testNodes(node1, node2, 'statement', node1.statement, node2.statement);
1116 }
1117
1118 @override
1119 bool visitLibraryDependency(
1120 LibraryDependency node1, LibraryDependency node2) {
1121 return visitLibraryTag(node1, node2) &&
1122 testNodes(node1, node2, 'uri', node1.uri, node2.uri) &&
1123 testNodes(node1, node2, 'conditionalUris', node1.conditionalUris,
1124 node2.conditionalUris) &&
1125 testNodes(
1126 node1, node2, 'combinators', node1.combinators, node2.combinators);
1127 }
1128
1129 @override
1130 bool visitLibraryName(LibraryName node1, LibraryName node2) {
1131 return visitLibraryTag(node1, node2) &&
1132 testTokens(node1, node2, 'libraryKeyword', node1.libraryKeyword,
1133 node2.libraryKeyword) &&
1134 testNodes(node1, node2, 'name', node1.name, node2.name);
1135 }
1136
1137 @override
1138 bool visitLibraryTag(LibraryTag node1, LibraryTag node2) {
1139 // TODO(johnniwinther): Check metadata?
1140 return true;
1141 }
1142
1143 @override
1144 bool visitLiteral(Literal node1, Literal node2) {
1145 return testTokens(node1, node2, 'token', node1.token, node2.token);
1146 }
1147
1148 @override
1149 bool visitLiteralBool(LiteralBool node1, LiteralBool node2) {
1150 return visitLiteral(node1, node2);
1151 }
1152
1153 @override
1154 bool visitLiteralDouble(LiteralDouble node1, LiteralDouble node2) {
1155 return visitLiteral(node1, node2);
1156 }
1157
1158 @override
1159 bool visitLiteralInt(LiteralInt node1, LiteralInt node2) {
1160 return visitLiteral(node1, node2);
1161 }
1162
1163 @override
1164 bool visitLiteralList(LiteralList node1, LiteralList node2) {
1165 return testTokens(node1, node2, 'constKeyword', node1.constKeyword,
1166 node2.constKeyword) &&
1167 testNodes(node1, node2, 'typeArguments', node1.typeArguments,
1168 node2.typeArguments) &&
1169 testNodes(node1, node2, 'elements', node1.elements, node2.elements);
1170 }
1171
1172 @override
1173 bool visitLiteralMap(LiteralMap node1, LiteralMap node2) {
1174 return testTokens(node1, node2, 'constKeyword', node1.constKeyword,
1175 node2.constKeyword) &&
1176 testNodes(node1, node2, 'typeArguments', node1.typeArguments,
1177 node2.typeArguments) &&
1178 testNodes(node1, node2, 'entries', node1.entries, node2.entries);
1179 }
1180
1181 @override
1182 bool visitLiteralMapEntry(LiteralMapEntry node1, LiteralMapEntry node2) {
1183 return testTokens(
1184 node1, node2, 'colonToken', node1.colonToken, node2.colonToken) &&
1185 testNodes(node1, node2, 'key', node1.key, node2.key) &&
1186 testNodes(node1, node2, 'value', node1.value, node2.value);
1187 }
1188
1189 @override
1190 bool visitLiteralNull(LiteralNull node1, LiteralNull node2) {
1191 return visitLiteral(node1, node2);
1192 }
1193
1194 @override
1195 bool visitLiteralString(LiteralString node1, LiteralString node2) {
1196 return testTokens(node1, node2, 'token', node1.token, node2.token) &&
1197 strategy.test(
1198 node1, node2, 'dartString', node1.dartString, node2.dartString);
1199 }
1200
1201 @override
1202 bool visitLiteralSymbol(LiteralSymbol node1, LiteralSymbol node2) {
1203 return testTokens(
1204 node1, node2, 'hashToken', node1.hashToken, node2.hashToken) &&
1205 testNodes(
1206 node1, node2, 'identifiers', node1.identifiers, node2.identifiers);
1207 }
1208
1209 @override
1210 bool visitLoop(Loop node1, Loop node2) {
1211 return testNodes(
1212 node1, node2, 'condition', node1.condition, node2.condition) &&
1213 testNodes(node1, node2, 'body', node1.body, node2.body);
1214 }
1215
1216 @override
1217 bool visitMetadata(Metadata node1, Metadata node2) {
1218 return testTokens(node1, node2, 'token', node1.token, node2.token) &&
1219 testNodes(
1220 node1, node2, 'expression', node1.expression, node2.expression);
1221 }
1222
1223 @override
1224 bool visitMixinApplication(MixinApplication node1, MixinApplication node2) {
1225 return testNodes(
1226 node1, node2, 'superclass', node1.superclass, node2.superclass) &&
1227 testNodes(node1, node2, 'mixins', node1.mixins, node2.mixins);
1228 }
1229
1230 @override
1231 bool visitModifiers(Modifiers node1, Modifiers node2) {
1232 return strategy.test(node1, node2, 'flags', node1.flags, node2.flags) &&
1233 testNodes(node1, node2, 'nodes', node1.nodes, node2.nodes);
1234 }
1235
1236 @override
1237 bool visitNamedArgument(NamedArgument node1, NamedArgument node2) {
1238 return testTokens(
1239 node1, node2, 'colonToken', node1.colonToken, node2.colonToken) &&
1240 testNodes(node1, node2, 'name', node1.name, node2.name) &&
1241 testNodes(
1242 node1, node2, 'expression', node1.expression, node2.expression);
1243 }
1244
1245 @override
1246 bool visitNamedMixinApplication(
1247 NamedMixinApplication node1, NamedMixinApplication node2) {
1248 return testTokens(node1, node2, 'classKeyword', node1.classKeyword,
1249 node2.classKeyword) &&
1250 testTokens(node1, node2, 'endToken', node1.endToken, node2.endToken) &&
1251 testNodes(node1, node2, 'name', node1.name, node2.name) &&
1252 testNodes(node1, node2, 'typeParameters', node1.typeParameters,
1253 node2.typeParameters) &&
1254 testNodes(
1255 node1, node2, 'modifiers', node1.modifiers, node2.modifiers) &&
1256 testNodes(node1, node2, 'mixinApplication', node1.mixinApplication,
1257 node2.mixinApplication) &&
1258 testNodes(
1259 node1, node2, 'interfaces', node1.interfaces, node2.interfaces);
1260 }
1261
1262 @override
1263 bool visitNewExpression(NewExpression node1, NewExpression node2) {
1264 return testTokens(
1265 node1, node2, 'newToken', node1.newToken, node2.newToken) &&
1266 testNodes(node1, node2, 'send', node1.send, node2.send);
1267 }
1268
1269 @override
1270 bool visitNodeList(NodeList node1, NodeList node2) {
1271 return testTokens(
1272 node1, node2, 'beginToken', node1.beginToken, node2.beginToken) &&
1273 testTokens(node1, node2, 'endToken', node1.endToken, node2.endToken) &&
1274 strategy.test(
1275 node1, node2, 'delimiter', node1.delimiter, node2.delimiter) &&
1276 testNodeLists(node1, node2, 'nodes', node1.nodes, node2.nodes);
1277 }
1278
1279 @override
1280 bool visitOperator(Operator node1, Operator node2) {
1281 return visitIdentifier(node1, node2);
1282 }
1283
1284 @override
1285 bool visitParenthesizedExpression(
1286 ParenthesizedExpression node1, ParenthesizedExpression node2) {
1287 return testTokens(
1288 node1, node2, 'beginToken', node1.beginToken, node2.beginToken) &&
1289 testNodes(
1290 node1, node2, 'expression', node1.expression, node2.expression);
1291 }
1292
1293 @override
1294 bool visitPart(Part node1, Part node2) {
1295 return visitLibraryTag(node1, node2) &&
1296 testTokens(node1, node2, 'partKeyword', node1.partKeyword,
1297 node2.partKeyword) &&
1298 testNodes(node1, node2, 'uri', node1.uri, node2.uri);
1299 }
1300
1301 @override
1302 bool visitPartOf(PartOf node1, PartOf node2) {
1303 // TODO(johnniwinther): Check metadata?
1304 return testTokens(node1, node2, 'partKeyword', node1.partKeyword,
1305 node2.partKeyword) &&
1306 testNodes(node1, node2, 'name', node1.name, node2.name);
1307 }
1308
1309 @override
1310 bool visitPostfix(Postfix node1, Postfix node2) {
1311 return visitNodeList(node1, node2);
1312 }
1313
1314 @override
1315 bool visitPrefix(Prefix node1, Prefix node2) {
1316 return visitNodeList(node1, node2);
1317 }
1318
1319 @override
1320 bool visitRedirectingFactoryBody(
1321 RedirectingFactoryBody node1, RedirectingFactoryBody node2) {
1322 return testTokens(
1323 node1, node2, 'beginToken', node1.beginToken, node2.beginToken) &&
1324 testTokens(node1, node2, 'endToken', node1.endToken, node2.endToken) &&
1325 testNodes(node1, node2, 'constructorReference',
1326 node1.constructorReference, node2.constructorReference);
1327 }
1328
1329 @override
1330 bool visitRethrow(Rethrow node1, Rethrow node2) {
1331 return testTokens(
1332 node1, node2, 'throwToken', node1.throwToken, node2.throwToken) &&
1333 testTokens(node1, node2, 'endToken', node1.endToken, node2.endToken);
1334 }
1335
1336 @override
1337 bool visitReturn(Return node1, Return node2) {
1338 return testTokens(
1339 node1, node2, 'beginToken', node1.beginToken, node2.beginToken) &&
1340 testTokens(node1, node2, 'endToken', node1.endToken, node2.endToken) &&
1341 testNodes(
1342 node1, node2, 'expression', node1.expression, node2.expression);
1343 }
1344
1345 @override
1346 bool visitSend(Send node1, Send node2) {
1347 return strategy.test(node1, node2, 'isConditional', node1.isConditional,
1348 node2.isConditional) &&
1349 testNodes(node1, node2, 'receiver', node1.receiver, node2.receiver) &&
1350 testNodes(node1, node2, 'selector', node1.selector, node2.selector) &&
1351 testNodes(node1, node2, 'argumentsNode', node1.argumentsNode,
1352 node2.argumentsNode);
1353 }
1354
1355 @override
1356 bool visitSendSet(SendSet node1, SendSet node2) {
1357 return visitSend(node1, node2) &&
1358 testNodes(node1, node2, 'assignmentOperator', node1.assignmentOperator,
1359 node2.assignmentOperator);
1360 }
1361
1362 @override
1363 bool visitStringInterpolation(
1364 StringInterpolation node1, StringInterpolation node2) {
1365 return testNodes(node1, node2, 'string', node1.string, node2.string) &&
1366 testNodes(node1, node2, 'parts', node1.parts, node2.parts);
1367 }
1368
1369 @override
1370 bool visitStringInterpolationPart(
1371 StringInterpolationPart node1, StringInterpolationPart node2) {
1372 return testNodes(
1373 node1, node2, 'expression', node1.expression, node2.expression);
1374 }
1375
1376 @override
1377 bool visitStringJuxtaposition(
1378 StringJuxtaposition node1, StringJuxtaposition node2) {
1379 return testNodes(node1, node2, 'first', node1.first, node2.first) &&
1380 testNodes(node1, node2, 'second', node1.second, node2.second);
1381 }
1382
1383 @override
1384 bool visitSwitchCase(SwitchCase node1, SwitchCase node2) {
1385 return testTokens(node1, node2, 'defaultKeyword', node1.defaultKeyword,
1386 node2.defaultKeyword) &&
1387 testTokens(
1388 node1, node2, 'startToken', node1.startToken, node2.startToken) &&
1389 testNodes(node1, node2, 'labelsAndCases', node1.labelsAndCases,
1390 node2.labelsAndCases) &&
1391 testNodes(
1392 node1, node2, 'statements', node1.statements, node2.statements);
1393 }
1394
1395 @override
1396 bool visitSwitchStatement(SwitchStatement node1, SwitchStatement node2) {
1397 return testTokens(node1, node2, 'switchKeyword', node1.switchKeyword,
1398 node2.switchKeyword) &&
1399 testNodes(node1, node2, 'parenthesizedExpression',
1400 node1.parenthesizedExpression, node2.parenthesizedExpression) &&
1401 testNodes(node1, node2, 'cases', node1.cases, node2.cases);
1402 }
1403
1404 @override
1405 bool visitSyncForIn(SyncForIn node1, SyncForIn node2) {
1406 return visitForIn(node1, node2);
1407 }
1408
1409 @override
1410 bool visitThrow(Throw node1, Throw node2) {
1411 return testTokens(
1412 node1, node2, 'throwToken', node1.throwToken, node2.throwToken) &&
1413 testTokens(node1, node2, 'endToken', node1.endToken, node2.endToken) &&
1414 testNodes(
1415 node1, node2, 'expression', node1.expression, node2.expression);
1416 }
1417
1418 @override
1419 bool visitTryStatement(TryStatement node1, TryStatement node2) {
1420 return testTokens(
1421 node1, node2, 'tryKeyword', node1.tryKeyword, node2.tryKeyword) &&
1422 testTokens(node1, node2, 'finallyKeyword', node1.finallyKeyword,
1423 node2.finallyKeyword) &&
1424 testNodes(node1, node2, 'tryBlock', node1.tryBlock, node2.tryBlock) &&
1425 testNodes(node1, node2, 'catchBlocks', node1.catchBlocks,
1426 node2.catchBlocks) &&
1427 testNodes(node1, node2, 'finallyBlock', node1.finallyBlock,
1428 node2.finallyBlock);
1429 }
1430
1431 @override
1432 bool visitTypeAnnotation(TypeAnnotation node1, TypeAnnotation node2) {
1433 return testNodes(
1434 node1, node2, 'typeName', node1.typeName, node2.typeName) &&
1435 testNodes(node1, node2, 'typeArguments', node1.typeArguments,
1436 node2.typeArguments);
1437 }
1438
1439 @override
1440 bool visitTypeVariable(TypeVariable node1, TypeVariable node2) {
1441 return testNodes(node1, node2, 'name', node1.name, node2.name) &&
1442 testNodes(node1, node2, 'bound', node1.bound, node2.bound);
1443 }
1444
1445 @override
1446 bool visitTypedef(Typedef node1, Typedef node2) {
1447 return testTokens(node1, node2, 'typedefKeyword', node1.typedefKeyword,
1448 node2.typedefKeyword) &&
1449 testTokens(node1, node2, 'endToken', node1.endToken, node2.endToken) &&
1450 testNodes(
1451 node1, node2, 'returnType', node1.returnType, node2.returnType) &&
1452 testNodes(node1, node2, 'name', node1.name, node2.name) &&
1453 testNodes(node1, node2, 'typeParameters', node1.typeParameters,
1454 node2.typeParameters) &&
1455 testNodes(node1, node2, 'formals', node1.formals, node2.formals);
1456 }
1457
1458 @override
1459 bool visitVariableDefinitions(
1460 VariableDefinitions node1, VariableDefinitions node2) {
1461 return testNodes(
1462 node1, node2, 'metadata', node1.metadata, node2.metadata) &&
1463 testNodes(node1, node2, 'type', node1.type, node2.type) &&
1464 testNodes(
1465 node1, node2, 'modifiers', node1.modifiers, node2.modifiers) &&
1466 testNodes(
1467 node1, node2, 'definitions', node1.definitions, node2.definitions);
1468 }
1469
1470 @override
1471 bool visitWhile(While node1, While node2) {
1472 return testTokens(node1, node2, 'whileKeyword', node1.whileKeyword,
1473 node2.whileKeyword) &&
1474 testNodes(
1475 node1, node2, 'condition', node1.condition, node2.condition) &&
1476 testNodes(node1, node2, 'body', node1.body, node2.body);
1477 }
1478
1479 @override
1480 bool visitYield(Yield node1, Yield node2) {
1481 return testTokens(
1482 node1, node2, 'yieldToken', node1.yieldToken, node2.yieldToken) &&
1483 testTokens(
1484 node1, node2, 'starToken', node1.starToken, node2.starToken) &&
1485 testTokens(node1, node2, 'endToken', node1.endToken, node2.endToken) &&
1486 testNodes(
1487 node1, node2, 'expression', node1.expression, node2.expression);
1488 }
1489
1490 @override
1491 bool visitNode(Node node1, Node node2) {
1492 throw new UnsupportedError('Unexpected nodes: $node1 <> $node2');
1493 }
1494
1495 @override
1496 bool visitExpression(Expression node1, Expression node2) {
1497 throw new UnsupportedError('Unexpected nodes: $node1 <> $node2');
1498 }
1499
1500 @override
1501 bool visitStatement(Statement node1, Statement node2) {
1502 throw new UnsupportedError('Unexpected nodes: $node1 <> $node2');
1503 }
1504
1505 @override
1506 bool visitStringNode(StringNode node1, StringNode node2) {
1507 throw new UnsupportedError('Unexpected nodes: $node1 <> $node2');
1508 }
1509 }
OLDNEW
« no previous file with comments | « no previous file | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698