| OLD | NEW |
| 1 // Copyright (c) 2016, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2016, 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 library analyzer.src.generated.declaration_resolver; | 5 library analyzer.src.generated.declaration_resolver; |
| 6 | 6 |
| 7 import 'package:analyzer/dart/ast/ast.dart'; | 7 import 'package:analyzer/dart/ast/ast.dart'; |
| 8 import 'package:analyzer/dart/ast/token.dart'; | 8 import 'package:analyzer/dart/ast/token.dart'; |
| 9 import 'package:analyzer/dart/ast/visitor.dart'; | 9 import 'package:analyzer/dart/ast/visitor.dart'; |
| 10 import 'package:analyzer/dart/element/element.dart'; | 10 import 'package:analyzer/dart/element/element.dart'; |
| 11 import 'package:analyzer/dart/element/type.dart'; |
| 11 import 'package:analyzer/exception/exception.dart'; | 12 import 'package:analyzer/exception/exception.dart'; |
| 12 import 'package:analyzer/src/dart/ast/ast.dart'; | 13 import 'package:analyzer/src/dart/ast/ast.dart'; |
| 13 import 'package:analyzer/src/dart/element/builder.dart'; | 14 import 'package:analyzer/src/dart/element/builder.dart'; |
| 14 import 'package:analyzer/src/dart/element/element.dart'; | 15 import 'package:analyzer/src/dart/element/element.dart'; |
| 15 import 'package:analyzer/src/dart/element/type.dart'; | 16 import 'package:analyzer/src/dart/element/type.dart'; |
| 16 import 'package:analyzer/src/generated/resolver.dart'; | 17 import 'package:analyzer/src/generated/resolver.dart'; |
| 17 | 18 |
| 18 /** | 19 /** |
| 19 * A visitor that resolves declarations in an AST structure to already built | 20 * A visitor that resolves declarations in an AST structure to already built |
| 20 * elements. | 21 * elements. |
| (...skipping 197 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 218 if (_walker.element is ExecutableElement) { | 219 if (_walker.element is ExecutableElement) { |
| 219 element = _match(functionName, _walker.getFunction()); | 220 element = _match(functionName, _walker.getFunction()); |
| 220 } else if (property.keyword == Keyword.GET) { | 221 } else if (property.keyword == Keyword.GET) { |
| 221 element = _match(functionName, _walker.getAccessor()); | 222 element = _match(functionName, _walker.getAccessor()); |
| 222 } else { | 223 } else { |
| 223 assert(property.keyword == Keyword.SET); | 224 assert(property.keyword == Keyword.SET); |
| 224 element = _match(functionName, _walker.getAccessor(), | 225 element = _match(functionName, _walker.getAccessor(), |
| 225 elementName: functionName.name + '='); | 226 elementName: functionName.name + '='); |
| 226 } | 227 } |
| 227 } | 228 } |
| 229 _setGenericFunctionType(node.returnType, element.returnType); |
| 228 node.functionExpression.element = element; | 230 node.functionExpression.element = element; |
| 229 _walker._elementHolder?.addFunction(element); | 231 _walker._elementHolder?.addFunction(element); |
| 230 _walk(new ElementWalker.forExecutable(element, _enclosingUnit), () { | 232 _walk(new ElementWalker.forExecutable(element, _enclosingUnit), () { |
| 231 super.visitFunctionDeclaration(node); | 233 super.visitFunctionDeclaration(node); |
| 232 }); | 234 }); |
| 233 _resolveMetadata(node, node.metadata, element); | 235 _resolveMetadata(node, node.metadata, element); |
| 234 return null; | 236 return null; |
| 235 } | 237 } |
| 236 | 238 |
| 237 @override | 239 @override |
| (...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 271 _resolveMetadata(node, node.metadata, element); | 273 _resolveMetadata(node, node.metadata, element); |
| 272 return null; | 274 return null; |
| 273 } else { | 275 } else { |
| 274 return super.visitFunctionTypedFormalParameter(node); | 276 return super.visitFunctionTypedFormalParameter(node); |
| 275 } | 277 } |
| 276 } | 278 } |
| 277 | 279 |
| 278 @override | 280 @override |
| 279 Object visitGenericFunctionType(GenericFunctionType node) { | 281 Object visitGenericFunctionType(GenericFunctionType node) { |
| 280 GenericFunctionTypeElement element = node.type.element; | 282 GenericFunctionTypeElement element = node.type.element; |
| 283 _setGenericFunctionType(node.returnType, element.returnType); |
| 281 _walk(new ElementWalker.forGenericFunctionType(element), () { | 284 _walk(new ElementWalker.forGenericFunctionType(element), () { |
| 282 super.visitGenericFunctionType(node); | 285 super.visitGenericFunctionType(node); |
| 283 }); | 286 }); |
| 284 return null; | 287 return null; |
| 285 } | 288 } |
| 286 | 289 |
| 287 @override | 290 @override |
| 288 Object visitGenericTypeAlias(GenericTypeAlias node) { | 291 Object visitGenericTypeAlias(GenericTypeAlias node) { |
| 289 GenericTypeAliasElementImpl element = | 292 GenericTypeAliasElementImpl element = |
| 290 _match(node.name, _walker.getTypedef()); | 293 _match(node.name, _walker.getTypedef()); |
| 291 (node.functionType as GenericFunctionTypeImpl)?.type = | 294 _setGenericFunctionType(node.functionType, element.function?.type); |
| 292 element.function?.type; | |
| 293 _walk(new ElementWalker.forGenericTypeAlias(element), () { | 295 _walk(new ElementWalker.forGenericTypeAlias(element), () { |
| 294 super.visitGenericTypeAlias(node); | 296 super.visitGenericTypeAlias(node); |
| 295 }); | 297 }); |
| 296 _resolveMetadata(node, node.metadata, element); | 298 _resolveMetadata(node, node.metadata, element); |
| 297 return null; | 299 return null; |
| 298 } | 300 } |
| 299 | 301 |
| 300 @override | 302 @override |
| 301 Object visitImportDirective(ImportDirective node) { | 303 Object visitImportDirective(ImportDirective node) { |
| 302 super.visitImportDirective(node); | 304 super.visitImportDirective(node); |
| (...skipping 47 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 350 _match(methodName, _walker.getFunction(), elementName: elementName); | 352 _match(methodName, _walker.getFunction(), elementName: elementName); |
| 351 } else { | 353 } else { |
| 352 if (property.keyword == Keyword.GET) { | 354 if (property.keyword == Keyword.GET) { |
| 353 element = _match(methodName, _walker.getAccessor()); | 355 element = _match(methodName, _walker.getAccessor()); |
| 354 } else { | 356 } else { |
| 355 assert(property.keyword == Keyword.SET); | 357 assert(property.keyword == Keyword.SET); |
| 356 element = _match(methodName, _walker.getAccessor(), | 358 element = _match(methodName, _walker.getAccessor(), |
| 357 elementName: nameOfMethod + '='); | 359 elementName: nameOfMethod + '='); |
| 358 } | 360 } |
| 359 } | 361 } |
| 362 _setGenericFunctionType(node.returnType, element.returnType); |
| 360 _walk(new ElementWalker.forExecutable(element, _enclosingUnit), () { | 363 _walk(new ElementWalker.forExecutable(element, _enclosingUnit), () { |
| 361 super.visitMethodDeclaration(node); | 364 super.visitMethodDeclaration(node); |
| 362 }); | 365 }); |
| 363 _resolveMetadata(node, node.metadata, element); | 366 _resolveMetadata(node, node.metadata, element); |
| 364 return null; | 367 return null; |
| 365 } | 368 } |
| 366 | 369 |
| 367 @override | 370 @override |
| 368 Object visitPartDirective(PartDirective node) { | 371 Object visitPartDirective(PartDirective node) { |
| 369 super.visitPartDirective(node); | 372 super.visitPartDirective(node); |
| (...skipping 16 matching lines...) Expand all Loading... |
| 386 node.element = _enclosingUnit.library; | 389 node.element = _enclosingUnit.library; |
| 387 return super.visitPartOfDirective(node); | 390 return super.visitPartOfDirective(node); |
| 388 } | 391 } |
| 389 | 392 |
| 390 @override | 393 @override |
| 391 Object visitSimpleFormalParameter(SimpleFormalParameter node) { | 394 Object visitSimpleFormalParameter(SimpleFormalParameter node) { |
| 392 if (node.parent is! DefaultFormalParameter) { | 395 if (node.parent is! DefaultFormalParameter) { |
| 393 ParameterElement element = | 396 ParameterElement element = |
| 394 _match(node.identifier, _walker.getParameter()); | 397 _match(node.identifier, _walker.getParameter()); |
| 395 (node as SimpleFormalParameterImpl).element = element; | 398 (node as SimpleFormalParameterImpl).element = element; |
| 396 TypeAnnotation type = node.type; | 399 _setGenericFunctionType(node.type, element.type); |
| 397 if (type is GenericFunctionTypeImpl) { | |
| 398 type.type = element.type; | |
| 399 } | |
| 400 _walk(new ElementWalker.forParameter(element), () { | 400 _walk(new ElementWalker.forParameter(element), () { |
| 401 super.visitSimpleFormalParameter(node); | 401 super.visitSimpleFormalParameter(node); |
| 402 }); | 402 }); |
| 403 _resolveMetadata(node, node.metadata, element); | 403 _resolveMetadata(node, node.metadata, element); |
| 404 return null; | 404 return null; |
| 405 } else { | 405 } else { |
| 406 return super.visitSimpleFormalParameter(node); | 406 return super.visitSimpleFormalParameter(node); |
| 407 } | 407 } |
| 408 } | 408 } |
| 409 | 409 |
| (...skipping 46 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 456 } else { | 456 } else { |
| 457 return super.visitVariableDeclaration(node); | 457 return super.visitVariableDeclaration(node); |
| 458 } | 458 } |
| 459 } | 459 } |
| 460 | 460 |
| 461 @override | 461 @override |
| 462 Object visitVariableDeclarationList(VariableDeclarationList node) { | 462 Object visitVariableDeclarationList(VariableDeclarationList node) { |
| 463 if (_walker.elementBuilder != null) { | 463 if (_walker.elementBuilder != null) { |
| 464 return _walker.elementBuilder.visitVariableDeclarationList(node); | 464 return _walker.elementBuilder.visitVariableDeclarationList(node); |
| 465 } else { | 465 } else { |
| 466 super.visitVariableDeclarationList(node); | 466 node.variables.accept(this); |
| 467 VariableElement firstVariable = node.variables[0].element; |
| 468 _setGenericFunctionType(node.type, firstVariable.type); |
| 469 node.type?.accept(this); |
| 467 if (node.parent is! FieldDeclaration && | 470 if (node.parent is! FieldDeclaration && |
| 468 node.parent is! TopLevelVariableDeclaration) { | 471 node.parent is! TopLevelVariableDeclaration) { |
| 469 _resolveMetadata(node, node.metadata, node.variables[0].element); | 472 _resolveMetadata(node, node.metadata, firstVariable); |
| 470 } | 473 } |
| 471 return null; | 474 return null; |
| 472 } | 475 } |
| 473 } | 476 } |
| 474 | 477 |
| 475 /** | 478 /** |
| 476 * Updates [identifier] to point to [element], after ensuring that the | 479 * Updates [identifier] to point to [element], after ensuring that the |
| 477 * element has the expected name. | 480 * element has the expected name. |
| 478 * | 481 * |
| 479 * If no [elementName] is given, it defaults to the name of the [identifier] | 482 * If no [elementName] is given, it defaults to the name of the [identifier] |
| (...skipping 51 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 531 * built. | 534 * built. |
| 532 */ | 535 */ |
| 533 void _resolveMetadata( | 536 void _resolveMetadata( |
| 534 AstNode parent, NodeList<Annotation> nodes, Element element) { | 537 AstNode parent, NodeList<Annotation> nodes, Element element) { |
| 535 if (element != null) { | 538 if (element != null) { |
| 536 _resolveAnnotations(parent, nodes, element.metadata); | 539 _resolveAnnotations(parent, nodes, element.metadata); |
| 537 } | 540 } |
| 538 } | 541 } |
| 539 | 542 |
| 540 /** | 543 /** |
| 544 * If the given [typeNode] is a [GenericFunctionType], set its [type]. |
| 545 */ |
| 546 void _setGenericFunctionType(TypeAnnotation typeNode, DartType type) { |
| 547 if (typeNode is GenericFunctionTypeImpl) { |
| 548 typeNode.type = type; |
| 549 } |
| 550 } |
| 551 |
| 552 /** |
| 541 * Recurses through the element model and AST, verifying that all elements are | 553 * Recurses through the element model and AST, verifying that all elements are |
| 542 * matched. | 554 * matched. |
| 543 * | 555 * |
| 544 * Executes [callback] with [_walker] pointing to the given [walker] (which | 556 * Executes [callback] with [_walker] pointing to the given [walker] (which |
| 545 * should be a new instance of [ElementWalker]). Once [callback] returns, | 557 * should be a new instance of [ElementWalker]). Once [callback] returns, |
| 546 * uses [ElementWalker.validate] to verify that all expected elements have | 558 * uses [ElementWalker.validate] to verify that all expected elements have |
| 547 * been matched. | 559 * been matched. |
| 548 */ | 560 */ |
| 549 void _walk(ElementWalker walker, void callback()) { | 561 void _walk(ElementWalker walker, void callback()) { |
| 550 ElementWalker outerWalker = _walker; | 562 ElementWalker outerWalker = _walker; |
| (...skipping 231 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 782 class _ElementMismatchException extends AnalysisException { | 794 class _ElementMismatchException extends AnalysisException { |
| 783 /** | 795 /** |
| 784 * Creates an exception to refer to the given [compilationUnit], [element], | 796 * Creates an exception to refer to the given [compilationUnit], [element], |
| 785 * and [cause]. | 797 * and [cause]. |
| 786 */ | 798 */ |
| 787 _ElementMismatchException( | 799 _ElementMismatchException( |
| 788 CompilationUnitElement compilationUnit, Element element, | 800 CompilationUnitElement compilationUnit, Element element, |
| 789 [CaughtException cause = null]) | 801 [CaughtException cause = null]) |
| 790 : super('Element mismatch in $compilationUnit at $element', cause); | 802 : super('Element mismatch in $compilationUnit at $element', cause); |
| 791 } | 803 } |
| OLD | NEW |