| OLD | NEW |
| 1 // Copyright (c) 2017, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2017, 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 /// Equivalence test functions for data objects. | 5 /// Equivalence test functions for data objects. |
| 6 | 6 |
| 7 library dart2js.equivalence.functions; | 7 library dart2js.equivalence.functions; |
| 8 | 8 |
| 9 import 'package:expect/expect.dart'; | 9 import 'package:expect/expect.dart'; |
| 10 import 'package:compiler/src/common/resolution.dart'; | 10 import 'package:compiler/src/common/resolution.dart'; |
| 11 import 'package:compiler/src/common_elements.dart'; | 11 import 'package:compiler/src/common_elements.dart'; |
| 12 import 'package:compiler/src/compiler.dart'; | 12 import 'package:compiler/src/compiler.dart'; |
| 13 import 'package:compiler/src/elements/types.dart'; | 13 import 'package:compiler/src/elements/types.dart'; |
| 14 import 'package:compiler/src/elements/elements.dart'; | 14 import 'package:compiler/src/elements/elements.dart'; |
| 15 import 'package:compiler/src/elements/entities.dart'; | 15 import 'package:compiler/src/elements/entities.dart'; |
| 16 import 'package:compiler/src/enqueue.dart'; | 16 import 'package:compiler/src/enqueue.dart'; |
| 17 import 'package:compiler/src/js/js_debug.dart' as js; | 17 import 'package:compiler/src/js/js_debug.dart' as js; |
| 18 import 'package:compiler/src/js_backend/backend.dart'; | 18 import 'package:compiler/src/js_backend/backend.dart'; |
| 19 import 'package:compiler/src/js_backend/backend_usage.dart'; | 19 import 'package:compiler/src/js_backend/backend_usage.dart'; |
| 20 import 'package:compiler/src/js_backend/enqueuer.dart'; | 20 import 'package:compiler/src/js_backend/enqueuer.dart'; |
| 21 import 'package:compiler/src/js_backend/native_data.dart'; | 21 import 'package:compiler/src/js_backend/native_data.dart'; |
| 22 import 'package:compiler/src/js_backend/interceptor_data.dart'; | 22 import 'package:compiler/src/js_backend/interceptor_data.dart'; |
| 23 import 'package:compiler/src/js_emitter/code_emitter_task.dart'; | 23 import 'package:compiler/src/js_emitter/code_emitter_task.dart'; |
| 24 import 'package:compiler/src/js_emitter/model.dart'; | 24 import 'package:compiler/src/js_emitter/model.dart'; |
| 25 import 'package:compiler/src/serialization/equivalence.dart'; | 25 import 'package:compiler/src/serialization/equivalence.dart'; |
| 26 import 'package:compiler/src/universe/class_set.dart'; | 26 import 'package:compiler/src/universe/class_set.dart'; |
| 27 import 'package:compiler/src/universe/world_builder.dart'; | 27 import 'package:compiler/src/universe/world_builder.dart'; |
| 28 import 'package:compiler/src/util/util.dart'; | |
| 29 import 'package:compiler/src/world.dart'; | 28 import 'package:compiler/src/world.dart'; |
| 30 import 'package:js_ast/js_ast.dart' as js; | 29 import 'package:js_ast/js_ast.dart' as js; |
| 31 import 'check_helpers.dart'; | 30 import 'check_helpers.dart'; |
| 32 | 31 |
| 33 void checkClosedWorlds(ClosedWorld closedWorld1, ClosedWorld closedWorld2, | 32 void checkClosedWorlds(ClosedWorld closedWorld1, ClosedWorld closedWorld2, |
| 34 {TestStrategy strategy: const TestStrategy(), | 33 {TestStrategy strategy: const TestStrategy(), |
| 35 bool allowExtra: false, | 34 bool allowExtra: false, |
| 36 bool verbose: false, | 35 bool verbose: false, |
| 37 bool allowMissingClosureClasses: false}) { | 36 bool allowMissingClosureClasses: false}) { |
| 38 if (verbose) { | 37 if (verbose) { |
| (...skipping 831 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 870 {bool elementEquivalence(Entity a, Entity b): _areEntitiesEquivalent}) { | 869 {bool elementEquivalence(Entity a, Entity b): _areEntitiesEquivalent}) { |
| 871 checkMaps(backend1.generatedCode, backend2.generatedCode, 'generatedCode', | 870 checkMaps(backend1.generatedCode, backend2.generatedCode, 'generatedCode', |
| 872 elementEquivalence, areJsNodesEquivalent, | 871 elementEquivalence, areJsNodesEquivalent, |
| 873 valueToString: js.nodeToString); | 872 valueToString: js.nodeToString); |
| 874 } | 873 } |
| 875 | 874 |
| 876 bool areJsNodesEquivalent(js.Node node1, js.Node node2) { | 875 bool areJsNodesEquivalent(js.Node node1, js.Node node2) { |
| 877 return new JsEquivalenceVisitor().testNodes(node1, node2); | 876 return new JsEquivalenceVisitor().testNodes(node1, node2); |
| 878 } | 877 } |
| 879 | 878 |
| 880 class JsEquivalenceVisitor implements js.NodeVisitor<bool> { | 879 class JsEquivalenceVisitor implements js.NodeVisitor1<bool, js.Node> { |
| 881 Link<js.Node> stack1 = const Link<js.Node>(); | |
| 882 Link<js.Node> stack2 = const Link<js.Node>(); | |
| 883 Map<String, String> labelsMap = <String, String>{}; | 880 Map<String, String> labelsMap = <String, String>{}; |
| 884 | 881 |
| 885 void push(js.Node node1, js.Node node2) { | |
| 886 stack1 = stack1.prepend(node1); | |
| 887 stack2 = stack2.prepend(node2); | |
| 888 } | |
| 889 | |
| 890 js.Node peek() => stack2.head; | |
| 891 | |
| 892 void pop() { | |
| 893 stack1 = stack1.tail; | |
| 894 stack2 = stack2.tail; | |
| 895 } | |
| 896 | |
| 897 bool failAt(js.Node node1, js.Node node2) { | 882 bool failAt(js.Node node1, js.Node node2) { |
| 898 print('Node mismatch:'); | 883 print('Node mismatch:'); |
| 899 print(' ${js.nodeToString(node1)}'); | 884 print(' ${js.nodeToString(node1)}'); |
| 900 print(' ${js.nodeToString(node2)}'); | 885 print(' ${js.nodeToString(node2)}'); |
| 901 return false; | 886 return false; |
| 902 } | 887 } |
| 903 | 888 |
| 904 bool testValues(Object object1, Object object2) { | 889 bool testValues( |
| 890 js.Node node1, Object object1, js.Node node2, Object object2) { |
| 905 if (object1 != object2) { | 891 if (object1 != object2) { |
| 906 print('Value mismatch:'); | 892 print('Value mismatch:'); |
| 907 print(' ${object1}'); | 893 print(' ${object1}'); |
| 908 print(' ${object2}'); | 894 print(' ${object2}'); |
| 909 print('at'); | 895 print('at'); |
| 910 print(' ${js.nodeToString(stack1.head)}'); | 896 print(' ${js.nodeToString(node1)}'); |
| 911 print(' ${js.nodeToString(stack2.head)}'); | 897 print(' ${js.nodeToString(node2)}'); |
| 912 } | 898 } |
| 913 return object1 == object2; | 899 return object1 == object2; |
| 914 } | 900 } |
| 915 | 901 |
| 916 bool testLabels(String object1, String object2) { | 902 bool testLabels( |
| 903 js.Node node1, String object1, js.Node node2, String object2) { |
| 917 if (object1 == null && object2 == null) return true; | 904 if (object1 == null && object2 == null) return true; |
| 918 if (labelsMap.containsKey(object1)) { | 905 if (labelsMap.containsKey(object1)) { |
| 919 String expectedValue = labelsMap[object1]; | 906 String expectedValue = labelsMap[object1]; |
| 920 if (expectedValue != object2) { | 907 if (expectedValue != object2) { |
| 921 print('Value mismatch:'); | 908 print('Value mismatch:'); |
| 922 print(' ${object1}'); | 909 print(' ${object1}'); |
| 923 print(' found ${object2}, expected ${expectedValue}'); | 910 print(' found ${object2}, expected ${expectedValue}'); |
| 924 print('at'); | 911 print('at'); |
| 925 print(' ${js.nodeToString(stack1.head)}'); | 912 print(' ${js.nodeToString(node1)}'); |
| 926 print(' ${js.nodeToString(stack2.head)}'); | 913 print(' ${js.nodeToString(node2)}'); |
| 927 } | 914 } |
| 928 return expectedValue == object2; | 915 return expectedValue == object2; |
| 929 } else { | 916 } else { |
| 930 labelsMap[object1] = object2; | 917 labelsMap[object1] = object2; |
| 931 return true; | 918 return true; |
| 932 } | 919 } |
| 933 } | 920 } |
| 934 | 921 |
| 935 bool testNodes(js.Node node1, js.Node node2) { | 922 bool testNodes(js.Node node1, js.Node node2) { |
| 936 if (identical(node1, node2)) return true; | 923 if (identical(node1, node2)) return true; |
| 937 if (node1 == null || node2 == null) return failAt(node1, node2); | 924 if (node1 == null || node2 == null) return failAt(node1, node2); |
| 938 push(node1, node2); | 925 return node1.accept1(this, node2); |
| 939 bool result = node1.accept(this); | |
| 940 pop(); | |
| 941 return result; | |
| 942 } | 926 } |
| 943 | 927 |
| 944 bool testNodeLists(List<js.Node> list1, List<js.Node> list2) { | 928 bool testNodeLists(List<js.Node> list1, List<js.Node> list2) { |
| 945 int index = 0; | 929 int index = 0; |
| 946 while (index < list1.length && index < list2.length) { | 930 while (index < list1.length && index < list2.length) { |
| 947 if (!testNodes(list1[index], list2[index])) return false; | 931 if (!testNodes(list1[index], list2[index])) return false; |
| 948 index++; | 932 index++; |
| 949 } | 933 } |
| 950 if (index < list1.length) { | 934 if (index < list1.length) { |
| 951 return failAt(list1[index], null); | 935 return failAt(list1[index], null); |
| 952 } else if (index < list2.length) { | 936 } else if (index < list2.length) { |
| 953 return failAt(list2[index], null); | 937 return failAt(list2[index], null); |
| 954 } | 938 } |
| 955 return true; | 939 return true; |
| 956 } | 940 } |
| 957 | 941 |
| 958 @override | 942 @override |
| 959 bool visitProgram(js.Program node) { | 943 bool visitProgram(js.Program node, js.Node arg) { |
| 960 if (peek() is! js.Program) return failAt(node, peek()); | 944 if (arg is! js.Program) return failAt(node, arg); |
| 961 js.Program other = peek(); | 945 js.Program other = arg; |
| 962 return testNodeLists(node.body, other.body); | 946 return testNodeLists(node.body, other.body); |
| 963 } | 947 } |
| 964 | 948 |
| 965 @override | 949 @override |
| 966 bool visitInterpolatedDeclaration(js.InterpolatedDeclaration node) { | 950 bool visitInterpolatedDeclaration( |
| 967 if (peek() is! js.InterpolatedDeclaration) return failAt(node, peek()); | 951 js.InterpolatedDeclaration node, js.Node arg) { |
| 968 js.InterpolatedDeclaration other = peek(); | 952 if (arg is! js.InterpolatedDeclaration) return failAt(node, arg); |
| 969 return testValues(node.nameOrPosition, other.nameOrPosition); | 953 js.InterpolatedDeclaration other = arg; |
| 970 } | 954 return testValues(node, node.nameOrPosition, other, other.nameOrPosition); |
| 971 | 955 } |
| 972 @override | 956 |
| 973 bool visitInterpolatedStatement(js.InterpolatedStatement node) { | 957 @override |
| 974 if (peek() is! js.InterpolatedStatement) return failAt(node, peek()); | 958 bool visitInterpolatedStatement(js.InterpolatedStatement node, js.Node arg) { |
| 975 js.InterpolatedStatement other = peek(); | 959 if (arg is! js.InterpolatedStatement) return failAt(node, arg); |
| 976 return testValues(node.nameOrPosition, other.nameOrPosition); | 960 js.InterpolatedStatement other = arg; |
| 977 } | 961 return testValues(node, node.nameOrPosition, other, other.nameOrPosition); |
| 978 | 962 } |
| 979 @override | 963 |
| 980 bool visitInterpolatedSelector(js.InterpolatedSelector node) { | 964 @override |
| 981 if (peek() is! js.InterpolatedSelector) return failAt(node, peek()); | 965 bool visitInterpolatedSelector(js.InterpolatedSelector node, js.Node arg) { |
| 982 js.InterpolatedSelector other = peek(); | 966 if (arg is! js.InterpolatedSelector) return failAt(node, arg); |
| 983 return testValues(node.nameOrPosition, other.nameOrPosition); | 967 js.InterpolatedSelector other = arg; |
| 984 } | 968 return testValues(node, node.nameOrPosition, other, other.nameOrPosition); |
| 985 | 969 } |
| 986 @override | 970 |
| 987 bool visitInterpolatedParameter(js.InterpolatedParameter node) { | 971 @override |
| 988 if (peek() is! js.InterpolatedParameter) return failAt(node, peek()); | 972 bool visitInterpolatedParameter(js.InterpolatedParameter node, js.Node arg) { |
| 989 js.InterpolatedParameter other = peek(); | 973 if (arg is! js.InterpolatedParameter) return failAt(node, arg); |
| 990 return testValues(node.nameOrPosition, other.nameOrPosition); | 974 js.InterpolatedParameter other = arg; |
| 991 } | 975 return testValues(node, node.nameOrPosition, other, other.nameOrPosition); |
| 992 | 976 } |
| 993 @override | 977 |
| 994 bool visitInterpolatedLiteral(js.InterpolatedLiteral node) { | 978 @override |
| 995 if (peek() is! js.InterpolatedLiteral) return failAt(node, peek()); | 979 bool visitInterpolatedLiteral(js.InterpolatedLiteral node, js.Node arg) { |
| 996 js.InterpolatedLiteral other = peek(); | 980 if (arg is! js.InterpolatedLiteral) return failAt(node, arg); |
| 997 return testValues(node.nameOrPosition, other.nameOrPosition); | 981 js.InterpolatedLiteral other = arg; |
| 998 } | 982 return testValues(node, node.nameOrPosition, other, other.nameOrPosition); |
| 999 | 983 } |
| 1000 @override | 984 |
| 1001 bool visitInterpolatedExpression(js.InterpolatedExpression node) { | 985 @override |
| 1002 if (peek() is! js.InterpolatedExpression) return failAt(node, peek()); | 986 bool visitInterpolatedExpression( |
| 1003 js.InterpolatedExpression other = peek(); | 987 js.InterpolatedExpression node, js.Node arg) { |
| 1004 return testValues(node.nameOrPosition, other.nameOrPosition); | 988 if (arg is! js.InterpolatedExpression) return failAt(node, arg); |
| 1005 } | 989 js.InterpolatedExpression other = arg; |
| 1006 | 990 return testValues(node, node.nameOrPosition, other, other.nameOrPosition); |
| 1007 @override | 991 } |
| 1008 bool visitComment(js.Comment node) { | 992 |
| 1009 if (peek() is! js.Comment) return failAt(node, peek()); | 993 @override |
| 1010 js.Comment other = peek(); | 994 bool visitComment(js.Comment node, js.Node arg) { |
| 1011 return testValues(node.comment, other.comment); | 995 if (arg is! js.Comment) return failAt(node, arg); |
| 1012 } | 996 js.Comment other = arg; |
| 1013 | 997 return testValues(node, node.comment, other, other.comment); |
| 1014 @override | 998 } |
| 1015 bool visitAwait(js.Await node) { | 999 |
| 1016 if (peek() is! js.Await) return failAt(node, peek()); | 1000 @override |
| 1017 js.Await other = peek(); | 1001 bool visitAwait(js.Await node, js.Node arg) { |
| 1002 if (arg is! js.Await) return failAt(node, arg); |
| 1003 js.Await other = arg; |
| 1018 return testNodes(node.expression, other.expression); | 1004 return testNodes(node.expression, other.expression); |
| 1019 } | 1005 } |
| 1020 | 1006 |
| 1021 @override | 1007 @override |
| 1022 bool visitRegExpLiteral(js.RegExpLiteral node) { | 1008 bool visitRegExpLiteral(js.RegExpLiteral node, js.Node arg) { |
| 1023 if (peek() is! js.RegExpLiteral) return failAt(node, peek()); | 1009 if (arg is! js.RegExpLiteral) return failAt(node, arg); |
| 1024 js.RegExpLiteral other = peek(); | 1010 js.RegExpLiteral other = arg; |
| 1025 return testValues(node.pattern, other.pattern); | 1011 return testValues(node, node.pattern, other, other.pattern); |
| 1026 } | 1012 } |
| 1027 | 1013 |
| 1028 @override | 1014 @override |
| 1029 bool visitProperty(js.Property node) { | 1015 bool visitProperty(js.Property node, js.Node arg) { |
| 1030 if (peek() is! js.Property) return failAt(node, peek()); | 1016 if (arg is! js.Property) return failAt(node, arg); |
| 1031 js.Property other = peek(); | 1017 js.Property other = arg; |
| 1032 return testNodes(node.name, other.name) && | 1018 return testNodes(node.name, other.name) && |
| 1033 testNodes(node.value, other.value); | 1019 testNodes(node.value, other.value); |
| 1034 } | 1020 } |
| 1035 | 1021 |
| 1036 @override | 1022 @override |
| 1037 bool visitObjectInitializer(js.ObjectInitializer node) { | 1023 bool visitObjectInitializer(js.ObjectInitializer node, js.Node arg) { |
| 1038 if (peek() is! js.ObjectInitializer) return failAt(node, peek()); | 1024 if (arg is! js.ObjectInitializer) return failAt(node, arg); |
| 1039 js.ObjectInitializer other = peek(); | 1025 js.ObjectInitializer other = arg; |
| 1040 return testNodeLists(node.properties, other.properties); | 1026 return testNodeLists(node.properties, other.properties); |
| 1041 } | 1027 } |
| 1042 | 1028 |
| 1043 @override | 1029 @override |
| 1044 bool visitArrayHole(js.ArrayHole node) { | 1030 bool visitArrayHole(js.ArrayHole node, js.Node arg) { |
| 1045 if (peek() is! js.ArrayHole) return failAt(node, peek()); | 1031 if (arg is! js.ArrayHole) return failAt(node, arg); |
| 1046 return true; | 1032 return true; |
| 1047 } | 1033 } |
| 1048 | 1034 |
| 1049 @override | 1035 @override |
| 1050 bool visitArrayInitializer(js.ArrayInitializer node) { | 1036 bool visitArrayInitializer(js.ArrayInitializer node, js.Node arg) { |
| 1051 if (peek() is! js.ArrayInitializer) return failAt(node, peek()); | 1037 if (arg is! js.ArrayInitializer) return failAt(node, arg); |
| 1052 js.ArrayInitializer other = peek(); | 1038 js.ArrayInitializer other = arg; |
| 1053 return testNodeLists(node.elements, other.elements); | 1039 return testNodeLists(node.elements, other.elements); |
| 1054 } | 1040 } |
| 1055 | 1041 |
| 1056 @override | 1042 @override |
| 1057 bool visitName(js.Name node) { | 1043 bool visitName(js.Name node, js.Node arg) { |
| 1058 if (peek() is! js.Name) return failAt(node, peek()); | 1044 if (arg is! js.Name) return failAt(node, arg); |
| 1059 js.Name other = peek(); | 1045 js.Name other = arg; |
| 1060 return testValues(node.key, other.key); | 1046 return testValues(node, node.key, other, other.key); |
| 1061 } | 1047 } |
| 1062 | 1048 |
| 1063 @override | 1049 @override |
| 1064 bool visitStringConcatenation(js.StringConcatenation node) { | 1050 bool visitStringConcatenation(js.StringConcatenation node, js.Node arg) { |
| 1065 if (peek() is! js.StringConcatenation) return failAt(node, peek()); | 1051 if (arg is! js.StringConcatenation) return failAt(node, arg); |
| 1066 js.StringConcatenation other = peek(); | 1052 js.StringConcatenation other = arg; |
| 1067 return testNodeLists(node.parts, other.parts); | 1053 return testNodeLists(node.parts, other.parts); |
| 1068 } | 1054 } |
| 1069 | 1055 |
| 1070 @override | 1056 @override |
| 1071 bool visitLiteralNull(js.LiteralNull node) { | 1057 bool visitLiteralNull(js.LiteralNull node, js.Node arg) { |
| 1072 if (peek() is! js.LiteralNull) return failAt(node, peek()); | 1058 if (arg is! js.LiteralNull) return failAt(node, arg); |
| 1073 return true; | 1059 return true; |
| 1074 } | 1060 } |
| 1075 | 1061 |
| 1076 @override | 1062 @override |
| 1077 bool visitLiteralNumber(js.LiteralNumber node) { | 1063 bool visitLiteralNumber(js.LiteralNumber node, js.Node arg) { |
| 1078 if (peek() is! js.LiteralNumber) return failAt(node, peek()); | 1064 if (arg is! js.LiteralNumber) return failAt(node, arg); |
| 1079 js.LiteralNumber other = peek(); | 1065 js.LiteralNumber other = arg; |
| 1080 return testValues(node.value, other.value); | 1066 return testValues(node, node.value, other, other.value); |
| 1081 } | 1067 } |
| 1082 | 1068 |
| 1083 @override | 1069 @override |
| 1084 bool visitLiteralString(js.LiteralString node) { | 1070 bool visitLiteralString(js.LiteralString node, js.Node arg) { |
| 1085 if (peek() is! js.LiteralString) return failAt(node, peek()); | 1071 if (arg is! js.LiteralString) return failAt(node, arg); |
| 1086 js.LiteralString other = peek(); | 1072 js.LiteralString other = arg; |
| 1087 return testValues(node.value, other.value); | 1073 return testValues(node, node.value, other, other.value); |
| 1088 } | 1074 } |
| 1089 | 1075 |
| 1090 @override | 1076 @override |
| 1091 bool visitLiteralBool(js.LiteralBool node) { | 1077 bool visitLiteralBool(js.LiteralBool node, js.Node arg) { |
| 1092 if (peek() is! js.LiteralBool) return failAt(node, peek()); | 1078 if (arg is! js.LiteralBool) return failAt(node, arg); |
| 1093 js.LiteralBool other = peek(); | 1079 js.LiteralBool other = arg; |
| 1094 return testValues(node.value, other.value); | 1080 return testValues(node, node.value, other, other.value); |
| 1095 } | 1081 } |
| 1096 | 1082 |
| 1097 @override | 1083 @override |
| 1098 bool visitDeferredString(js.DeferredString node) { | 1084 bool visitDeferredString(js.DeferredString node, js.Node arg) { |
| 1099 if (peek() is! js.DeferredString) return failAt(node, peek()); | 1085 if (arg is! js.DeferredString) return failAt(node, arg); |
| 1100 js.DeferredString other = peek(); | 1086 js.DeferredString other = arg; |
| 1101 return testValues(node.value, other.value); | 1087 return testValues(node, node.value, other, other.value); |
| 1102 } | 1088 } |
| 1103 | 1089 |
| 1104 @override | 1090 @override |
| 1105 bool visitDeferredNumber(js.DeferredNumber node) { | 1091 bool visitDeferredNumber(js.DeferredNumber node, js.Node arg) { |
| 1106 if (peek() is! js.DeferredNumber) return failAt(node, peek()); | 1092 if (arg is! js.DeferredNumber) return failAt(node, arg); |
| 1107 js.DeferredNumber other = peek(); | 1093 js.DeferredNumber other = arg; |
| 1108 return testValues(node.value, other.value); | 1094 return testValues(node, node.value, other, other.value); |
| 1109 } | 1095 } |
| 1110 | 1096 |
| 1111 @override | 1097 @override |
| 1112 bool visitDeferredExpression(js.DeferredExpression node) { | 1098 bool visitDeferredExpression(js.DeferredExpression node, js.Node arg) { |
| 1113 if (peek() is! js.DeferredExpression) return failAt(node, peek()); | 1099 if (arg is! js.DeferredExpression) return failAt(node, arg); |
| 1114 js.DeferredExpression other = peek(); | 1100 js.DeferredExpression other = arg; |
| 1115 return testNodes(node.value, other.value); | 1101 return testNodes(node.value, other.value); |
| 1116 } | 1102 } |
| 1117 | 1103 |
| 1118 @override | 1104 @override |
| 1119 bool visitFun(js.Fun node) { | 1105 bool visitFun(js.Fun node, js.Node arg) { |
| 1120 if (peek() is! js.Fun) return failAt(node, peek()); | 1106 if (arg is! js.Fun) return failAt(node, arg); |
| 1121 js.Fun other = peek(); | 1107 js.Fun other = arg; |
| 1122 return testNodeLists(node.params, other.params) && | 1108 return testNodeLists(node.params, other.params) && |
| 1123 testNodes(node.body, other.body) && | 1109 testNodes(node.body, other.body) && |
| 1124 testValues(node.asyncModifier, other.asyncModifier); | 1110 testValues(node, node.asyncModifier, other, other.asyncModifier); |
| 1125 } | 1111 } |
| 1126 | 1112 |
| 1127 @override | 1113 @override |
| 1128 bool visitNamedFunction(js.NamedFunction node) { | 1114 bool visitNamedFunction(js.NamedFunction node, js.Node arg) { |
| 1129 if (peek() is! js.NamedFunction) return failAt(node, peek()); | 1115 if (arg is! js.NamedFunction) return failAt(node, arg); |
| 1130 js.NamedFunction other = peek(); | 1116 js.NamedFunction other = arg; |
| 1131 return testNodes(node.name, other.name) && | 1117 return testNodes(node.name, other.name) && |
| 1132 testNodes(node.function, other.function); | 1118 testNodes(node.function, other.function); |
| 1133 } | 1119 } |
| 1134 | 1120 |
| 1135 @override | 1121 @override |
| 1136 bool visitAccess(js.PropertyAccess node) { | 1122 bool visitAccess(js.PropertyAccess node, js.Node arg) { |
| 1137 if (peek() is! js.PropertyAccess) return failAt(node, peek()); | 1123 if (arg is! js.PropertyAccess) return failAt(node, arg); |
| 1138 js.PropertyAccess other = peek(); | 1124 js.PropertyAccess other = arg; |
| 1139 return testNodes(node.receiver, other.receiver) && | 1125 return testNodes(node.receiver, other.receiver) && |
| 1140 testNodes(node.selector, other.selector); | 1126 testNodes(node.selector, other.selector); |
| 1141 } | 1127 } |
| 1142 | 1128 |
| 1143 @override | 1129 @override |
| 1144 bool visitParameter(js.Parameter node) { | 1130 bool visitParameter(js.Parameter node, js.Node arg) { |
| 1145 if (peek() is! js.Parameter) return failAt(node, peek()); | 1131 if (arg is! js.Parameter) return failAt(node, arg); |
| 1146 js.Parameter other = peek(); | 1132 js.Parameter other = arg; |
| 1147 return testValues(node.name, other.name); | 1133 return testValues(node, node.name, other, other.name); |
| 1148 } | 1134 } |
| 1149 | 1135 |
| 1150 @override | 1136 @override |
| 1151 bool visitVariableDeclaration(js.VariableDeclaration node) { | 1137 bool visitVariableDeclaration(js.VariableDeclaration node, js.Node arg) { |
| 1152 if (peek() is! js.VariableDeclaration) return failAt(node, peek()); | 1138 if (arg is! js.VariableDeclaration) return failAt(node, arg); |
| 1153 js.VariableDeclaration other = peek(); | 1139 js.VariableDeclaration other = arg; |
| 1154 return testValues(node.name, other.name) && | 1140 return testValues(node, node.name, other, other.name) && |
| 1155 testValues(node.allowRename, other.allowRename); | 1141 testValues(node, node.allowRename, other, other.allowRename); |
| 1156 } | 1142 } |
| 1157 | 1143 |
| 1158 @override | 1144 @override |
| 1159 bool visitThis(js.This node) { | 1145 bool visitThis(js.This node, js.Node arg) { |
| 1160 if (peek() is! js.This) return failAt(node, peek()); | 1146 if (arg is! js.This) return failAt(node, arg); |
| 1161 return true; | 1147 return true; |
| 1162 } | 1148 } |
| 1163 | 1149 |
| 1164 @override | 1150 @override |
| 1165 bool visitVariableUse(js.VariableUse node) { | 1151 bool visitVariableUse(js.VariableUse node, js.Node arg) { |
| 1166 if (peek() is! js.VariableUse) return failAt(node, peek()); | 1152 if (arg is! js.VariableUse) return failAt(node, arg); |
| 1167 js.VariableUse other = peek(); | 1153 js.VariableUse other = arg; |
| 1168 return testValues(node.name, other.name); | 1154 return testValues(node, node.name, other, other.name); |
| 1169 } | 1155 } |
| 1170 | 1156 |
| 1171 @override | 1157 @override |
| 1172 bool visitPostfix(js.Postfix node) { | 1158 bool visitPostfix(js.Postfix node, js.Node arg) { |
| 1173 if (peek() is! js.Postfix) return failAt(node, peek()); | 1159 if (arg is! js.Postfix) return failAt(node, arg); |
| 1174 js.Postfix other = peek(); | 1160 js.Postfix other = arg; |
| 1175 return testValues(node.op, other.op) && | 1161 return testValues(node, node.op, other, other.op) && |
| 1176 testNodes(node.argument, other.argument); | 1162 testNodes(node.argument, other.argument); |
| 1177 } | 1163 } |
| 1178 | 1164 |
| 1179 @override | 1165 @override |
| 1180 bool visitPrefix(js.Prefix node) { | 1166 bool visitPrefix(js.Prefix node, js.Node arg) { |
| 1181 if (peek() is! js.Prefix) return failAt(node, peek()); | 1167 if (arg is! js.Prefix) return failAt(node, arg); |
| 1182 js.Prefix other = peek(); | 1168 js.Prefix other = arg; |
| 1183 return testValues(node.op, other.op) && | 1169 return testValues(node, node.op, other, other.op) && |
| 1184 testNodes(node.argument, other.argument); | 1170 testNodes(node.argument, other.argument); |
| 1185 } | 1171 } |
| 1186 | 1172 |
| 1187 @override | 1173 @override |
| 1188 bool visitBinary(js.Binary node) { | 1174 bool visitBinary(js.Binary node, js.Node arg) { |
| 1189 if (peek() is! js.Binary) return failAt(node, peek()); | 1175 if (arg is! js.Binary) return failAt(node, arg); |
| 1190 js.Binary other = peek(); | 1176 js.Binary other = arg; |
| 1191 return testNodes(node.left, other.left) && | 1177 return testNodes(node.left, other.left) && |
| 1192 testValues(node.op, other.op) && | 1178 testValues(node, node.op, other, other.op) && |
| 1193 testNodes(node.right, other.right); | 1179 testNodes(node.right, other.right); |
| 1194 } | 1180 } |
| 1195 | 1181 |
| 1196 @override | 1182 @override |
| 1197 bool visitCall(js.Call node) { | 1183 bool visitCall(js.Call node, js.Node arg) { |
| 1198 if (peek() is! js.Call) return failAt(node, peek()); | 1184 if (arg is! js.Call) return failAt(node, arg); |
| 1199 js.Call other = peek(); | 1185 js.Call other = arg; |
| 1200 return testNodes(node.target, other.target) && | 1186 return testNodes(node.target, other.target) && |
| 1201 testNodeLists(node.arguments, other.arguments); | 1187 testNodeLists(node.arguments, other.arguments); |
| 1202 } | 1188 } |
| 1203 | 1189 |
| 1204 @override | 1190 @override |
| 1205 bool visitNew(js.New node) { | 1191 bool visitNew(js.New node, js.Node arg) { |
| 1206 if (peek() is! js.New) return failAt(node, peek()); | 1192 if (arg is! js.New) return failAt(node, arg); |
| 1207 js.New other = peek(); | 1193 js.New other = arg; |
| 1208 return testNodes(node.target, other.target) && | 1194 return testNodes(node.target, other.target) && |
| 1209 testNodeLists(node.arguments, other.arguments); | 1195 testNodeLists(node.arguments, other.arguments); |
| 1210 } | 1196 } |
| 1211 | 1197 |
| 1212 @override | 1198 @override |
| 1213 bool visitConditional(js.Conditional node) { | 1199 bool visitConditional(js.Conditional node, js.Node arg) { |
| 1214 if (peek() is! js.Conditional) return failAt(node, peek()); | 1200 if (arg is! js.Conditional) return failAt(node, arg); |
| 1215 js.Conditional other = peek(); | 1201 js.Conditional other = arg; |
| 1216 return testNodes(node.condition, other.condition) && | 1202 return testNodes(node.condition, other.condition) && |
| 1217 testNodes(node.then, other.then) && | 1203 testNodes(node.then, other.then) && |
| 1218 testNodes(node.otherwise, other.otherwise); | 1204 testNodes(node.otherwise, other.otherwise); |
| 1219 } | 1205 } |
| 1220 | 1206 |
| 1221 @override | 1207 @override |
| 1222 bool visitVariableInitialization(js.VariableInitialization node) { | 1208 bool visitVariableInitialization( |
| 1223 if (peek() is! js.VariableInitialization) return failAt(node, peek()); | 1209 js.VariableInitialization node, js.Node arg) { |
| 1224 js.VariableInitialization other = peek(); | 1210 if (arg is! js.VariableInitialization) return failAt(node, arg); |
| 1211 js.VariableInitialization other = arg; |
| 1225 return testNodes(node.declaration, other.declaration) && | 1212 return testNodes(node.declaration, other.declaration) && |
| 1226 testNodes(node.leftHandSide, other.leftHandSide) && | 1213 testNodes(node.leftHandSide, other.leftHandSide) && |
| 1227 testValues(node.op, other.op) && | 1214 testValues(node, node.op, other, other.op) && |
| 1228 testNodes(node.value, other.value); | 1215 testNodes(node.value, other.value); |
| 1229 } | 1216 } |
| 1230 | 1217 |
| 1231 @override | 1218 @override |
| 1232 bool visitAssignment(js.Assignment node) { | 1219 bool visitAssignment(js.Assignment node, js.Node arg) { |
| 1233 if (peek() is! js.Assignment) return failAt(node, peek()); | 1220 if (arg is! js.Assignment) return failAt(node, arg); |
| 1234 js.Assignment other = peek(); | 1221 js.Assignment other = arg; |
| 1235 return testNodes(node.leftHandSide, other.leftHandSide) && | 1222 return testNodes(node.leftHandSide, other.leftHandSide) && |
| 1236 testValues(node.op, other.op) && | 1223 testValues(node, node.op, other, other.op) && |
| 1237 testNodes(node.value, other.value); | 1224 testNodes(node.value, other.value); |
| 1238 } | 1225 } |
| 1239 | 1226 |
| 1240 @override | 1227 @override |
| 1241 bool visitVariableDeclarationList(js.VariableDeclarationList node) { | 1228 bool visitVariableDeclarationList( |
| 1242 if (peek() is! js.VariableDeclarationList) return failAt(node, peek()); | 1229 js.VariableDeclarationList node, js.Node arg) { |
| 1243 js.VariableDeclarationList other = peek(); | 1230 if (arg is! js.VariableDeclarationList) return failAt(node, arg); |
| 1231 js.VariableDeclarationList other = arg; |
| 1244 return testNodeLists(node.declarations, other.declarations); | 1232 return testNodeLists(node.declarations, other.declarations); |
| 1245 } | 1233 } |
| 1246 | 1234 |
| 1247 @override | 1235 @override |
| 1248 bool visitLiteralExpression(js.LiteralExpression node) { | 1236 bool visitLiteralExpression(js.LiteralExpression node, js.Node arg) { |
| 1249 if (peek() is! js.LiteralExpression) return failAt(node, peek()); | 1237 if (arg is! js.LiteralExpression) return failAt(node, arg); |
| 1250 js.LiteralExpression other = peek(); | 1238 js.LiteralExpression other = arg; |
| 1251 return testValues(node.template, other.template) && | 1239 return testValues(node, node.template, other, other.template) && |
| 1252 testNodeLists(node.inputs, other.inputs); | 1240 testNodeLists(node.inputs, other.inputs); |
| 1253 } | 1241 } |
| 1254 | 1242 |
| 1255 @override | 1243 @override |
| 1256 bool visitDartYield(js.DartYield node) { | 1244 bool visitDartYield(js.DartYield node, js.Node arg) { |
| 1257 if (peek() is! js.DartYield) return failAt(node, peek()); | 1245 if (arg is! js.DartYield) return failAt(node, arg); |
| 1258 js.DartYield other = peek(); | 1246 js.DartYield other = arg; |
| 1259 return testNodes(node.expression, other.expression) && | 1247 return testNodes(node.expression, other.expression) && |
| 1260 testValues(node.hasStar, other.hasStar); | 1248 testValues(node, node.hasStar, other, other.hasStar); |
| 1261 } | 1249 } |
| 1262 | 1250 |
| 1263 @override | 1251 @override |
| 1264 bool visitLiteralStatement(js.LiteralStatement node) { | 1252 bool visitLiteralStatement(js.LiteralStatement node, js.Node arg) { |
| 1265 if (peek() is! js.LiteralStatement) return failAt(node, peek()); | 1253 if (arg is! js.LiteralStatement) return failAt(node, arg); |
| 1266 js.LiteralStatement other = peek(); | 1254 js.LiteralStatement other = arg; |
| 1267 return testValues(node.code, other.code); | 1255 return testValues(node, node.code, other, other.code); |
| 1268 } | 1256 } |
| 1269 | 1257 |
| 1270 @override | 1258 @override |
| 1271 bool visitLabeledStatement(js.LabeledStatement node) { | 1259 bool visitLabeledStatement(js.LabeledStatement node, js.Node arg) { |
| 1272 if (peek() is! js.LabeledStatement) return failAt(node, peek()); | 1260 if (arg is! js.LabeledStatement) return failAt(node, arg); |
| 1273 js.LabeledStatement other = peek(); | 1261 js.LabeledStatement other = arg; |
| 1274 return testLabels(node.label, other.label) && | 1262 return testLabels(node, node.label, other, other.label) && |
| 1275 testNodes(node.body, other.body); | 1263 testNodes(node.body, other.body); |
| 1276 } | 1264 } |
| 1277 | 1265 |
| 1278 @override | 1266 @override |
| 1279 bool visitFunctionDeclaration(js.FunctionDeclaration node) { | 1267 bool visitFunctionDeclaration(js.FunctionDeclaration node, js.Node arg) { |
| 1280 if (peek() is! js.FunctionDeclaration) return failAt(node, peek()); | 1268 if (arg is! js.FunctionDeclaration) return failAt(node, arg); |
| 1281 js.FunctionDeclaration other = peek(); | 1269 js.FunctionDeclaration other = arg; |
| 1282 return testNodes(node.name, other.name) && | 1270 return testNodes(node.name, other.name) && |
| 1283 testNodes(node.function, other.function); | 1271 testNodes(node.function, other.function); |
| 1284 } | 1272 } |
| 1285 | 1273 |
| 1286 @override | 1274 @override |
| 1287 bool visitDefault(js.Default node) { | 1275 bool visitDefault(js.Default node, js.Node arg) { |
| 1288 if (peek() is! js.Default) return failAt(node, peek()); | 1276 if (arg is! js.Default) return failAt(node, arg); |
| 1289 js.Default other = peek(); | 1277 js.Default other = arg; |
| 1290 return testNodes(node.body, other.body); | 1278 return testNodes(node.body, other.body); |
| 1291 } | 1279 } |
| 1292 | 1280 |
| 1293 @override | 1281 @override |
| 1294 bool visitCase(js.Case node) { | 1282 bool visitCase(js.Case node, js.Node arg) { |
| 1295 if (peek() is! js.Case) return failAt(node, peek()); | 1283 if (arg is! js.Case) return failAt(node, arg); |
| 1296 js.Case other = peek(); | 1284 js.Case other = arg; |
| 1297 return testNodes(node.expression, other.expression) && | 1285 return testNodes(node.expression, other.expression) && |
| 1298 testNodes(node.body, other.body); | 1286 testNodes(node.body, other.body); |
| 1299 } | 1287 } |
| 1300 | 1288 |
| 1301 @override | 1289 @override |
| 1302 bool visitSwitch(js.Switch node) { | 1290 bool visitSwitch(js.Switch node, js.Node arg) { |
| 1303 if (peek() is! js.Switch) return failAt(node, peek()); | 1291 if (arg is! js.Switch) return failAt(node, arg); |
| 1304 js.Switch other = peek(); | 1292 js.Switch other = arg; |
| 1305 return testNodes(node.key, other.key) && | 1293 return testNodes(node.key, other.key) && |
| 1306 testNodeLists(node.cases, other.cases); | 1294 testNodeLists(node.cases, other.cases); |
| 1307 } | 1295 } |
| 1308 | 1296 |
| 1309 @override | 1297 @override |
| 1310 bool visitCatch(js.Catch node) { | 1298 bool visitCatch(js.Catch node, js.Node arg) { |
| 1311 if (peek() is! js.Catch) return failAt(node, peek()); | 1299 if (arg is! js.Catch) return failAt(node, arg); |
| 1312 js.Catch other = peek(); | 1300 js.Catch other = arg; |
| 1313 return testNodes(node.declaration, other.declaration) && | 1301 return testNodes(node.declaration, other.declaration) && |
| 1314 testNodes(node.body, other.body); | 1302 testNodes(node.body, other.body); |
| 1315 } | 1303 } |
| 1316 | 1304 |
| 1317 @override | 1305 @override |
| 1318 bool visitTry(js.Try node) { | 1306 bool visitTry(js.Try node, js.Node arg) { |
| 1319 if (peek() is! js.Try) return failAt(node, peek()); | 1307 if (arg is! js.Try) return failAt(node, arg); |
| 1320 js.Try other = peek(); | 1308 js.Try other = arg; |
| 1321 return testNodes(node.body, other.body) && | 1309 return testNodes(node.body, other.body) && |
| 1322 testNodes(node.catchPart, other.catchPart) && | 1310 testNodes(node.catchPart, other.catchPart) && |
| 1323 testNodes(node.finallyPart, other.finallyPart); | 1311 testNodes(node.finallyPart, other.finallyPart); |
| 1324 } | 1312 } |
| 1325 | 1313 |
| 1326 @override | 1314 @override |
| 1327 bool visitThrow(js.Throw node) { | 1315 bool visitThrow(js.Throw node, js.Node arg) { |
| 1328 if (peek() is! js.Throw) return failAt(node, peek()); | 1316 if (arg is! js.Throw) return failAt(node, arg); |
| 1329 js.Throw other = peek(); | 1317 js.Throw other = arg; |
| 1330 return testNodes(node.expression, other.expression); | 1318 return testNodes(node.expression, other.expression); |
| 1331 } | 1319 } |
| 1332 | 1320 |
| 1333 @override | 1321 @override |
| 1334 bool visitReturn(js.Return node) { | 1322 bool visitReturn(js.Return node, js.Node arg) { |
| 1335 if (peek() is! js.Return) return failAt(node, peek()); | 1323 if (arg is! js.Return) return failAt(node, arg); |
| 1336 js.Return other = peek(); | 1324 js.Return other = arg; |
| 1337 return testNodes(node.value, other.value); | 1325 return testNodes(node.value, other.value); |
| 1338 } | 1326 } |
| 1339 | 1327 |
| 1340 @override | 1328 @override |
| 1341 bool visitBreak(js.Break node) { | 1329 bool visitBreak(js.Break node, js.Node arg) { |
| 1342 if (peek() is! js.Break) return failAt(node, peek()); | 1330 if (arg is! js.Break) return failAt(node, arg); |
| 1343 js.Break other = peek(); | 1331 js.Break other = arg; |
| 1344 return testLabels(node.targetLabel, other.targetLabel); | 1332 return testLabels(node, node.targetLabel, other, other.targetLabel); |
| 1345 } | 1333 } |
| 1346 | 1334 |
| 1347 @override | 1335 @override |
| 1348 bool visitContinue(js.Continue node) { | 1336 bool visitContinue(js.Continue node, js.Node arg) { |
| 1349 if (peek() is! js.Continue) return failAt(node, peek()); | 1337 if (arg is! js.Continue) return failAt(node, arg); |
| 1350 js.Continue other = peek(); | 1338 js.Continue other = arg; |
| 1351 return testLabels(node.targetLabel, other.targetLabel); | 1339 return testLabels(node, node.targetLabel, other, other.targetLabel); |
| 1352 } | 1340 } |
| 1353 | 1341 |
| 1354 @override | 1342 @override |
| 1355 bool visitDo(js.Do node) { | 1343 bool visitDo(js.Do node, js.Node arg) { |
| 1356 if (peek() is! js.Do) return failAt(node, peek()); | 1344 if (arg is! js.Do) return failAt(node, arg); |
| 1357 js.Do other = peek(); | 1345 js.Do other = arg; |
| 1358 return testNodes(node.condition, other.condition) && | 1346 return testNodes(node.condition, other.condition) && |
| 1359 testNodes(node.body, other.body); | 1347 testNodes(node.body, other.body); |
| 1360 } | 1348 } |
| 1361 | 1349 |
| 1362 @override | 1350 @override |
| 1363 bool visitWhile(js.While node) { | 1351 bool visitWhile(js.While node, js.Node arg) { |
| 1364 if (peek() is! js.While) return failAt(node, peek()); | 1352 if (arg is! js.While) return failAt(node, arg); |
| 1365 js.While other = peek(); | 1353 js.While other = arg; |
| 1366 return testNodes(node.condition, other.condition) && | 1354 return testNodes(node.condition, other.condition) && |
| 1367 testNodes(node.body, other.body); | 1355 testNodes(node.body, other.body); |
| 1368 } | 1356 } |
| 1369 | 1357 |
| 1370 @override | 1358 @override |
| 1371 bool visitForIn(js.ForIn node) { | 1359 bool visitForIn(js.ForIn node, js.Node arg) { |
| 1372 if (peek() is! js.ForIn) return failAt(node, peek()); | 1360 if (arg is! js.ForIn) return failAt(node, arg); |
| 1373 js.ForIn other = peek(); | 1361 js.ForIn other = arg; |
| 1374 return testNodes(node.leftHandSide, other.leftHandSide) && | 1362 return testNodes(node.leftHandSide, other.leftHandSide) && |
| 1375 testNodes(node.object, other.object) && | 1363 testNodes(node.object, other.object) && |
| 1376 testNodes(node.body, other.body); | 1364 testNodes(node.body, other.body); |
| 1377 } | 1365 } |
| 1378 | 1366 |
| 1379 @override | 1367 @override |
| 1380 bool visitFor(js.For node) { | 1368 bool visitFor(js.For node, js.Node arg) { |
| 1381 if (peek() is! js.For) return failAt(node, peek()); | 1369 if (arg is! js.For) return failAt(node, arg); |
| 1382 js.For other = peek(); | 1370 js.For other = arg; |
| 1383 return testNodes(node.init, other.init) && | 1371 return testNodes(node.init, other.init) && |
| 1384 testNodes(node.condition, other.condition) && | 1372 testNodes(node.condition, other.condition) && |
| 1385 testNodes(node.update, other.update) && | 1373 testNodes(node.update, other.update) && |
| 1386 testNodes(node.body, other.body); | 1374 testNodes(node.body, other.body); |
| 1387 } | 1375 } |
| 1388 | 1376 |
| 1389 @override | 1377 @override |
| 1390 bool visitIf(js.If node) { | 1378 bool visitIf(js.If node, js.Node arg) { |
| 1391 if (peek() is! js.If) return failAt(node, peek()); | 1379 if (arg is! js.If) return failAt(node, arg); |
| 1392 js.If other = peek(); | 1380 js.If other = arg; |
| 1393 return testNodes(node.condition, other.condition) && | 1381 return testNodes(node.condition, other.condition) && |
| 1394 testNodes(node.then, other.then) && | 1382 testNodes(node.then, other.then) && |
| 1395 testNodes(node.otherwise, other.otherwise); | 1383 testNodes(node.otherwise, other.otherwise); |
| 1396 } | 1384 } |
| 1397 | 1385 |
| 1398 @override | 1386 @override |
| 1399 bool visitEmptyStatement(js.EmptyStatement node) { | 1387 bool visitEmptyStatement(js.EmptyStatement node, js.Node arg) { |
| 1400 if (peek() is! js.EmptyStatement) return failAt(node, peek()); | 1388 if (arg is! js.EmptyStatement) return failAt(node, arg); |
| 1401 return true; | 1389 return true; |
| 1402 } | 1390 } |
| 1403 | 1391 |
| 1404 @override | 1392 @override |
| 1405 bool visitExpressionStatement(js.ExpressionStatement node) { | 1393 bool visitExpressionStatement(js.ExpressionStatement node, js.Node arg) { |
| 1406 if (peek() is! js.ExpressionStatement) return failAt(node, peek()); | 1394 if (arg is! js.ExpressionStatement) return failAt(node, arg); |
| 1407 js.ExpressionStatement other = peek(); | 1395 js.ExpressionStatement other = arg; |
| 1408 return testNodes(node.expression, other.expression); | 1396 return testNodes(node.expression, other.expression); |
| 1409 } | 1397 } |
| 1410 | 1398 |
| 1411 @override | 1399 @override |
| 1412 bool visitBlock(js.Block node) { | 1400 bool visitBlock(js.Block node, js.Node arg) { |
| 1413 if (peek() is! js.Block) return failAt(node, peek()); | 1401 if (arg is! js.Block) return failAt(node, arg); |
| 1414 js.Block other = peek(); | 1402 js.Block other = arg; |
| 1415 return testNodeLists(node.statements, other.statements); | 1403 return testNodeLists(node.statements, other.statements); |
| 1416 } | 1404 } |
| 1417 } | 1405 } |
| OLD | NEW |