Index: tests/compiler/dart2js/equivalence/id_equivalence_test.dart |
diff --git a/tests/compiler/dart2js/equivalence/id_equivalence_test.dart b/tests/compiler/dart2js/equivalence/id_equivalence_test.dart |
index e7230e9c8acf06135d27e0a5a97fd7b7dc40fb62..8a9e3bf41e7a231906f1fb9f3a27d742a1931d3e 100644 |
--- a/tests/compiler/dart2js/equivalence/id_equivalence_test.dart |
+++ b/tests/compiler/dart2js/equivalence/id_equivalence_test.dart |
@@ -22,6 +22,7 @@ import '../equivalence/id_equivalence_helper.dart'; |
const List<String> dataDirectories = const <String>[ |
'../closure/data', |
'../inference/data', |
+ '../jumps/data', |
]; |
main() { |
@@ -42,6 +43,9 @@ main() { |
if (value1 != value2) { |
reportHere(data1.compiler.reporter, actualData1.sourceSpan, |
'$id: from source:${value1},from dill:${value2}'); |
+ print('--annotations diff----------------------------------------'); |
+ print(data1.computeDiffCodeFor(data2)); |
+ print('----------------------------------------------------------'); |
} |
Expect.equals(value1, value2, 'Value mismatch for $id'); |
}); |
@@ -51,6 +55,9 @@ main() { |
if (value1 != value2) { |
reportHere(data2.compiler.reporter, actualData2.sourceSpan, |
'$id: from source:${value1},from dill:${value2}'); |
+ print('--annotations diff----------------------------------------'); |
+ print(data1.computeDiffCodeFor(data2)); |
+ print('----------------------------------------------------------'); |
} |
Expect.equals(value1, value2, 'Value mismatch for $id'); |
}); |
@@ -86,18 +93,21 @@ class ComputerMixin { |
return 'local:$localName'; |
} |
- String computeDynamicGetName(String propertyName) { |
- return 'dynamic-get:$propertyName'; |
+ String computeGetName(String propertyName) { |
+ return 'get:$propertyName'; |
} |
- String computeDynamicInvokeName(String propertyName) { |
- return 'dynamic-invoke:$propertyName'; |
+ String computeInvokeName(String propertyName) { |
+ return 'invoke:$propertyName'; |
} |
+ |
+ String get loopName => 'loop'; |
+ |
+ String get gotoName => 'goto'; |
} |
/// AST visitor for computing a descriptive mapping of the [Id]s in a member. |
-class ResolvedAstComputer extends AbstractResolvedAstComputer |
- with ComputerMixin { |
+class ResolvedAstComputer extends AstDataExtractor with ComputerMixin { |
ResolvedAstComputer(DiagnosticReporter reporter, |
Map<Id, ActualData> actualMap, ResolvedAst resolvedAst) |
: super(reporter, actualMap, resolvedAst); |
@@ -107,12 +117,25 @@ class ResolvedAstComputer extends AbstractResolvedAstComputer |
if (element != null && element.isLocal) { |
return computeLocalName(element.name); |
} |
+ if (node is ast.Loop) { |
+ return loopName; |
+ } else if (node is ast.GotoStatement) { |
+ return gotoName; |
+ } |
+ |
+ dynamic sendStructure; |
if (node is ast.Send) { |
- dynamic sendStructure = elements.getSendStructure(node); |
+ sendStructure = elements.getSendStructure(node); |
if (sendStructure == null) return null; |
String getDynamicName() { |
switch (sendStructure.semantics.kind) { |
+ case AccessKind.PARAMETER: |
+ case AccessKind.FINAL_PARAMETER: |
+ case AccessKind.LOCAL_VARIABLE: |
+ case AccessKind.FINAL_LOCAL_VARIABLE: |
+ case AccessKind.LOCAL_FUNCTION: |
+ return sendStructure.semantics.element.name; |
case AccessKind.DYNAMIC_PROPERTY: |
DynamicAccess access = sendStructure.semantics; |
return access.name.text; |
@@ -124,16 +147,25 @@ class ResolvedAstComputer extends AbstractResolvedAstComputer |
switch (sendStructure.kind) { |
case SendStructureKind.GET: |
String dynamicName = getDynamicName(); |
- if (dynamicName != null) return computeDynamicGetName(dynamicName); |
+ if (dynamicName != null) return computeGetName(dynamicName); |
break; |
+ case SendStructureKind.BINARY: |
+ return computeInvokeName(sendStructure.operator.selectorName); |
+ case SendStructureKind.EQUALS: |
+ return computeInvokeName('=='); |
+ case SendStructureKind.NOT_EQUALS: |
+ return computeInvokeName('!='); |
case SendStructureKind.INVOKE: |
String dynamicName = getDynamicName(); |
- if (dynamicName != null) return computeDynamicInvokeName(dynamicName); |
+ if (dynamicName != null) return computeInvokeName(dynamicName); |
break; |
default: |
} |
} |
- return '<unknown:$node>'; |
+ if (sendStructure != null) { |
+ return '<unknown:$node (${node.runtimeType}) $sendStructure>'; |
+ } |
+ return '<unknown:$node (${node.runtimeType})>'; |
} |
@override |
@@ -159,7 +191,7 @@ void computeIrMemberData( |
} |
/// IR visitor for computing a descriptive mapping of the [Id]s in a member. |
-class IrComputer extends AbstractIrComputer with ComputerMixin { |
+class IrComputer extends IrDataExtractor with ComputerMixin { |
IrComputer(Map<Id, ActualData> actualMap) : super(actualMap); |
@override |
@@ -171,11 +203,23 @@ class IrComputer extends AbstractIrComputer with ComputerMixin { |
} else if (node is ir.FunctionExpression) { |
return computeLocalName(''); |
} else if (node is ir.MethodInvocation) { |
- return computeDynamicInvokeName(node.name.name); |
+ return computeInvokeName(node.name.name); |
} else if (node is ir.PropertyGet) { |
- return computeDynamicGetName(node.name.name); |
+ return computeGetName(node.name.name); |
+ } else if (node is ir.VariableGet) { |
+ return computeGetName(node.variable.name); |
+ } else if (node is ir.DoStatement) { |
+ return loopName; |
+ } else if (node is ir.ForStatement) { |
+ return loopName; |
+ } else if (node is ir.ForInStatement) { |
+ return loopName; |
+ } else if (node is ir.WhileStatement) { |
+ return loopName; |
+ } else if (node is ir.BreakStatement) { |
+ return gotoName; |
} |
- return '<unknown:$node>'; |
+ return '<unknown:$node (${node.runtimeType})>'; |
} |
@override |