|  | // 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; | 
|  | } | 
|  | } | 
|  | } |