| 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 |