| Index: pkg/compiler/lib/src/serialization/equivalence.dart
|
| diff --git a/pkg/compiler/lib/src/serialization/equivalence.dart b/pkg/compiler/lib/src/serialization/equivalence.dart
|
| index 969ef408d23cdb4b69b78e87b8ad5416fe3866e7..be8ff7fc8a2fe65415fb46c95a77a21d03c157a6 100644
|
| --- a/pkg/compiler/lib/src/serialization/equivalence.dart
|
| +++ b/pkg/compiler/lib/src/serialization/equivalence.dart
|
| @@ -276,6 +276,13 @@ bool areNewStructuresEquivalent(NewStructure a, NewStructure b) {
|
| }
|
| }
|
|
|
| +/// Returns `true` if nodes [a] and [b] are equivalent.
|
| +bool areNodesEquivalent(Node node1, Node node2) {
|
| + if (identical(node1, node2)) return true;
|
| + if (node1 == null || node2 == null) return false;
|
| + return node1.accept1(const NodeEquivalenceVisitor(), node2);
|
| +}
|
| +
|
| /// Strategy for testing equivalence.
|
| ///
|
| /// Use this strategy to determine equivalence without failing on inequivalence.
|
| @@ -323,6 +330,11 @@ class TestStrategy {
|
| List<ConstantExpression> list1, List<ConstantExpression> list2) {
|
| return areConstantListsEquivalent(list1, list2);
|
| }
|
| +
|
| + bool testNodes(
|
| + Object object1, Object object2, String property, Node node1, Node node2) {
|
| + return areNodesEquivalent(node1, node2);
|
| + }
|
| }
|
|
|
| /// Visitor that checks for equivalence of [Element]s.
|
| @@ -765,15 +777,33 @@ bool testResolvedAstEquivalence(
|
| // Nothing more to check.
|
| return true;
|
| }
|
| - return strategy.testElements(resolvedAst1, resolvedAst2, 'element',
|
| + bool result = strategy.testElements(resolvedAst1, resolvedAst2, 'element',
|
| resolvedAst1.element, resolvedAst2.element) &&
|
| - new NodeEquivalenceVisitor(strategy).testNodes(resolvedAst1, resolvedAst2,
|
| - 'node', resolvedAst1.node, resolvedAst2.node) &&
|
| - new NodeEquivalenceVisitor(strategy).testNodes(resolvedAst1, resolvedAst2,
|
| - 'body', resolvedAst1.body, resolvedAst2.body) &&
|
| + strategy.testNodes(resolvedAst1, resolvedAst2, 'node', resolvedAst1.node,
|
| + resolvedAst2.node) &&
|
| + strategy.testNodes(resolvedAst1, resolvedAst2, 'body', resolvedAst1.body,
|
| + resolvedAst2.body) &&
|
| testTreeElementsEquivalence(resolvedAst1, resolvedAst2, strategy) &&
|
| strategy.test(resolvedAst1, resolvedAst2, 'sourceUri',
|
| resolvedAst1.sourceUri, resolvedAst2.sourceUri);
|
| + if (resolvedAst1.element is FunctionElement) {
|
| + FunctionElement element1 = resolvedAst1.element;
|
| + FunctionElement element2 = resolvedAst2.element;
|
| + for (int index = 0; index < element1.parameters.length; index++) {
|
| + var parameter1 = element1.parameters[index];
|
| + var parameter2 = element2.parameters[index];
|
| + result = result &&
|
| + strategy.testNodes(parameter1, parameter2, 'node',
|
| + parameter1.implementation.node, parameter2.implementation.node) &&
|
| + strategy.testNodes(
|
| + parameter1,
|
| + parameter2,
|
| + 'initializer',
|
| + parameter1.implementation.initializer,
|
| + parameter2.implementation.initializer);
|
| + }
|
| + }
|
| + return result;
|
| }
|
|
|
| /// Tests the equivalence of the data stored in the [TreeElements] of
|
|
|