Chromium Code Reviews| OLD | NEW |
|---|---|
| 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 Loading... | |
| 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 Loading... | |
| 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 } | |
| OLD | NEW |