Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(175)

Side by Side Diff: tests/compiler/dart2js/equivalence/id_equivalence_test.dart

Issue 3001223002: Support unittest of jumps (Closed)
Patch Set: Created 3 years, 4 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
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 import 'dart:io'; 5 import 'dart:io';
6 import 'package:async_helper/async_helper.dart'; 6 import 'package:async_helper/async_helper.dart';
7 import 'package:compiler/src/common.dart'; 7 import 'package:compiler/src/common.dart';
8 import 'package:compiler/src/compiler.dart'; 8 import 'package:compiler/src/compiler.dart';
9 import 'package:compiler/src/diagnostics/diagnostic_listener.dart'; 9 import 'package:compiler/src/diagnostics/diagnostic_listener.dart';
10 import 'package:compiler/src/elements/elements.dart'; 10 import 'package:compiler/src/elements/elements.dart';
11 import 'package:compiler/src/elements/entities.dart'; 11 import 'package:compiler/src/elements/entities.dart';
12 import 'package:compiler/src/kernel/element_map.dart'; 12 import 'package:compiler/src/kernel/element_map.dart';
13 import 'package:compiler/src/kernel/kernel_backend_strategy.dart'; 13 import 'package:compiler/src/kernel/kernel_backend_strategy.dart';
14 import 'package:compiler/src/resolution/access_semantics.dart'; 14 import 'package:compiler/src/resolution/access_semantics.dart';
15 import 'package:compiler/src/resolution/send_structure.dart'; 15 import 'package:compiler/src/resolution/send_structure.dart';
16 import 'package:compiler/src/tree/nodes.dart' as ast; 16 import 'package:compiler/src/tree/nodes.dart' as ast;
17 import 'package:expect/expect.dart'; 17 import 'package:expect/expect.dart';
18 import 'package:kernel/ast.dart' as ir; 18 import 'package:kernel/ast.dart' as ir;
19 import '../equivalence/id_equivalence.dart'; 19 import '../equivalence/id_equivalence.dart';
20 import '../equivalence/id_equivalence_helper.dart'; 20 import '../equivalence/id_equivalence_helper.dart';
21 21
22 const List<String> dataDirectories = const <String>[ 22 const List<String> dataDirectories = const <String>[
23 '../closure/data', 23 '../closure/data',
24 '../inference/data', 24 '../inference/data',
25 '../jumps/data',
25 ]; 26 ];
26 27
27 main() { 28 main() {
28 asyncTest(() async { 29 asyncTest(() async {
29 for (String path in dataDirectories) { 30 for (String path in dataDirectories) {
30 Directory dataDir = new Directory.fromUri(Platform.script.resolve(path)); 31 Directory dataDir = new Directory.fromUri(Platform.script.resolve(path));
31 await for (FileSystemEntity entity in dataDir.list()) { 32 await for (FileSystemEntity entity in dataDir.list()) {
32 print('Checking ${entity.uri}'); 33 print('Checking ${entity.uri}');
33 String annotatedCode = 34 String annotatedCode =
34 await new File.fromUri(entity.uri).readAsString(); 35 await new File.fromUri(entity.uri).readAsString();
35 IdData data1 = await computeData( 36 IdData data1 = await computeData(
36 annotatedCode, computeAstMemberData, compileFromSource); 37 annotatedCode, computeAstMemberData, compileFromSource);
37 IdData data2 = await computeData( 38 IdData data2 = await computeData(
38 annotatedCode, computeIrMemberData, compileFromDill); 39 annotatedCode, computeIrMemberData, compileFromDill);
39 data1.actualMap.forEach((Id id, ActualData actualData1) { 40 data1.actualMap.forEach((Id id, ActualData actualData1) {
40 String value1 = actualData1.value; 41 String value1 = actualData1.value;
41 String value2 = data2.actualMap[id]?.value; 42 String value2 = data2.actualMap[id]?.value;
42 if (value1 != value2) { 43 if (value1 != value2) {
43 reportHere(data1.compiler.reporter, actualData1.sourceSpan, 44 reportHere(data1.compiler.reporter, actualData1.sourceSpan,
44 '$id: from source:${value1},from dill:${value2}'); 45 '$id: from source:${value1},from dill:${value2}');
46 print('--annotations diff----------------------------------------');
47 print(data1.computeDiffCodeFor(data2));
48 print('----------------------------------------------------------');
45 } 49 }
46 Expect.equals(value1, value2, 'Value mismatch for $id'); 50 Expect.equals(value1, value2, 'Value mismatch for $id');
47 }); 51 });
48 data2.actualMap.forEach((Id id, ActualData actualData2) { 52 data2.actualMap.forEach((Id id, ActualData actualData2) {
49 String value2 = actualData2.value; 53 String value2 = actualData2.value;
50 String value1 = data1.actualMap[id]?.value; 54 String value1 = data1.actualMap[id]?.value;
51 if (value1 != value2) { 55 if (value1 != value2) {
52 reportHere(data2.compiler.reporter, actualData2.sourceSpan, 56 reportHere(data2.compiler.reporter, actualData2.sourceSpan,
53 '$id: from source:${value1},from dill:${value2}'); 57 '$id: from source:${value1},from dill:${value2}');
58 print('--annotations diff----------------------------------------');
59 print(data1.computeDiffCodeFor(data2));
60 print('----------------------------------------------------------');
54 } 61 }
55 Expect.equals(value1, value2, 'Value mismatch for $id'); 62 Expect.equals(value1, value2, 'Value mismatch for $id');
56 }); 63 });
57 } 64 }
58 } 65 }
59 }); 66 });
60 } 67 }
61 68
62 /// Compute a descriptive mapping of the [Id]s in [_member] as a 69 /// Compute a descriptive mapping of the [Id]s in [_member] as a
63 /// [MemberElement]. 70 /// [MemberElement].
(...skipping 15 matching lines...) Expand all
79 if (className != null) { 86 if (className != null) {
80 return 'member:$className.$memberName'; 87 return 'member:$className.$memberName';
81 } 88 }
82 return 'member:$memberName'; 89 return 'member:$memberName';
83 } 90 }
84 91
85 String computeLocalName(String localName) { 92 String computeLocalName(String localName) {
86 return 'local:$localName'; 93 return 'local:$localName';
87 } 94 }
88 95
89 String computeDynamicGetName(String propertyName) { 96 String computeGetName(String propertyName) {
90 return 'dynamic-get:$propertyName'; 97 return 'get:$propertyName';
91 } 98 }
92 99
93 String computeDynamicInvokeName(String propertyName) { 100 String computeInvokeName(String propertyName) {
94 return 'dynamic-invoke:$propertyName'; 101 return 'invoke:$propertyName';
95 } 102 }
103
104 String get loopName => 'loop';
105
106 String get gotoName => 'goto';
96 } 107 }
97 108
98 /// AST visitor for computing a descriptive mapping of the [Id]s in a member. 109 /// AST visitor for computing a descriptive mapping of the [Id]s in a member.
99 class ResolvedAstComputer extends AbstractResolvedAstComputer 110 class ResolvedAstComputer extends AbstractResolvedAstComputer
100 with ComputerMixin { 111 with ComputerMixin {
101 ResolvedAstComputer(DiagnosticReporter reporter, 112 ResolvedAstComputer(DiagnosticReporter reporter,
102 Map<Id, ActualData> actualMap, ResolvedAst resolvedAst) 113 Map<Id, ActualData> actualMap, ResolvedAst resolvedAst)
103 : super(reporter, actualMap, resolvedAst); 114 : super(reporter, actualMap, resolvedAst);
104 115
105 @override 116 @override
106 String computeNodeValue(ast.Node node, AstElement element) { 117 String computeNodeValue(ast.Node node, AstElement element) {
107 if (element != null && element.isLocal) { 118 if (element != null && element.isLocal) {
108 return computeLocalName(element.name); 119 return computeLocalName(element.name);
109 } 120 }
121 if (node is ast.Loop) {
122 return loopName;
123 } else if (node is ast.GotoStatement) {
124 return gotoName;
125 }
126
127 dynamic sendStructure;
110 if (node is ast.Send) { 128 if (node is ast.Send) {
111 dynamic sendStructure = elements.getSendStructure(node); 129 sendStructure = elements.getSendStructure(node);
112 if (sendStructure == null) return null; 130 if (sendStructure == null) return null;
113 131
114 String getDynamicName() { 132 String getDynamicName() {
115 switch (sendStructure.semantics.kind) { 133 switch (sendStructure.semantics.kind) {
134 case AccessKind.PARAMETER:
135 case AccessKind.FINAL_PARAMETER:
136 case AccessKind.LOCAL_VARIABLE:
137 case AccessKind.FINAL_LOCAL_VARIABLE:
138 case AccessKind.LOCAL_FUNCTION:
139 return sendStructure.semantics.element.name;
116 case AccessKind.DYNAMIC_PROPERTY: 140 case AccessKind.DYNAMIC_PROPERTY:
117 DynamicAccess access = sendStructure.semantics; 141 DynamicAccess access = sendStructure.semantics;
118 return access.name.text; 142 return access.name.text;
119 default: 143 default:
120 return null; 144 return null;
121 } 145 }
122 } 146 }
123 147
124 switch (sendStructure.kind) { 148 switch (sendStructure.kind) {
125 case SendStructureKind.GET: 149 case SendStructureKind.GET:
126 String dynamicName = getDynamicName(); 150 String dynamicName = getDynamicName();
127 if (dynamicName != null) return computeDynamicGetName(dynamicName); 151 if (dynamicName != null) return computeGetName(dynamicName);
128 break; 152 break;
153 case SendStructureKind.BINARY:
154 return computeInvokeName(sendStructure.operator.selectorName);
155 case SendStructureKind.EQUALS:
156 return computeInvokeName('==');
157 case SendStructureKind.NOT_EQUALS:
158 return computeInvokeName('!=');
129 case SendStructureKind.INVOKE: 159 case SendStructureKind.INVOKE:
130 String dynamicName = getDynamicName(); 160 String dynamicName = getDynamicName();
131 if (dynamicName != null) return computeDynamicInvokeName(dynamicName); 161 if (dynamicName != null) return computeInvokeName(dynamicName);
132 break; 162 break;
133 default: 163 default:
134 } 164 }
135 } 165 }
136 return '<unknown:$node>'; 166 if (sendStructure != null) {
167 return '<unknown:$node (${node.runtimeType}) $sendStructure>';
168 }
169 return '<unknown:$node (${node.runtimeType})>';
137 } 170 }
138 171
139 @override 172 @override
140 String computeElementValue(AstElement element) { 173 String computeElementValue(AstElement element) {
141 return computeMemberName(element.enclosingClass?.name, element.name); 174 return computeMemberName(element.enclosingClass?.name, element.name);
142 } 175 }
143 } 176 }
144 177
145 /// Compute a descriptive mapping of the [Id]s in [member] as a kernel based 178 /// Compute a descriptive mapping of the [Id]s in [member] as a kernel based
146 /// member. 179 /// member.
(...skipping 17 matching lines...) Expand all
164 197
165 @override 198 @override
166 String computeNodeValue(ir.TreeNode node) { 199 String computeNodeValue(ir.TreeNode node) {
167 if (node is ir.VariableDeclaration) { 200 if (node is ir.VariableDeclaration) {
168 return computeLocalName(node.name); 201 return computeLocalName(node.name);
169 } else if (node is ir.FunctionDeclaration) { 202 } else if (node is ir.FunctionDeclaration) {
170 return computeLocalName(node.variable.name); 203 return computeLocalName(node.variable.name);
171 } else if (node is ir.FunctionExpression) { 204 } else if (node is ir.FunctionExpression) {
172 return computeLocalName(''); 205 return computeLocalName('');
173 } else if (node is ir.MethodInvocation) { 206 } else if (node is ir.MethodInvocation) {
174 return computeDynamicInvokeName(node.name.name); 207 return computeInvokeName(node.name.name);
175 } else if (node is ir.PropertyGet) { 208 } else if (node is ir.PropertyGet) {
176 return computeDynamicGetName(node.name.name); 209 return computeGetName(node.name.name);
210 } else if (node is ir.VariableGet) {
211 return computeGetName(node.variable.name);
212 } else if (node is ir.DoStatement) {
213 return loopName;
214 } else if (node is ir.ForStatement) {
215 return loopName;
216 } else if (node is ir.ForInStatement) {
217 return loopName;
218 } else if (node is ir.WhileStatement) {
219 return loopName;
220 } else if (node is ir.BreakStatement) {
221 return gotoName;
177 } 222 }
178 return '<unknown:$node>'; 223 return '<unknown:$node (${node.runtimeType})>';
179 } 224 }
180 225
181 @override 226 @override
182 String computeMemberValue(ir.Member member) { 227 String computeMemberValue(ir.Member member) {
183 return computeMemberName(member.enclosingClass?.name, member.name.name); 228 return computeMemberName(member.enclosingClass?.name, member.name.name);
184 } 229 }
185 } 230 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698