| OLD | NEW |
| 1 // Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2012, 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 class SendVisitor extends ResolvedVisitor { | 5 class SendVisitor extends ResolvedVisitor { |
| 6 final PlaceholderCollector collector; | 6 final PlaceholderCollector collector; |
| 7 | 7 |
| 8 SendVisitor(this.collector, TreeElements elements) : super(elements); | 8 SendVisitor(this.collector, TreeElements elements) : super(elements); |
| 9 | 9 |
| 10 visitSuperSend(Send node) {} | 10 visitSuperSend(Send node) {} |
| (...skipping 54 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 65 } | 65 } |
| 66 } | 66 } |
| 67 | 67 |
| 68 tryRenamePrivateSelector(Send node) { | 68 tryRenamePrivateSelector(Send node) { |
| 69 collector.tryMakePrivateIdentifier(node.selector.asIdentifier()); | 69 collector.tryMakePrivateIdentifier(node.selector.asIdentifier()); |
| 70 } | 70 } |
| 71 } | 71 } |
| 72 | 72 |
| 73 class PlaceholderCollector extends AbstractVisitor { | 73 class PlaceholderCollector extends AbstractVisitor { |
| 74 final Compiler compiler; | 74 final Compiler compiler; |
| 75 final Map<Node, Placeholder> placeholders; | 75 final Set<Node> nullNodes; // Nodes that should not be in output. |
| 76 final Map<Element, Map<String, LocalPlaceholder>> localPlaceholders; | 76 final Set<Identifier> unresolvedNodes; |
| 77 final Map<Element, Set<Node>> elementNodes; |
| 78 final Map<FunctionElement, Set<LocalPlaceholder>> localPlaceholders; |
| 79 final Map<LibraryElement, Set<Node>> privateNodes; |
| 80 Map<String, LocalPlaceholder> currentLocalPlaceholders; |
| 77 Element currentElement; | 81 Element currentElement; |
| 78 TreeElements treeElements; | 82 TreeElements treeElements; |
| 79 | 83 |
| 80 PlaceholderCollector(this.compiler) : | 84 PlaceholderCollector(this.compiler) : |
| 81 placeholders = new Map<Node, Placeholder>(), | 85 nullNodes = new Set<Node>(), |
| 82 localPlaceholders = new Map<Element, Map<String, LocalPlaceholder>>(); | 86 unresolvedNodes = new Set<Identifier>(), |
| 87 elementNodes = new Map<Element, Set<Node>>(), |
| 88 localPlaceholders = new Map<FunctionElement, Set<LocalPlaceholder>>(), |
| 89 privateNodes = new Map<LibraryElement, Set<Node>>(); |
| 83 | 90 |
| 84 void collectFunctionDeclarationPlaceholders( | 91 void collectFunctionDeclarationPlaceholders( |
| 85 FunctionElement element, FunctionExpression node) { | 92 FunctionElement element, FunctionExpression node) { |
| 86 if (element.isGenerativeConstructor() || element.isFactoryConstructor()) { | 93 if (element.isGenerativeConstructor() || element.isFactoryConstructor()) { |
| 87 // Two complicated cases for class/interface renaming: | 94 // Two complicated cases for class/interface renaming: |
| 88 // 1) class which implements constructors of other interfaces, but not | 95 // 1) class which implements constructors of other interfaces, but not |
| 89 // implements interfaces themselves: | 96 // implements interfaces themselves: |
| 90 // 0.dart: class C { I(); } | 97 // 0.dart: class C { I(); } |
| 91 // 1.dart and 2.dart: interface I default C { I(); } | 98 // 1.dart and 2.dart: interface I default C { I(); } |
| 92 // now we have to duplicate our I() constructor in C class with | 99 // now we have to duplicate our I() constructor in C class with |
| (...skipping 80 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 173 // variable list element twice, better merge this with emitter logic. | 180 // variable list element twice, better merge this with emitter logic. |
| 174 currentElement = (element as VariableElement).variables; | 181 currentElement = (element as VariableElement).variables; |
| 175 elementNode = currentElement.parseNode(compiler); | 182 elementNode = currentElement.parseNode(compiler); |
| 176 collectFieldDeclarationPlaceholders(element, elementNode); | 183 collectFieldDeclarationPlaceholders(element, elementNode); |
| 177 } else if (element is ClassElement || element is TypedefElement) { | 184 } else if (element is ClassElement || element is TypedefElement) { |
| 178 currentElement = element; | 185 currentElement = element; |
| 179 elementNode = currentElement.parseNode(compiler); | 186 elementNode = currentElement.parseNode(compiler); |
| 180 } else { | 187 } else { |
| 181 assert(false); // Unreachable. | 188 assert(false); // Unreachable. |
| 182 } | 189 } |
| 190 currentLocalPlaceholders = new Map<String, LocalPlaceholder>(); |
| 183 compiler.withCurrentElement(element, () { | 191 compiler.withCurrentElement(element, () { |
| 184 elementNode.accept(this); | 192 elementNode.accept(this); |
| 185 }); | 193 }); |
| 186 } | 194 } |
| 187 | 195 |
| 188 Type resolveType(TypeAnnotation typeAnnotation) { | 196 Type resolveType(TypeAnnotation typeAnnotation) { |
| 189 if (treeElements === null) return null; | 197 if (treeElements === null) return null; |
| 190 var result = treeElements.getType(typeAnnotation); | 198 var result = treeElements.getType(typeAnnotation); |
| 191 // TODO: Have better type resolution. | 199 // TODO: Have better type resolution. |
| 192 if (result === null) { | 200 if (result === null) { |
| (...skipping 14 matching lines...) Expand all Loading... |
| 207 || (element.isFunction() && !Elements.isStaticOrTopLevel(element))) { | 215 || (element.isFunction() && !Elements.isStaticOrTopLevel(element))) { |
| 208 makeLocalPlaceholder(node); | 216 makeLocalPlaceholder(node); |
| 209 } | 217 } |
| 210 } | 218 } |
| 211 | 219 |
| 212 void makeTypePlaceholder(Node node, Type type) { | 220 void makeTypePlaceholder(Node node, Type type) { |
| 213 makeElementPlaceholder(node, type.element); | 221 makeElementPlaceholder(node, type.element); |
| 214 } | 222 } |
| 215 | 223 |
| 216 void makeNullPlaceholder(Node node) { | 224 void makeNullPlaceholder(Node node) { |
| 217 placeholders[node] = new NullPlaceholder(); | 225 assert(node is Identifier || node is Send); |
| 226 nullNodes.add(node); |
| 218 } | 227 } |
| 219 | 228 |
| 220 void makeElementPlaceholder(Node node, Element element) { | 229 void makeElementPlaceholder(Node node, Element element) { |
| 221 assert(element !== null); | 230 assert(element !== null); |
| 222 placeholders[node] = new ElementPlaceholder(element); | 231 elementNodes.putIfAbsent(element, () => new Set<Node>()).add(node); |
| 223 } | 232 } |
| 224 | 233 |
| 225 void makePrivateIdentifier(Identifier node) { | 234 void makePrivateIdentifier(Identifier node) { |
| 226 assert(node !== null); | 235 assert(node !== null); |
| 227 placeholders[node] = | 236 privateNodes.putIfAbsent( |
| 228 new PrivatePlaceholder(currentElement.getLibrary(), node); | 237 currentElement.getLibrary(), () => new Set<Node>()).add(node); |
| 229 } | 238 } |
| 230 | 239 |
| 231 void makeUnresolvedPlaceholder(Node node) { | 240 void makeUnresolvedPlaceholder(Node node) { |
| 232 placeholders[node] = const UnresolvedPlaceholder(); | 241 unresolvedNodes.add(node); |
| 233 } | 242 } |
| 234 | 243 |
| 235 void makeLocalPlaceholder(Node node) { | 244 void makeLocalPlaceholder(Node node) { |
| 236 assert(currentElement is FunctionElement); | 245 assert(currentElement is FunctionElement); |
| 237 assert(node is Identifier); | 246 assert(node is Identifier); |
| 238 Map<String, LocalPlaceholder> functionLocals = | |
| 239 localPlaceholders.putIfAbsent(currentElement, | |
| 240 () => <LocalPlaceholder>{}); | |
| 241 String identifier = node.asIdentifier().source.slowToString(); | 247 String identifier = node.asIdentifier().source.slowToString(); |
| 242 LocalPlaceholder localPlaceholder = | 248 LocalPlaceholder localPlaceholder = |
| 243 functionLocals.putIfAbsent(identifier, | 249 currentLocalPlaceholders.putIfAbsent(identifier, |
| 244 () => new LocalPlaceholder(currentElement, identifier)); | 250 () { |
| 245 placeholders[node] = localPlaceholder; | 251 LocalPlaceholder localPlaceholder = |
| 252 new LocalPlaceholder(identifier); |
| 253 localPlaceholders.putIfAbsent(currentElement, |
| 254 () => new Set<LocalPlaceholder>()).add(localPlaceholder); |
| 255 return localPlaceholder; |
| 256 }); |
| 246 } | 257 } |
| 247 | 258 |
| 248 void internalError(String reason, [Node node]) { | 259 void internalError(String reason, [Node node]) { |
| 249 compiler.cancel(reason: reason, node: node); | 260 compiler.cancel(reason: reason, node: node); |
| 250 } | 261 } |
| 251 | 262 |
| 252 visit(Node node) => (node === null) ? null : node.accept(this); | 263 visit(Node node) => (node === null) ? null : node.accept(this); |
| 253 | 264 |
| 254 visitNode(Node node) { node.visitChildren(this); } // We must go deeper. | 265 visitNode(Node node) { node.visitChildren(this); } // We must go deeper. |
| 255 | 266 |
| (...skipping 114 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 370 if (element is FunctionElement && element !== currentElement) { | 381 if (element is FunctionElement && element !== currentElement) { |
| 371 if (node.name !== null) { | 382 if (node.name !== null) { |
| 372 assert(node.name is Identifier); | 383 assert(node.name is Identifier); |
| 373 tryMakeLocalPlaceholder(element, node.name); | 384 tryMakeLocalPlaceholder(element, node.name); |
| 374 } | 385 } |
| 375 } | 386 } |
| 376 } | 387 } |
| 377 node.visitChildren(this); | 388 node.visitChildren(this); |
| 378 } | 389 } |
| 379 } | 390 } |
| OLD | NEW |