| // Copyright (c) 2017, the Dart project authors. Please see the AUTHORS file |
| // for details. All rights reserved. Use of this source code is governed by a |
| // BSD-style license that can be found in the LICENSE file. |
| |
| /// Equivalence test functions for data objects. |
| |
| library dart2js.equivalence.functions; |
| |
| import 'package:compiler/src/js/js_debug.dart' as js; |
| import 'package:js_ast/js_ast.dart' as js; |
| |
| bool areJsNodesEquivalent(js.Node node1, js.Node node2) { |
| return JsEquivalenceVisitor().testNodes(node1, node2); |
| } |
| |
| class JsEquivalenceVisitor extends js.EquivalenceVisitor { |
| final labelsMap = <String?, String?>{}; |
| |
| @override |
| bool failAt(js.Node? node1, js.Node? node2) { |
| print('Node mismatch:'); |
| print(' ${node1 != null ? js.nodeToString(node1) : '<null>'}'); |
| print(' ${node2 != null ? js.nodeToString(node2) : '<null>'}'); |
| return false; |
| } |
| |
| @override |
| bool testValues( |
| js.Node? node1, |
| Object? value1, |
| js.Node? node2, |
| Object? value2, |
| ) { |
| if (value1 != value2) { |
| print('Value mismatch:'); |
| print(' ${value1}'); |
| print(' ${value2}'); |
| print('at'); |
| print(' ${node1 != null ? js.nodeToString(node1) : '<null>'}'); |
| print(' ${node2 != null ? js.nodeToString(node2) : '<null>'}'); |
| return false; |
| } |
| return true; |
| } |
| |
| @override |
| bool testLabels( |
| js.Node node1, |
| String? label1, |
| js.Node node2, |
| String? label2, |
| ) { |
| if (label1 == null && label2 == null) return true; |
| if (labelsMap.containsKey(label1)) { |
| String? expectedValue = labelsMap[label1]; |
| if (expectedValue != label2) { |
| print('Value mismatch:'); |
| print(' ${label1}'); |
| print(' found ${label2}, expected ${expectedValue}'); |
| print('at'); |
| print(' ${js.nodeToString(node1)}'); |
| print(' ${js.nodeToString(node2)}'); |
| } |
| return expectedValue == label2; |
| } else { |
| labelsMap[label1] = label2; |
| return true; |
| } |
| } |
| } |