OLD | NEW |
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'; |
(...skipping 18 matching lines...) Expand all Loading... |
29 for (String path in dataDirectories) { | 29 for (String path in dataDirectories) { |
30 Directory dataDir = new Directory.fromUri(Platform.script.resolve(path)); | 30 Directory dataDir = new Directory.fromUri(Platform.script.resolve(path)); |
31 await for (FileSystemEntity entity in dataDir.list()) { | 31 await for (FileSystemEntity entity in dataDir.list()) { |
32 print('Checking ${entity.uri}'); | 32 print('Checking ${entity.uri}'); |
33 String annotatedCode = | 33 String annotatedCode = |
34 await new File.fromUri(entity.uri).readAsString(); | 34 await new File.fromUri(entity.uri).readAsString(); |
35 IdData data1 = await computeData( | 35 IdData data1 = await computeData( |
36 annotatedCode, computeAstMemberData, compileFromSource); | 36 annotatedCode, computeAstMemberData, compileFromSource); |
37 IdData data2 = await computeData( | 37 IdData data2 = await computeData( |
38 annotatedCode, computeIrMemberData, compileFromDill); | 38 annotatedCode, computeIrMemberData, compileFromDill); |
39 data1.actualMap.forEach((Id id, String value1) { | 39 data1.actualMap.forEach((Id id, ActualData actualData1) { |
40 String value2 = data2.actualMap[id]; | 40 String value1 = actualData1.value; |
| 41 String value2 = data2.actualMap[id]?.value; |
41 if (value1 != value2) { | 42 if (value1 != value2) { |
42 reportHere(data1.compiler.reporter, data1.sourceSpanMap[id], | 43 reportHere(data1.compiler.reporter, actualData1.sourceSpan, |
43 '$id: from source:${value1},from dill:${value2}'); | 44 '$id: from source:${value1},from dill:${value2}'); |
44 } | 45 } |
45 Expect.equals(value1, value2, 'Value mismatch for $id'); | 46 Expect.equals(value1, value2, 'Value mismatch for $id'); |
46 }); | 47 }); |
47 data2.actualMap.forEach((Id id, String value2) { | 48 data2.actualMap.forEach((Id id, ActualData actualData2) { |
48 String value1 = data1.actualMap[id]; | 49 String value2 = actualData2.value; |
| 50 String value1 = data1.actualMap[id]?.value; |
49 if (value1 != value2) { | 51 if (value1 != value2) { |
50 reportHere(data2.compiler.reporter, data2.sourceSpanMap[id], | 52 reportHere(data2.compiler.reporter, actualData2.sourceSpan, |
51 '$id: from source:${value1},from dill:${value2}'); | 53 '$id: from source:${value1},from dill:${value2}'); |
52 } | 54 } |
53 Expect.equals(value1, value2, 'Value mismatch for $id'); | 55 Expect.equals(value1, value2, 'Value mismatch for $id'); |
54 }); | 56 }); |
55 } | 57 } |
56 } | 58 } |
57 }); | 59 }); |
58 } | 60 } |
59 | 61 |
60 /// Compute a descriptive mapping of the [Id]s in [_member] as a | 62 /// Compute a descriptive mapping of the [Id]s in [_member] as a |
61 /// [MemberElement]. | 63 /// [MemberElement]. |
62 /// | 64 /// |
63 /// Fills [actualMap] with the data and [sourceSpanMap] with the source spans | 65 /// Fills [actualMap] with the data and [sourceSpanMap] with the source spans |
64 /// for the data origin. | 66 /// for the data origin. |
65 void computeAstMemberData(Compiler compiler, MemberEntity _member, | 67 void computeAstMemberData( |
66 Map<Id, String> actualMap, Map<Id, SourceSpan> sourceSpanMap, | 68 Compiler compiler, MemberEntity _member, Map<Id, ActualData> actualMap, |
67 {bool verbose: false}) { | 69 {bool verbose: false}) { |
68 MemberElement member = _member; | 70 MemberElement member = _member; |
69 ResolvedAst resolvedAst = member.resolvedAst; | 71 ResolvedAst resolvedAst = member.resolvedAst; |
70 if (resolvedAst.kind != ResolvedAstKind.PARSED) return; | 72 if (resolvedAst.kind != ResolvedAstKind.PARSED) return; |
71 new ResolvedAstComputer( | 73 new ResolvedAstComputer(compiler.reporter, actualMap, resolvedAst).run(); |
72 compiler.reporter, actualMap, sourceSpanMap, resolvedAst) | |
73 .run(); | |
74 } | 74 } |
75 | 75 |
76 /// Mixin used for0computing a descriptive mapping of the [Id]s in a member. | 76 /// Mixin used for0computing a descriptive mapping of the [Id]s in a member. |
77 class ComputerMixin { | 77 class ComputerMixin { |
78 String computeMemberName(String className, String memberName) { | 78 String computeMemberName(String className, String memberName) { |
79 if (className != null) { | 79 if (className != null) { |
80 return 'member:$className.$memberName'; | 80 return 'member:$className.$memberName'; |
81 } | 81 } |
82 return 'member:$memberName'; | 82 return 'member:$memberName'; |
83 } | 83 } |
84 | 84 |
85 String computeLocalName(String localName) { | 85 String computeLocalName(String localName) { |
86 return 'local:$localName'; | 86 return 'local:$localName'; |
87 } | 87 } |
88 | 88 |
89 String computeDynamicGetName(String propertyName) { | 89 String computeDynamicGetName(String propertyName) { |
90 return 'dynamic-get:$propertyName'; | 90 return 'dynamic-get:$propertyName'; |
91 } | 91 } |
92 | 92 |
93 String computeDynamicInvokeName(String propertyName) { | 93 String computeDynamicInvokeName(String propertyName) { |
94 return 'dynamic-invoke:$propertyName'; | 94 return 'dynamic-invoke:$propertyName'; |
95 } | 95 } |
96 } | 96 } |
97 | 97 |
98 /// AST visitor for computing a descriptive mapping of the [Id]s in a member. | 98 /// AST visitor for computing a descriptive mapping of the [Id]s in a member. |
99 class ResolvedAstComputer extends AbstractResolvedAstComputer | 99 class ResolvedAstComputer extends AbstractResolvedAstComputer |
100 with ComputerMixin { | 100 with ComputerMixin { |
101 ResolvedAstComputer(DiagnosticReporter reporter, Map<Id, String> actualMap, | 101 ResolvedAstComputer(DiagnosticReporter reporter, |
102 Map<Id, SourceSpan> spannableMap, ResolvedAst resolvedAst) | 102 Map<Id, ActualData> actualMap, ResolvedAst resolvedAst) |
103 : super(reporter, actualMap, spannableMap, resolvedAst); | 103 : super(reporter, actualMap, resolvedAst); |
104 | 104 |
105 @override | 105 @override |
106 String computeNodeValue(ast.Node node, AstElement element) { | 106 String computeNodeValue(ast.Node node, AstElement element) { |
107 if (element != null && element.isLocal) { | 107 if (element != null && element.isLocal) { |
108 return computeLocalName(element.name); | 108 return computeLocalName(element.name); |
109 } | 109 } |
110 if (node is ast.Send) { | 110 if (node is ast.Send) { |
111 dynamic sendStructure = elements.getSendStructure(node); | 111 dynamic sendStructure = elements.getSendStructure(node); |
112 if (sendStructure == null) return null; | 112 if (sendStructure == null) return null; |
113 | 113 |
(...skipping 26 matching lines...) Expand all Loading... |
140 String computeElementValue(AstElement element) { | 140 String computeElementValue(AstElement element) { |
141 return computeMemberName(element.enclosingClass?.name, element.name); | 141 return computeMemberName(element.enclosingClass?.name, element.name); |
142 } | 142 } |
143 } | 143 } |
144 | 144 |
145 /// Compute a descriptive mapping of the [Id]s in [member] as a kernel based | 145 /// Compute a descriptive mapping of the [Id]s in [member] as a kernel based |
146 /// member. | 146 /// member. |
147 /// | 147 /// |
148 /// Fills [actualMap] with the data and [sourceSpanMap] with the source spans | 148 /// Fills [actualMap] with the data and [sourceSpanMap] with the source spans |
149 /// for the data origin. | 149 /// for the data origin. |
150 void computeIrMemberData(Compiler compiler, MemberEntity member, | 150 void computeIrMemberData( |
151 Map<Id, String> actualMap, Map<Id, Spannable> spannableMap, | 151 Compiler compiler, MemberEntity member, Map<Id, ActualData> actualMap, |
152 {bool verbose: false}) { | 152 {bool verbose: false}) { |
153 KernelBackendStrategy backendStrategy = compiler.backendStrategy; | 153 KernelBackendStrategy backendStrategy = compiler.backendStrategy; |
154 KernelToElementMapForBuilding elementMap = backendStrategy.elementMap; | 154 KernelToElementMapForBuilding elementMap = backendStrategy.elementMap; |
155 MemberDefinition definition = elementMap.getMemberDefinition(member); | 155 MemberDefinition definition = elementMap.getMemberDefinition(member); |
156 assert(definition.kind == MemberKind.regular, | 156 assert(definition.kind == MemberKind.regular, |
157 failedAt(member, "Unexpected member definition $definition")); | 157 failedAt(member, "Unexpected member definition $definition")); |
158 new IrComputer(actualMap, spannableMap).run(definition.node); | 158 new IrComputer(actualMap).run(definition.node); |
159 } | 159 } |
160 | 160 |
161 /// IR visitor for computing a descriptive mapping of the [Id]s in a member. | 161 /// IR visitor for computing a descriptive mapping of the [Id]s in a member. |
162 class IrComputer extends AbstractIrComputer with ComputerMixin { | 162 class IrComputer extends AbstractIrComputer with ComputerMixin { |
163 IrComputer(Map<Id, String> actualMap, Map<Id, SourceSpan> spannableMap) | 163 IrComputer(Map<Id, ActualData> actualMap) : super(actualMap); |
164 : super(actualMap, spannableMap); | |
165 | 164 |
166 @override | 165 @override |
167 String computeNodeValue(ir.TreeNode node) { | 166 String computeNodeValue(ir.TreeNode node) { |
168 if (node is ir.VariableDeclaration) { | 167 if (node is ir.VariableDeclaration) { |
169 return computeLocalName(node.name); | 168 return computeLocalName(node.name); |
170 } else if (node is ir.FunctionDeclaration) { | 169 } else if (node is ir.FunctionDeclaration) { |
171 return computeLocalName(node.variable.name); | 170 return computeLocalName(node.variable.name); |
172 } else if (node is ir.FunctionExpression) { | 171 } else if (node is ir.FunctionExpression) { |
173 return computeLocalName(''); | 172 return computeLocalName(''); |
174 } else if (node is ir.MethodInvocation) { | 173 } else if (node is ir.MethodInvocation) { |
175 return computeDynamicInvokeName(node.name.name); | 174 return computeDynamicInvokeName(node.name.name); |
176 } else if (node is ir.PropertyGet) { | 175 } else if (node is ir.PropertyGet) { |
177 return computeDynamicGetName(node.name.name); | 176 return computeDynamicGetName(node.name.name); |
178 } | 177 } |
179 return '<unknown:$node>'; | 178 return '<unknown:$node>'; |
180 } | 179 } |
181 | 180 |
182 @override | 181 @override |
183 String computeMemberValue(ir.Member member) { | 182 String computeMemberValue(ir.Member member) { |
184 return computeMemberName(member.enclosingClass?.name, member.name.name); | 183 return computeMemberName(member.enclosingClass?.name, member.name.name); |
185 } | 184 } |
186 } | 185 } |
OLD | NEW |