| 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 'package:compiler/src/elements/elements.dart'; | 5 import 'package:compiler/src/elements/elements.dart'; |
| 6 import 'package:compiler/src/resolution/access_semantics.dart'; | 6 import 'package:compiler/src/resolution/access_semantics.dart'; |
| 7 import 'package:compiler/src/resolution/send_structure.dart'; | 7 import 'package:compiler/src/resolution/send_structure.dart'; |
| 8 import 'package:compiler/src/resolution/tree_elements.dart'; | 8 import 'package:compiler/src/resolution/tree_elements.dart'; |
| 9 import 'package:compiler/src/tree/nodes.dart' as ast; | 9 import 'package:compiler/src/tree/nodes.dart' as ast; |
| 10 import 'package:kernel/ast.dart' as ir; | 10 import 'package:kernel/ast.dart' as ir; |
| 11 | 11 |
| 12 enum IdKind { element, node, local_variable, local_function } | 12 enum IdKind { |
| 13 element, |
| 14 node, |
| 15 } |
| 13 | 16 |
| 14 /// Id for a code point or element with type inference information. | 17 /// Id for a code point or element with type inference information. |
| 15 abstract class Id { | 18 abstract class Id { |
| 16 IdKind get kind; | 19 IdKind get kind; |
| 17 } | 20 } |
| 18 | 21 |
| 19 /// Id for an element with type inference information. | 22 /// Id for an element with type inference information. |
| 20 // TODO(johnniwinther): Support local variables, functions and parameters. | 23 // TODO(johnniwinther): Support local variables, functions and parameters. |
| 21 class ElementId implements Id { | 24 class ElementId implements Id { |
| 22 final String className; | 25 final String className; |
| (...skipping 55 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 78 } | 81 } |
| 79 String className = element.enclosingClass?.name; | 82 String className = element.enclosingClass?.name; |
| 80 return new ElementId.internal(memberName, className); | 83 return new ElementId.internal(memberName, className); |
| 81 } | 84 } |
| 82 | 85 |
| 83 NodeId computeAccessId(ast.Send node, AccessSemantics access) { | 86 NodeId computeAccessId(ast.Send node, AccessSemantics access) { |
| 84 switch (access.kind) { | 87 switch (access.kind) { |
| 85 case AccessKind.DYNAMIC_PROPERTY: | 88 case AccessKind.DYNAMIC_PROPERTY: |
| 86 return new NodeId(node.selector.getBeginToken().charOffset); | 89 return new NodeId(node.selector.getBeginToken().charOffset); |
| 87 default: | 90 default: |
| 88 return new NodeId(node.getBeginToken().charOffset); | 91 return null; |
| 89 } | 92 } |
| 90 } | 93 } |
| 91 | 94 |
| 92 NodeId computeNodeId(ast.Node node, AstElement element) { | 95 NodeId computeNodeId(ast.Node node, AstElement element) { |
| 93 if (element != null && element.isLocal) { | 96 if (element != null && element.isLocal) { |
| 94 return new NodeId(node.getBeginToken().charOffset); | 97 return new NodeId(node.getBeginToken().charOffset); |
| 95 } else if (node is ast.Send) { | 98 } else if (node is ast.Send) { |
| 96 dynamic sendStructure = elements.getSendStructure(node); | 99 dynamic sendStructure = elements.getSendStructure(node); |
| 97 if (sendStructure == null) return null; | 100 if (sendStructure == null) return null; |
| 98 switch (sendStructure.kind) { | 101 switch (sendStructure.kind) { |
| 99 case SendStructureKind.GET: | 102 case SendStructureKind.GET: |
| 100 case SendStructureKind.INVOKE: | 103 case SendStructureKind.INVOKE: |
| 101 case SendStructureKind.INCOMPATIBLE_INVOKE: | |
| 102 return computeAccessId(node, sendStructure.semantics); | 104 return computeAccessId(node, sendStructure.semantics); |
| 103 default: | 105 default: |
| 104 return new NodeId(node.getBeginToken().charOffset); | |
| 105 } | 106 } |
| 106 } | 107 } |
| 107 return new NodeId(node.getBeginToken().charOffset); | 108 return null; |
| 108 } | 109 } |
| 109 } | 110 } |
| 110 | 111 |
| 111 /// Visitor that finds the AST node or element corresponding to an [Id]. | 112 /// Visitor that finds the AST node or element corresponding to an [Id]. |
| 112 class AstIdFinder extends ast.Visitor with AstEnumeratorMixin { | 113 class AstIdFinder extends ast.Visitor with AstEnumeratorMixin { |
| 113 Id soughtId; | 114 Id soughtId; |
| 114 var /*AstElement|ast.Node*/ found; | 115 var /*AstElement|ast.Node*/ found; |
| 115 final TreeElements elements; | 116 final TreeElements elements; |
| 116 | 117 |
| 117 AstIdFinder(this.elements); | 118 AstIdFinder(this.elements); |
| (...skipping 77 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 195 if (node.enclosingClass != null) { | 196 if (node.enclosingClass != null) { |
| 196 className = node.enclosingClass.name; | 197 className = node.enclosingClass.name; |
| 197 } | 198 } |
| 198 String memberName = node.name.name; | 199 String memberName = node.name.name; |
| 199 if (node is ir.Procedure && node.kind == ir.ProcedureKind.Setter) { | 200 if (node is ir.Procedure && node.kind == ir.ProcedureKind.Setter) { |
| 200 memberName += '='; | 201 memberName += '='; |
| 201 } | 202 } |
| 202 return new ElementId.internal(memberName, className); | 203 return new ElementId.internal(memberName, className); |
| 203 } | 204 } |
| 204 | 205 |
| 205 Id computeNodeId(ir.Node node) { | 206 Id computeNodeId(ir.TreeNode node) { |
| 206 if (node is ir.MethodInvocation) { | 207 if (node is ir.MethodInvocation) { |
| 207 assert(node.fileOffset != ir.TreeNode.noOffset); | 208 assert(node.fileOffset != ir.TreeNode.noOffset); |
| 208 return new NodeId(node.fileOffset); | 209 return new NodeId(node.fileOffset); |
| 209 } else if (node is ir.PropertyGet) { | 210 } else if (node is ir.PropertyGet) { |
| 210 assert(node.fileOffset != ir.TreeNode.noOffset); | 211 assert(node.fileOffset != ir.TreeNode.noOffset); |
| 211 return new NodeId(node.fileOffset); | 212 return new NodeId(node.fileOffset); |
| 213 } else if (node is ir.VariableDeclaration) { |
| 214 assert(node.fileOffset != ir.TreeNode.noOffset); |
| 215 return new NodeId(node.fileOffset); |
| 216 } else if (node is ir.FunctionDeclaration) { |
| 217 assert(node.fileOffset != ir.TreeNode.noOffset); |
| 218 return new NodeId(node.fileOffset); |
| 212 } | 219 } |
| 213 return null; | 220 return null; |
| 214 } | 221 } |
| 215 } | 222 } |
| 216 | 223 |
| 217 /// Visitor that finds the IR node corresponding to an [Id]. | 224 /// Visitor that finds the IR node corresponding to an [Id]. |
| 218 class IrIdFinder extends ir.Visitor with IrEnumeratorMixin { | 225 class IrIdFinder extends ir.Visitor with IrEnumeratorMixin { |
| 219 Id soughtId; | 226 Id soughtId; |
| 220 ir.Node found; | 227 ir.Node found; |
| 221 | 228 |
| 222 /// Visits the subtree of [root] returns the [ir.Node] corresponding to [id]. | 229 /// Visits the subtree of [root] returns the [ir.Node] corresponding to [id]. |
| 223 ir.Node find(ir.Node root, Id id) { | 230 ir.Node find(ir.Node root, Id id) { |
| 224 soughtId = id; | 231 soughtId = id; |
| 225 root.accept(this); | 232 root.accept(this); |
| 226 var result = found; | 233 var result = found; |
| 227 found = null; | 234 found = null; |
| 228 return result; | 235 return result; |
| 229 } | 236 } |
| 230 | 237 |
| 231 defaultNode(ir.Node node) { | 238 defaultTreeNode(ir.TreeNode node) { |
| 232 if (found == null) { | 239 if (found == null) { |
| 233 Id id = computeNodeId(node); | 240 Id id = computeNodeId(node); |
| 234 if (id == soughtId) { | 241 if (id == soughtId) { |
| 235 found = node; | 242 found = node; |
| 236 return; | 243 return; |
| 237 } | 244 } |
| 238 node.visitChildren(this); | 245 node.visitChildren(this); |
| 239 } | 246 } |
| 240 } | 247 } |
| 241 | 248 |
| 242 defaultMember(ir.Member node) { | 249 defaultMember(ir.Member node) { |
| 243 if (found == null) { | 250 if (found == null) { |
| 244 Id id = computeElementId(node); | 251 Id id = computeElementId(node); |
| 245 if (id == soughtId) { | 252 if (id == soughtId) { |
| 246 found = node; | 253 found = node; |
| 247 return; | 254 return; |
| 248 } | 255 } |
| 249 defaultNode(node); | 256 defaultTreeNode(node); |
| 250 } | 257 } |
| 251 } | 258 } |
| 252 } | 259 } |
| OLD | NEW |