| 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 part of dart_backend; | 5 part of dart_backend; |
| 6 | 6 |
| 7 class LocalPlaceholder { | 7 class LocalPlaceholder { |
| 8 final String identifier; | 8 final String identifier; |
| 9 final Set<Node> nodes; | 9 final Set<Node> nodes; |
| 10 LocalPlaceholder(this.identifier) : nodes = new Set<Node>(); | 10 LocalPlaceholder(this.identifier) : nodes = new Set<Node>(); |
| 11 int get hashCode => identifier.hashCode; | 11 int get hashCode => identifier.hashCode; |
| 12 String toString() => | 12 String toString() => 'local_placeholder[id($identifier), nodes($nodes)]'; |
| 13 'local_placeholder[id($identifier), nodes($nodes)]'; | |
| 14 } | 13 } |
| 15 | 14 |
| 16 class FunctionScope { | 15 class FunctionScope { |
| 17 final Set<String> parameterIdentifiers; | 16 final Set<String> parameterIdentifiers; |
| 18 final Set<LocalPlaceholder> localPlaceholders; | 17 final Set<LocalPlaceholder> localPlaceholders; |
| 19 FunctionScope() | 18 FunctionScope() |
| 20 : parameterIdentifiers = new Set<String>(), | 19 : parameterIdentifiers = new Set<String>(), |
| 21 localPlaceholders = new Set<LocalPlaceholder>(); | 20 localPlaceholders = new Set<LocalPlaceholder>(); |
| 22 void registerParameter(Identifier node) { | 21 void registerParameter(Identifier node) { |
| 23 parameterIdentifiers.add(node.source); | 22 parameterIdentifiers.add(node.source); |
| 24 } | 23 } |
| 25 } | 24 } |
| 26 | 25 |
| 27 class ConstructorPlaceholder { | 26 class ConstructorPlaceholder { |
| 28 final Identifier node; | 27 final Identifier node; |
| 29 final ConstructorElement element; | 28 final ConstructorElement element; |
| 30 | 29 |
| 31 ConstructorPlaceholder(this.node, this.element); | 30 ConstructorPlaceholder(this.node, this.element); |
| (...skipping 94 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 126 collector.tryMakeLocalPlaceholder(element, node.selector); | 125 collector.tryMakeLocalPlaceholder(element, node.selector); |
| 127 } else { | 126 } else { |
| 128 assert(node.selector is FunctionExpression); | 127 assert(node.selector is FunctionExpression); |
| 129 } | 128 } |
| 130 } | 129 } |
| 131 } | 130 } |
| 132 } | 131 } |
| 133 | 132 |
| 134 visitStaticSend(Send node) { | 133 visitStaticSend(Send node) { |
| 135 Element element = elements[node]; | 134 Element element = elements[node]; |
| 136 collector.mirrorRenamer.registerStaticSend( | 135 collector.mirrorRenamer |
| 137 collector.currentElement, element, node); | 136 .registerStaticSend(collector.currentElement, element, node); |
| 138 | 137 |
| 139 if (Elements.isUnresolved(element) | 138 if (Elements.isUnresolved(element) || element.isDeferredLoaderGetter) { |
| 140 || element.isDeferredLoaderGetter) { | |
| 141 return; | 139 return; |
| 142 } | 140 } |
| 143 if (element.isConstructor || element.isFactoryConstructor) { | 141 if (element.isConstructor || element.isFactoryConstructor) { |
| 144 // Rename named constructor in redirection position: | 142 // Rename named constructor in redirection position: |
| 145 // class C { C.named(); C.redirecting() : this.named(); } | 143 // class C { C.named(); C.redirecting() : this.named(); } |
| 146 if (node.receiver is Identifier | 144 if (node.receiver is Identifier && |
| 147 && node.receiver.asIdentifier().isThis()) { | 145 node.receiver.asIdentifier().isThis()) { |
| 148 assert(node.selector is Identifier); | 146 assert(node.selector is Identifier); |
| 149 collector.tryMakeConstructorPlaceholder(node, element); | 147 collector.tryMakeConstructorPlaceholder(node, element); |
| 150 } | 148 } |
| 151 return; | 149 return; |
| 152 } | 150 } |
| 153 collector.makeElementPlaceholder(node.selector, element); | 151 collector.makeElementPlaceholder(node.selector, element); |
| 154 // Another ugly case: <lib prefix>.<top level> is represented as | 152 // Another ugly case: <lib prefix>.<top level> is represented as |
| 155 // receiver: lib prefix, selector: top level. | 153 // receiver: lib prefix, selector: top level. |
| 156 if (element.isTopLevel && node.receiver != null) { | 154 if (element.isTopLevel && node.receiver != null) { |
| 157 assert(elements[node.receiver].isPrefix); | 155 assert(elements[node.receiver].isPrefix); |
| (...skipping 13 matching lines...) Expand all Loading... |
| 171 | 169 |
| 172 class PlaceholderCollector extends Visitor { | 170 class PlaceholderCollector extends Visitor { |
| 173 final DiagnosticReporter reporter; | 171 final DiagnosticReporter reporter; |
| 174 final MirrorRenamer mirrorRenamer; | 172 final MirrorRenamer mirrorRenamer; |
| 175 final FunctionElement mainFunction; | 173 final FunctionElement mainFunction; |
| 176 final Set<String> fixedMemberNames; // member names which cannot be renamed. | 174 final Set<String> fixedMemberNames; // member names which cannot be renamed. |
| 177 final Map<Element, ElementAst> elementAsts; | 175 final Map<Element, ElementAst> elementAsts; |
| 178 final Set<Node> prefixNodesToErase = new Set<Node>(); | 176 final Set<Node> prefixNodesToErase = new Set<Node>(); |
| 179 final Set<Node> unresolvedNodes = new Set<Node>(); | 177 final Set<Node> unresolvedNodes = new Set<Node>(); |
| 180 final Map<Element, Set<Node>> elementNodes = new Map<Element, Set<Node>>(); | 178 final Map<Element, Set<Node>> elementNodes = new Map<Element, Set<Node>>(); |
| 181 final Map<FunctionElement, FunctionScope> functionScopes | 179 final Map<FunctionElement, FunctionScope> functionScopes = |
| 182 = new Map<FunctionElement, FunctionScope>(); | 180 new Map<FunctionElement, FunctionScope>(); |
| 183 final Map<LibraryElement, Set<Identifier>> privateNodes = | 181 final Map<LibraryElement, Set<Identifier>> privateNodes = |
| 184 new Map<LibraryElement, Set<Identifier>>(); | 182 new Map<LibraryElement, Set<Identifier>>(); |
| 185 final List<DeclarationTypePlaceholder> declarationTypePlaceholders | 183 final List<DeclarationTypePlaceholder> declarationTypePlaceholders = |
| 186 = new List<DeclarationTypePlaceholder>(); | 184 new List<DeclarationTypePlaceholder>(); |
| 187 final Map<String, Set<Identifier>> memberPlaceholders | 185 final Map<String, Set<Identifier>> memberPlaceholders = |
| 188 = new Map<String, Set<Identifier>>(); | 186 new Map<String, Set<Identifier>>(); |
| 189 final List<ConstructorPlaceholder> constructorPlaceholders | 187 final List<ConstructorPlaceholder> constructorPlaceholders = |
| 190 = new List<ConstructorPlaceholder>(); | 188 new List<ConstructorPlaceholder>(); |
| 191 Map<String, LocalPlaceholder> currentLocalPlaceholders; | 189 Map<String, LocalPlaceholder> currentLocalPlaceholders; |
| 192 Element currentElement; | 190 Element currentElement; |
| 193 FunctionElement topmostEnclosingFunction; | 191 FunctionElement topmostEnclosingFunction; |
| 194 TreeElements treeElements; | 192 TreeElements treeElements; |
| 195 | 193 |
| 196 get currentFunctionScope => functionScopes.putIfAbsent( | 194 get currentFunctionScope => functionScopes.putIfAbsent( |
| 197 topmostEnclosingFunction, () => new FunctionScope()); | 195 topmostEnclosingFunction, () => new FunctionScope()); |
| 198 | 196 |
| 199 PlaceholderCollector(this.reporter, this.mirrorRenamer, | 197 PlaceholderCollector(this.reporter, this.mirrorRenamer, this.fixedMemberNames, |
| 200 this.fixedMemberNames, this.elementAsts, | 198 this.elementAsts, this.mainFunction); |
| 201 this.mainFunction); | |
| 202 | 199 |
| 203 void collectFunctionDeclarationPlaceholders( | 200 void collectFunctionDeclarationPlaceholders( |
| 204 FunctionElement element, FunctionExpression node) { | 201 FunctionElement element, FunctionExpression node) { |
| 205 if (element.isConstructor) { | 202 if (element.isConstructor) { |
| 206 ConstructorElement constructor = element; | 203 ConstructorElement constructor = element; |
| 207 tryMakeConstructorPlaceholder(node.name, element); | 204 tryMakeConstructorPlaceholder(node.name, element); |
| 208 RedirectingFactoryBody bodyAsRedirectingFactoryBody = | 205 RedirectingFactoryBody bodyAsRedirectingFactoryBody = |
| 209 node.body.asRedirectingFactoryBody(); | 206 node.body.asRedirectingFactoryBody(); |
| 210 if (bodyAsRedirectingFactoryBody != null) { | 207 if (bodyAsRedirectingFactoryBody != null) { |
| 211 // Factory redirection. | 208 // Factory redirection. |
| 212 FunctionElement redirectTarget = constructor.immediateRedirectionTarget; | 209 FunctionElement redirectTarget = constructor.immediateRedirectionTarget; |
| 213 assert(redirectTarget != null && redirectTarget != element); | 210 assert(redirectTarget != null && redirectTarget != element); |
| 214 tryMakeConstructorPlaceholder( | 211 tryMakeConstructorPlaceholder( |
| 215 bodyAsRedirectingFactoryBody.constructorReference, | 212 bodyAsRedirectingFactoryBody.constructorReference, redirectTarget); |
| 216 redirectTarget); | |
| 217 } | 213 } |
| 218 } else if (Elements.isStaticOrTopLevel(element)) { | 214 } else if (Elements.isStaticOrTopLevel(element)) { |
| 219 // Note: this code should only rename private identifiers for class' | 215 // Note: this code should only rename private identifiers for class' |
| 220 // fields/getters/setters/methods. Top-level identifiers are renamed | 216 // fields/getters/setters/methods. Top-level identifiers are renamed |
| 221 // just to escape conflicts and that should be enough as we shouldn't | 217 // just to escape conflicts and that should be enough as we shouldn't |
| 222 // be able to resolve private identifiers for other libraries. | 218 // be able to resolve private identifiers for other libraries. |
| 223 makeElementPlaceholder(node.name, element); | 219 makeElementPlaceholder(node.name, element); |
| 224 } else if (element.isClassMember) { | 220 } else if (element.isClassMember) { |
| 225 if (node.name is Identifier) { | 221 if (node.name is Identifier) { |
| 226 tryMakeMemberPlaceholder(node.name); | 222 tryMakeMemberPlaceholder(node.name); |
| (...skipping 47 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 274 void tryMakeLocalPlaceholder(Element element, Identifier node) { | 270 void tryMakeLocalPlaceholder(Element element, Identifier node) { |
| 275 bool isNamedOptionalParameter() { | 271 bool isNamedOptionalParameter() { |
| 276 FunctionTypedElement function = element.enclosingElement; | 272 FunctionTypedElement function = element.enclosingElement; |
| 277 FunctionSignature signature = function.functionSignature; | 273 FunctionSignature signature = function.functionSignature; |
| 278 if (!signature.optionalParametersAreNamed) return false; | 274 if (!signature.optionalParametersAreNamed) return false; |
| 279 for (Element parameter in signature.optionalParameters) { | 275 for (Element parameter in signature.optionalParameters) { |
| 280 if (identical(parameter, element)) return true; | 276 if (identical(parameter, element)) return true; |
| 281 } | 277 } |
| 282 return false; | 278 return false; |
| 283 } | 279 } |
| 284 if (element.isParameter && !isTypedefParameter(element) && | 280 if (element.isParameter && |
| 281 !isTypedefParameter(element) && |
| 285 isNamedOptionalParameter()) { | 282 isNamedOptionalParameter()) { |
| 286 currentFunctionScope.registerParameter(node); | 283 currentFunctionScope.registerParameter(node); |
| 287 } else if (Elements.isLocal(element) && !isTypedefParameter(element)) { | 284 } else if (Elements.isLocal(element) && !isTypedefParameter(element)) { |
| 288 makeLocalPlaceholder(node); | 285 makeLocalPlaceholder(node); |
| 289 } | 286 } |
| 290 } | 287 } |
| 291 | 288 |
| 292 void tryMakeMemberPlaceholder(Identifier node) { | 289 void tryMakeMemberPlaceholder(Identifier node) { |
| 293 assert(node != null); | 290 assert(node != null); |
| 294 if (node is Operator) return; | 291 if (node is Operator) return; |
| 295 String identifier = node.source; | 292 String identifier = node.source; |
| 296 if (fixedMemberNames.contains(identifier)) return; | 293 if (fixedMemberNames.contains(identifier)) return; |
| 297 memberPlaceholders.putIfAbsent( | 294 memberPlaceholders |
| 298 identifier, () => new Set<Identifier>()).add(node); | 295 .putIfAbsent(identifier, () => new Set<Identifier>()) |
| 296 .add(node); |
| 299 } | 297 } |
| 300 | 298 |
| 301 void makeTypePlaceholder(Node node, DartType type) { | 299 void makeTypePlaceholder(Node node, DartType type) { |
| 302 Send send = node.asSend(); | 300 Send send = node.asSend(); |
| 303 if (send != null) { | 301 if (send != null) { |
| 304 // Prefix. | 302 // Prefix. |
| 305 assert(send.receiver is Identifier); | 303 assert(send.receiver is Identifier); |
| 306 assert(send.selector is Identifier); | 304 assert(send.selector is Identifier); |
| 307 makeErasePrefixPlaceholder(send.receiver); | 305 makeErasePrefixPlaceholder(send.receiver); |
| 308 node = send.selector; | 306 node = send.selector; |
| 309 } | 307 } |
| 310 makeElementPlaceholder(node, type.element); | 308 makeElementPlaceholder(node, type.element); |
| 311 } | 309 } |
| 312 | 310 |
| 313 void makeTypeVariablePlaceholder(Node node, TypeVariableType type) { | 311 void makeTypeVariablePlaceholder(Node node, TypeVariableType type) { |
| 314 Send send = node.asSend(); | 312 Send send = node.asSend(); |
| 315 if (send != null) { | 313 if (send != null) { |
| 316 // Prefix. | 314 // Prefix. |
| 317 assert(send.receiver is Identifier); | 315 assert(send.receiver is Identifier); |
| 318 assert(send.selector is Identifier); | 316 assert(send.selector is Identifier); |
| 319 makeErasePrefixPlaceholder(send.receiver); | 317 makeErasePrefixPlaceholder(send.receiver); |
| 320 node = send.selector; | 318 node = send.selector; |
| 321 } | 319 } |
| 322 tryMakeMemberPlaceholder(node); | 320 tryMakeMemberPlaceholder(node); |
| 323 } | 321 } |
| 324 | 322 |
| 325 void makeOmitDeclarationTypePlaceholder(TypeAnnotation type) { | 323 void makeOmitDeclarationTypePlaceholder(TypeAnnotation type) { |
| 326 if (type == null) return; | 324 if (type == null) return; |
| 327 declarationTypePlaceholders.add( | 325 declarationTypePlaceholders |
| 328 new DeclarationTypePlaceholder(type, false)); | 326 .add(new DeclarationTypePlaceholder(type, false)); |
| 329 } | 327 } |
| 330 | 328 |
| 331 void makeVarDeclarationTypePlaceholder(VariableDefinitions node) { | 329 void makeVarDeclarationTypePlaceholder(VariableDefinitions node) { |
| 332 // TODO(smok): Maybe instead of calling this method and | 330 // TODO(smok): Maybe instead of calling this method and |
| 333 // makeDeclaratioTypePlaceholder have type declaration placeholder | 331 // makeDeclaratioTypePlaceholder have type declaration placeholder |
| 334 // collector logic in visitVariableDefinitions when resolver becomes better | 332 // collector logic in visitVariableDefinitions when resolver becomes better |
| 335 // and/or catch syntax changes. | 333 // and/or catch syntax changes. |
| 336 if (node.type == null) return; | 334 if (node.type == null) return; |
| 337 bool requiresVar = !node.modifiers.isFinalOrConst; | 335 bool requiresVar = !node.modifiers.isFinalOrConst; |
| 338 declarationTypePlaceholders.add( | 336 declarationTypePlaceholders |
| 339 new DeclarationTypePlaceholder(node.type, requiresVar)); | 337 .add(new DeclarationTypePlaceholder(node.type, requiresVar)); |
| 340 } | 338 } |
| 341 | 339 |
| 342 /// Marks [node] to be erased in the output. | 340 /// Marks [node] to be erased in the output. |
| 343 /// This is done for library prefixes because they are not used in the output | 341 /// This is done for library prefixes because they are not used in the output |
| 344 /// because all imports are flattened and conflicts are renamed away. | 342 /// because all imports are flattened and conflicts are renamed away. |
| 345 void makeErasePrefixPlaceholder(Node node) { | 343 void makeErasePrefixPlaceholder(Node node) { |
| 346 assert(node is Identifier || node is Send); | 344 assert(node is Identifier || node is Send); |
| 347 prefixNodesToErase.add(node); | 345 prefixNodesToErase.add(node); |
| 348 } | 346 } |
| 349 | 347 |
| (...skipping 21 matching lines...) Expand all Loading... |
| 371 elementNodes.putIfAbsent(element, () => new Set<Node>()).add(node); | 369 elementNodes.putIfAbsent(element, () => new Set<Node>()).add(node); |
| 372 } | 370 } |
| 373 | 371 |
| 374 /// Marks [node] to be renamed per-library if it names an instance member | 372 /// Marks [node] to be renamed per-library if it names an instance member |
| 375 /// and has a private name. | 373 /// and has a private name. |
| 376 void tryMakePrivateIdentifier(Node node, Element element) { | 374 void tryMakePrivateIdentifier(Node node, Element element) { |
| 377 if (node is Identifier && | 375 if (node is Identifier && |
| 378 !Elements.isStaticOrTopLevel(element) && | 376 !Elements.isStaticOrTopLevel(element) && |
| 379 !Elements.isLocal(element) && | 377 !Elements.isLocal(element) && |
| 380 Name.isPrivateName(node.source)) { | 378 Name.isPrivateName(node.source)) { |
| 381 privateNodes.putIfAbsent( | 379 privateNodes |
| 382 currentElement.library, () => new Set<Identifier>()).add(node); | 380 .putIfAbsent(currentElement.library, () => new Set<Identifier>()) |
| 381 .add(node); |
| 383 } | 382 } |
| 384 } | 383 } |
| 385 | 384 |
| 386 void makeUnresolvedPlaceholder(Node node) { | 385 void makeUnresolvedPlaceholder(Node node) { |
| 387 unresolvedNodes.add(node); | 386 unresolvedNodes.add(node); |
| 388 } | 387 } |
| 389 | 388 |
| 390 void makeLocalPlaceholder(Identifier identifier) { | 389 void makeLocalPlaceholder(Identifier identifier) { |
| 391 LocalPlaceholder getLocalPlaceholder() { | 390 LocalPlaceholder getLocalPlaceholder() { |
| 392 String name = identifier.source; | 391 String name = identifier.source; |
| (...skipping 29 matching lines...) Expand all Loading... |
| 422 // First deconstruct the constructor, there are 4 possibilities: | 421 // First deconstruct the constructor, there are 4 possibilities: |
| 423 // ClassName() | 422 // ClassName() |
| 424 // prefix.ClassName() | 423 // prefix.ClassName() |
| 425 // ClassName.constructorName() | 424 // ClassName.constructorName() |
| 426 // prefix.ClassName.constructorName() | 425 // prefix.ClassName.constructorName() |
| 427 if (node is Send) { | 426 if (node is Send) { |
| 428 if (node.receiver is Send) { | 427 if (node.receiver is Send) { |
| 429 Send receiver = node.receiver; | 428 Send receiver = node.receiver; |
| 430 // prefix.ClassName.constructorName() | 429 // prefix.ClassName.constructorName() |
| 431 assert(treeElements[receiver.receiver] != null && | 430 assert(treeElements[receiver.receiver] != null && |
| 432 treeElements[receiver.receiver].isPrefix); | 431 treeElements[receiver.receiver].isPrefix); |
| 433 prefix = receiver.receiver; | 432 prefix = receiver.receiver; |
| 434 className = receiver.selector; | 433 className = receiver.selector; |
| 435 constructorName = node.selector; | 434 constructorName = node.selector; |
| 436 } else { | 435 } else { |
| 437 Element receiverElement = treeElements[node.receiver]; | 436 Element receiverElement = treeElements[node.receiver]; |
| 438 if (receiverElement != null && receiverElement.isPrefix) { | 437 if (receiverElement != null && receiverElement.isPrefix) { |
| 439 // prefix.ClassName() | 438 // prefix.ClassName() |
| 440 prefix = node.receiver; | 439 prefix = node.receiver; |
| 441 className = node.selector; | 440 className = node.selector; |
| 442 } else { | 441 } else { |
| (...skipping 18 matching lines...) Expand all Loading... |
| 461 } else if (className.isThis() || className.isSuper()) { | 460 } else if (className.isThis() || className.isSuper()) { |
| 462 // Do not rename super and this. | 461 // Do not rename super and this. |
| 463 } else if (className is Identifier) { | 462 } else if (className is Identifier) { |
| 464 makeElementPlaceholder(className, element.contextClass); | 463 makeElementPlaceholder(className, element.contextClass); |
| 465 } else { | 464 } else { |
| 466 throw "Bad type of constructor name $className"; | 465 throw "Bad type of constructor name $className"; |
| 467 } | 466 } |
| 468 | 467 |
| 469 if (constructorName != null) { | 468 if (constructorName != null) { |
| 470 Element definingConstructor = findDefiningConstructor(element); | 469 Element definingConstructor = findDefiningConstructor(element); |
| 471 constructorPlaceholders.add(new ConstructorPlaceholder(constructorName, | 470 constructorPlaceholders.add( |
| 472 definingConstructor)); | 471 new ConstructorPlaceholder(constructorName, definingConstructor)); |
| 473 tryMakePrivateIdentifier(constructorName, element); | 472 tryMakePrivateIdentifier(constructorName, element); |
| 474 } | 473 } |
| 475 } | 474 } |
| 476 | 475 |
| 477 void internalError(String reason, {Node node}) { | 476 void internalError(String reason, {Node node}) { |
| 478 reporter.internalError(node, reason); | 477 reporter.internalError(node, reason); |
| 479 } | 478 } |
| 480 | 479 |
| 481 visit(Node node) => (node == null) ? null : node.accept(this); | 480 visit(Node node) => (node == null) ? null : node.accept(this); |
| 482 | 481 |
| 483 visitNode(Node node) { node.visitChildren(this); } // We must go deeper. | 482 visitNode(Node node) { |
| 483 node.visitChildren(this); |
| 484 } // We must go deeper. |
| 484 | 485 |
| 485 visitNewExpression(NewExpression node) { | 486 visitNewExpression(NewExpression node) { |
| 486 Send send = node.send; | 487 Send send = node.send; |
| 487 DartType type = treeElements.getType(node); | 488 DartType type = treeElements.getType(node); |
| 488 assert(type != null); | 489 assert(type != null); |
| 489 Element constructor = treeElements[send]; | 490 Element constructor = treeElements[send]; |
| 490 assert(constructor != null); | 491 assert(constructor != null); |
| 491 assert(send.receiver == null); | 492 assert(send.receiver == null); |
| 492 if (!Elements.isMalformed(constructor)) { | 493 if (!Elements.isMalformed(constructor)) { |
| 493 tryMakeConstructorPlaceholder(node.send.selector, constructor); | 494 tryMakeConstructorPlaceholder(node.send.selector, constructor); |
| (...skipping 43 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 537 // that is needed to rename the construct properly. | 538 // that is needed to rename the construct properly. |
| 538 element = treeElements[send.selector]; | 539 element = treeElements[send.selector]; |
| 539 } | 540 } |
| 540 tryMakePrivateIdentifier(send.selector, element); | 541 tryMakePrivateIdentifier(send.selector, element); |
| 541 if (element == null) { | 542 if (element == null) { |
| 542 if (send.receiver != null) tryMakeMemberPlaceholder(send.selector); | 543 if (send.receiver != null) tryMakeMemberPlaceholder(send.selector); |
| 543 } else if (!element.isMalformed) { | 544 } else if (!element.isMalformed) { |
| 544 if (Elements.isStaticOrTopLevel(element)) { | 545 if (Elements.isStaticOrTopLevel(element)) { |
| 545 // TODO(smok): Worth investigating why sometimes we get getter/setter | 546 // TODO(smok): Worth investigating why sometimes we get getter/setter |
| 546 // here and sometimes abstract field. | 547 // here and sometimes abstract field. |
| 547 assert(element.isClass || element is VariableElement || | 548 assert(element.isClass || |
| 548 element.isAccessor || element.isAbstractField || | 549 element is VariableElement || |
| 549 element.isFunction || element.isTypedef || | 550 element.isAccessor || |
| 550 element is TypeVariableElement); | 551 element.isAbstractField || |
| 552 element.isFunction || |
| 553 element.isTypedef || |
| 554 element is TypeVariableElement); |
| 551 makeElementPlaceholder(send.selector, element); | 555 makeElementPlaceholder(send.selector, element); |
| 552 } else { | 556 } else { |
| 553 Identifier identifier = send.selector.asIdentifier(); | 557 Identifier identifier = send.selector.asIdentifier(); |
| 554 if (identifier == null) { | 558 if (identifier == null) { |
| 555 // Handle optional function expression parameters with default values. | 559 // Handle optional function expression parameters with default values. |
| 556 identifier = send.selector.asFunctionExpression().name; | 560 identifier = send.selector.asFunctionExpression().name; |
| 557 } | 561 } |
| 558 if (Elements.isInstanceField(element)) { | 562 if (Elements.isInstanceField(element)) { |
| 559 tryMakeMemberPlaceholder(identifier); | 563 tryMakeMemberPlaceholder(identifier); |
| 560 } else { | 564 } else { |
| (...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 593 // definitionElement may be null if we're inside variable definitions | 597 // definitionElement may be null if we're inside variable definitions |
| 594 // of a function that is a parameter of another function. | 598 // of a function that is a parameter of another function. |
| 595 // TODO(smok): Fix this when resolver correctly deals with | 599 // TODO(smok): Fix this when resolver correctly deals with |
| 596 // such cases. | 600 // such cases. |
| 597 if (definitionElement == null) continue; | 601 if (definitionElement == null) continue; |
| 598 | 602 |
| 599 Send send = definition.asSend(); | 603 Send send = definition.asSend(); |
| 600 Identifier identifier = definition is Identifier | 604 Identifier identifier = definition is Identifier |
| 601 ? definition | 605 ? definition |
| 602 : definition is Send | 606 : definition is Send |
| 603 ? (send.selector is Identifier | 607 ? (send.selector is Identifier ? send.selector : null) |
| 604 ? send.selector | |
| 605 : null) | |
| 606 : null; | 608 : null; |
| 607 | 609 |
| 608 tryMakePrivateIdentifier(identifier, definitionElement); | 610 tryMakePrivateIdentifier(identifier, definitionElement); |
| 609 | 611 |
| 610 if (send != null) { | 612 if (send != null) { |
| 611 // May get FunctionExpression here in definition.selector | 613 // May get FunctionExpression here in definition.selector |
| 612 // in case of A(int this.f()); | 614 // in case of A(int this.f()); |
| 613 if (send.selector is Identifier) { | 615 if (send.selector is Identifier) { |
| 614 if (definitionElement.isInitializingFormal) { | 616 if (definitionElement.isInitializingFormal) { |
| 615 tryMakeMemberPlaceholder(send.selector); | 617 tryMakeMemberPlaceholder(send.selector); |
| 616 } else { | 618 } else { |
| 617 tryMakeLocalPlaceholder(definitionElement, send.selector); | 619 tryMakeLocalPlaceholder(definitionElement, send.selector); |
| 618 } | 620 } |
| 619 } else { | 621 } else { |
| 620 assert(send.selector is FunctionExpression); | 622 assert(send.selector is FunctionExpression); |
| 621 if (definitionElement.isInitializingFormal) { | 623 if (definitionElement.isInitializingFormal) { |
| 622 tryMakeMemberPlaceholder( | 624 tryMakeMemberPlaceholder(send.selector.asFunctionExpression().name); |
| 623 send.selector.asFunctionExpression().name); | |
| 624 } | 625 } |
| 625 } | 626 } |
| 626 } else if (definition is Identifier) { | 627 } else if (definition is Identifier) { |
| 627 tryMakeLocalPlaceholder(definitionElement, definition); | 628 tryMakeLocalPlaceholder(definitionElement, definition); |
| 628 } else if (definition is FunctionExpression) { | 629 } else if (definition is FunctionExpression) { |
| 629 // Skip, it will be processed in visitFunctionExpression. | 630 // Skip, it will be processed in visitFunctionExpression. |
| 630 } else { | 631 } else { |
| 631 internalError('Unexpected definition structure $definition'); | 632 internalError('Unexpected definition structure $definition'); |
| 632 } | 633 } |
| 633 } | 634 } |
| (...skipping 80 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 714 | 715 |
| 715 visitBlock(Block node) { | 716 visitBlock(Block node) { |
| 716 for (Node statement in node.statements.nodes) { | 717 for (Node statement in node.statements.nodes) { |
| 717 if (statement is VariableDefinitions) { | 718 if (statement is VariableDefinitions) { |
| 718 makeVarDeclarationTypePlaceholder(statement); | 719 makeVarDeclarationTypePlaceholder(statement); |
| 719 } | 720 } |
| 720 } | 721 } |
| 721 node.visitChildren(this); | 722 node.visitChildren(this); |
| 722 } | 723 } |
| 723 } | 724 } |
| OLD | NEW |