| OLD | NEW |
| 1 // Copyright (c) 2014, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2014, 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.dart.element.builder; | 5 library analyzer.src.dart.element.builder; |
| 6 | 6 |
| 7 import 'dart:collection'; | 7 import 'dart:collection'; |
| 8 | 8 |
| 9 import 'package:analyzer/dart/ast/ast.dart'; | 9 import 'package:analyzer/dart/ast/ast.dart'; |
| 10 import 'package:analyzer/dart/ast/visitor.dart'; | 10 import 'package:analyzer/dart/ast/visitor.dart'; |
| (...skipping 44 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 55 holder.validate(); | 55 holder.validate(); |
| 56 return element; | 56 return element; |
| 57 }); | 57 }); |
| 58 } | 58 } |
| 59 } | 59 } |
| 60 | 60 |
| 61 /** | 61 /** |
| 62 * Instances of the class `DirectiveElementBuilder` build elements for top | 62 * Instances of the class `DirectiveElementBuilder` build elements for top |
| 63 * level library directives. | 63 * level library directives. |
| 64 */ | 64 */ |
| 65 class DirectiveElementBuilder extends SimpleAstVisitor<Object> { | 65 class DirectiveElementBuilder extends SimpleAstVisitor<Object> |
| 66 with _ElementBuilderMixin { |
| 66 /** | 67 /** |
| 67 * The analysis context within which directive elements are being built. | 68 * The analysis context within which directive elements are being built. |
| 68 */ | 69 */ |
| 69 final AnalysisContext context; | 70 final AnalysisContext context; |
| 70 | 71 |
| 71 /** | 72 /** |
| 72 * The library element for which directive elements are being built. | 73 * The library element for which directive elements are being built. |
| 73 */ | 74 */ |
| 74 final LibraryElementImpl libraryElement; | 75 final LibraryElementImpl libraryElement; |
| 75 | 76 |
| (...skipping 103 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 179 node.element = exportElement; | 180 node.element = exportElement; |
| 180 exports.add(exportElement); | 181 exports.add(exportElement); |
| 181 if (exportSourceKindMap[exportedSource] != SourceKind.LIBRARY) { | 182 if (exportSourceKindMap[exportedSource] != SourceKind.LIBRARY) { |
| 182 errors.add(new AnalysisError( | 183 errors.add(new AnalysisError( |
| 183 exportedSource, | 184 exportedSource, |
| 184 uriLiteral.offset, | 185 uriLiteral.offset, |
| 185 uriLiteral.length, | 186 uriLiteral.length, |
| 186 CompileTimeErrorCode.EXPORT_OF_NON_LIBRARY, | 187 CompileTimeErrorCode.EXPORT_OF_NON_LIBRARY, |
| 187 [uriLiteral.toSource()])); | 188 [uriLiteral.toSource()])); |
| 188 } | 189 } |
| 190 setMetadata(exportElement, node); |
| 189 } | 191 } |
| 190 } | 192 } |
| 191 return null; | 193 return null; |
| 192 } | 194 } |
| 193 | 195 |
| 194 @override | 196 @override |
| 195 Object visitImportDirective(ImportDirective node) { | 197 Object visitImportDirective(ImportDirective node) { |
| 196 String uriContent = node.uriContent; | 198 String uriContent = node.uriContent; |
| 197 if (DartUriResolver.isDartExtUri(uriContent)) { | 199 if (DartUriResolver.isDartExtUri(uriContent)) { |
| 198 libraryElement.hasExtUri = true; | 200 libraryElement.hasExtUri = true; |
| (...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 231 } | 233 } |
| 232 node.element = importElement; | 234 node.element = importElement; |
| 233 imports.add(importElement); | 235 imports.add(importElement); |
| 234 if (importSourceKindMap[importedSource] != SourceKind.LIBRARY) { | 236 if (importSourceKindMap[importedSource] != SourceKind.LIBRARY) { |
| 235 ErrorCode errorCode = (importElement.isDeferred | 237 ErrorCode errorCode = (importElement.isDeferred |
| 236 ? StaticWarningCode.IMPORT_OF_NON_LIBRARY | 238 ? StaticWarningCode.IMPORT_OF_NON_LIBRARY |
| 237 : CompileTimeErrorCode.IMPORT_OF_NON_LIBRARY); | 239 : CompileTimeErrorCode.IMPORT_OF_NON_LIBRARY); |
| 238 errors.add(new AnalysisError(importedSource, uriLiteral.offset, | 240 errors.add(new AnalysisError(importedSource, uriLiteral.offset, |
| 239 uriLiteral.length, errorCode, [uriLiteral.toSource()])); | 241 uriLiteral.length, errorCode, [uriLiteral.toSource()])); |
| 240 } | 242 } |
| 243 setMetadata(importElement, node); |
| 241 } | 244 } |
| 242 } | 245 } |
| 243 return null; | 246 return null; |
| 244 } | 247 } |
| 245 | 248 |
| 249 @override |
| 250 Object visitLibraryDirective(LibraryDirective node) { |
| 251 setMetadata(node.element, node); |
| 252 return null; |
| 253 } |
| 254 |
| 255 @override |
| 256 Object visitPartDirective(PartDirective node) { |
| 257 setMetadata(node.element, node); |
| 258 return null; |
| 259 } |
| 260 |
| 261 @override |
| 262 Object visitPartOfDirective(PartOfDirective node) { |
| 263 setMetadata(node.element, node); |
| 264 return null; |
| 265 } |
| 266 |
| 246 /** | 267 /** |
| 247 * If the given [node] has a documentation comment, remember its content | 268 * If the given [node] has a documentation comment, remember its content |
| 248 * and range into the given [element]. | 269 * and range into the given [element]. |
| 249 */ | 270 */ |
| 250 void _setDoc(ElementImpl element, AnnotatedNode node) { | 271 void _setDoc(ElementImpl element, AnnotatedNode node) { |
| 251 Comment comment = node.documentationComment; | 272 Comment comment = node.documentationComment; |
| 252 if (comment != null && comment.isDocumentation) { | 273 if (comment != null && comment.isDocumentation) { |
| 253 element.documentationComment = | 274 element.documentationComment = |
| 254 comment.tokens.map((Token t) => t.lexeme).join('\n'); | 275 comment.tokens.map((Token t) => t.lexeme).join('\n'); |
| 255 element.setDocRange(comment.offset, comment.length); | 276 element.setDocRange(comment.offset, comment.length); |
| (...skipping 12 matching lines...) Expand all Loading... |
| 268 combinator.accept(namespaceCombinatorBuilder); | 289 combinator.accept(namespaceCombinatorBuilder); |
| 269 } | 290 } |
| 270 return namespaceCombinatorBuilder.combinators; | 291 return namespaceCombinatorBuilder.combinators; |
| 271 } | 292 } |
| 272 } | 293 } |
| 273 | 294 |
| 274 /** | 295 /** |
| 275 * Instances of the class `ElementBuilder` traverse an AST structure and build t
he element | 296 * Instances of the class `ElementBuilder` traverse an AST structure and build t
he element |
| 276 * model representing the AST structure. | 297 * model representing the AST structure. |
| 277 */ | 298 */ |
| 278 class ElementBuilder extends RecursiveAstVisitor<Object> { | 299 class ElementBuilder extends RecursiveAstVisitor<Object> |
| 300 with _ElementBuilderMixin { |
| 279 /** | 301 /** |
| 280 * The element holder associated with the element that is currently being buil
t. | 302 * The element holder associated with the element that is currently being buil
t. |
| 281 */ | 303 */ |
| 282 ElementHolder _currentHolder; | 304 ElementHolder _currentHolder; |
| 283 | 305 |
| 284 /** | 306 /** |
| 285 * A flag indicating whether a variable declaration is in the context of a fie
ld declaration. | 307 * A flag indicating whether a variable declaration is in the context of a fie
ld declaration. |
| 286 */ | 308 */ |
| 287 bool _inFieldContext = false; | 309 bool _inFieldContext = false; |
| 288 | 310 |
| (...skipping 104 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 393 // Function types must be initialized after the enclosing element has been | 415 // Function types must be initialized after the enclosing element has been |
| 394 // set, for them to pick up the type parameters. | 416 // set, for them to pick up the type parameters. |
| 395 for (ExecutableElementImpl e in _functionTypesToFix) { | 417 for (ExecutableElementImpl e in _functionTypesToFix) { |
| 396 e.type = new FunctionTypeImpl(e); | 418 e.type = new FunctionTypeImpl(e); |
| 397 } | 419 } |
| 398 _functionTypesToFix = null; | 420 _functionTypesToFix = null; |
| 399 _currentHolder.addType(element); | 421 _currentHolder.addType(element); |
| 400 className.staticElement = element; | 422 className.staticElement = element; |
| 401 _fieldMap = null; | 423 _fieldMap = null; |
| 402 holder.validate(); | 424 holder.validate(); |
| 425 setMetadata(element, node); |
| 403 return null; | 426 return null; |
| 404 } | 427 } |
| 405 | 428 |
| 406 /** | 429 /** |
| 407 * Implementation of this method should be synchronized with | 430 * Implementation of this method should be synchronized with |
| 408 * [visitClassDeclaration]. | 431 * [visitClassDeclaration]. |
| 409 */ | 432 */ |
| 410 void visitClassDeclarationIncrementally(ClassDeclaration node) { | 433 void visitClassDeclarationIncrementally(ClassDeclaration node) { |
| 411 // | 434 // |
| 412 // Process field declarations before constructors and methods so that field | 435 // Process field declarations before constructors and methods so that field |
| (...skipping 14 matching lines...) Expand all Loading... |
| 427 List<TypeParameterElement> typeParameters = holder.typeParameters; | 450 List<TypeParameterElement> typeParameters = holder.typeParameters; |
| 428 element.typeParameters = typeParameters; | 451 element.typeParameters = typeParameters; |
| 429 List<DartType> typeArguments = _createTypeParameterTypes(typeParameters); | 452 List<DartType> typeArguments = _createTypeParameterTypes(typeParameters); |
| 430 InterfaceTypeImpl interfaceType = new InterfaceTypeImpl(element); | 453 InterfaceTypeImpl interfaceType = new InterfaceTypeImpl(element); |
| 431 interfaceType.typeArguments = typeArguments; | 454 interfaceType.typeArguments = typeArguments; |
| 432 element.type = interfaceType; | 455 element.type = interfaceType; |
| 433 _setDoc(element, node); | 456 _setDoc(element, node); |
| 434 _currentHolder.addType(element); | 457 _currentHolder.addType(element); |
| 435 className.staticElement = element; | 458 className.staticElement = element; |
| 436 holder.validate(); | 459 holder.validate(); |
| 460 setMetadata(element, node); |
| 437 return null; | 461 return null; |
| 438 } | 462 } |
| 439 | 463 |
| 440 @override | 464 @override |
| 441 Object visitConstructorDeclaration(ConstructorDeclaration node) { | 465 Object visitConstructorDeclaration(ConstructorDeclaration node) { |
| 442 ElementHolder holder = new ElementHolder(); | 466 ElementHolder holder = new ElementHolder(); |
| 443 bool wasInFunction = _inFunction; | 467 bool wasInFunction = _inFunction; |
| 444 _inFunction = true; | 468 _inFunction = true; |
| 445 try { | 469 try { |
| 446 _visitChildren(holder, node); | 470 _visitChildren(holder, node); |
| (...skipping 29 matching lines...) Expand all Loading... |
| 476 if (returnType != null) { | 500 if (returnType != null) { |
| 477 element.nameOffset = returnType.offset; | 501 element.nameOffset = returnType.offset; |
| 478 element.nameEnd = returnType.end; | 502 element.nameEnd = returnType.end; |
| 479 } | 503 } |
| 480 } else { | 504 } else { |
| 481 constructorName.staticElement = element; | 505 constructorName.staticElement = element; |
| 482 element.periodOffset = node.period.offset; | 506 element.periodOffset = node.period.offset; |
| 483 element.nameEnd = constructorName.end; | 507 element.nameEnd = constructorName.end; |
| 484 } | 508 } |
| 485 holder.validate(); | 509 holder.validate(); |
| 510 setMetadata(element, node); |
| 486 return null; | 511 return null; |
| 487 } | 512 } |
| 488 | 513 |
| 489 @override | 514 @override |
| 490 Object visitDeclaredIdentifier(DeclaredIdentifier node) { | 515 Object visitDeclaredIdentifier(DeclaredIdentifier node) { |
| 491 SimpleIdentifier variableName = node.identifier; | 516 SimpleIdentifier variableName = node.identifier; |
| 492 LocalVariableElementImpl element = | 517 LocalVariableElementImpl element = |
| 493 new LocalVariableElementImpl.forNode(variableName); | 518 new LocalVariableElementImpl.forNode(variableName); |
| 494 ForEachStatement statement = node.parent as ForEachStatement; | 519 ForEachStatement statement = node.parent as ForEachStatement; |
| 495 int declarationEnd = node.offset + node.length; | 520 int declarationEnd = node.offset + node.length; |
| 496 int statementEnd = statement.offset + statement.length; | 521 int statementEnd = statement.offset + statement.length; |
| 497 element.setVisibleRange(declarationEnd, statementEnd - declarationEnd - 1); | 522 element.setVisibleRange(declarationEnd, statementEnd - declarationEnd - 1); |
| 498 element.const3 = node.isConst; | 523 element.const3 = node.isConst; |
| 499 element.final2 = node.isFinal; | 524 element.final2 = node.isFinal; |
| 500 if (node.type == null) { | 525 if (node.type == null) { |
| 501 element.hasImplicitType = true; | 526 element.hasImplicitType = true; |
| 502 } | 527 } |
| 503 _currentHolder.addLocalVariable(element); | 528 _currentHolder.addLocalVariable(element); |
| 504 variableName.staticElement = element; | 529 variableName.staticElement = element; |
| 530 setMetadata(element, node); |
| 505 return super.visitDeclaredIdentifier(node); | 531 return super.visitDeclaredIdentifier(node); |
| 506 } | 532 } |
| 507 | 533 |
| 508 @override | 534 @override |
| 509 Object visitDefaultFormalParameter(DefaultFormalParameter node) { | 535 Object visitDefaultFormalParameter(DefaultFormalParameter node) { |
| 510 ElementHolder holder = new ElementHolder(); | 536 ElementHolder holder = new ElementHolder(); |
| 511 NormalFormalParameter normalParameter = node.parameter; | 537 NormalFormalParameter normalParameter = node.parameter; |
| 512 SimpleIdentifier parameterName = normalParameter.identifier; | 538 SimpleIdentifier parameterName = normalParameter.identifier; |
| 513 ParameterElementImpl parameter; | 539 ParameterElementImpl parameter; |
| 514 if (normalParameter is FieldFormalParameter) { | 540 if (normalParameter is FieldFormalParameter) { |
| (...skipping 44 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 559 _setDoc(enumElement, node); | 585 _setDoc(enumElement, node); |
| 560 InterfaceTypeImpl enumType = new InterfaceTypeImpl(enumElement); | 586 InterfaceTypeImpl enumType = new InterfaceTypeImpl(enumElement); |
| 561 enumElement.type = enumType; | 587 enumElement.type = enumType; |
| 562 // The equivalent code for enums in the spec shows a single constructor, | 588 // The equivalent code for enums in the spec shows a single constructor, |
| 563 // but that constructor is not callable (since it is a compile-time error | 589 // but that constructor is not callable (since it is a compile-time error |
| 564 // to subclass, mix-in, implement, or explicitly instantiate an enum). So | 590 // to subclass, mix-in, implement, or explicitly instantiate an enum). So |
| 565 // we represent this as having no constructors. | 591 // we represent this as having no constructors. |
| 566 enumElement.constructors = ConstructorElement.EMPTY_LIST; | 592 enumElement.constructors = ConstructorElement.EMPTY_LIST; |
| 567 _currentHolder.addEnum(enumElement); | 593 _currentHolder.addEnum(enumElement); |
| 568 enumName.staticElement = enumElement; | 594 enumName.staticElement = enumElement; |
| 595 setMetadata(enumElement, node); |
| 569 return super.visitEnumDeclaration(node); | 596 return super.visitEnumDeclaration(node); |
| 570 } | 597 } |
| 571 | 598 |
| 572 @override | 599 @override |
| 573 Object visitFieldDeclaration(FieldDeclaration node) { | 600 Object visitFieldDeclaration(FieldDeclaration node) { |
| 574 bool wasInField = _inFieldContext; | 601 bool wasInField = _inFieldContext; |
| 575 _inFieldContext = true; | 602 _inFieldContext = true; |
| 576 try { | 603 try { |
| 577 node.visitChildren(this); | 604 node.visitChildren(this); |
| 578 } finally { | 605 } finally { |
| (...skipping 22 matching lines...) Expand all Loading... |
| 601 // | 628 // |
| 602 // The children of this parameter include any parameters defined on the type | 629 // The children of this parameter include any parameters defined on the type |
| 603 // of this parameter. | 630 // of this parameter. |
| 604 // | 631 // |
| 605 ElementHolder holder = new ElementHolder(); | 632 ElementHolder holder = new ElementHolder(); |
| 606 _visitChildren(holder, node); | 633 _visitChildren(holder, node); |
| 607 ParameterElementImpl element = node.element; | 634 ParameterElementImpl element = node.element; |
| 608 element.parameters = holder.parameters; | 635 element.parameters = holder.parameters; |
| 609 element.typeParameters = holder.typeParameters; | 636 element.typeParameters = holder.typeParameters; |
| 610 holder.validate(); | 637 holder.validate(); |
| 638 _setMetadataForParameter(element, node); |
| 611 return null; | 639 return null; |
| 612 } | 640 } |
| 613 | 641 |
| 614 @override | 642 @override |
| 615 Object visitFunctionDeclaration(FunctionDeclaration node) { | 643 Object visitFunctionDeclaration(FunctionDeclaration node) { |
| 616 FunctionExpression expression = node.functionExpression; | 644 FunctionExpression expression = node.functionExpression; |
| 617 if (expression != null) { | 645 if (expression != null) { |
| 618 ElementHolder holder = new ElementHolder(); | 646 ElementHolder holder = new ElementHolder(); |
| 619 bool wasInFunction = _inFunction; | 647 bool wasInFunction = _inFunction; |
| 620 _inFunction = true; | 648 _inFunction = true; |
| (...skipping 30 matching lines...) Expand all Loading... |
| 651 int blockEnd = enclosingBlock.offset + enclosingBlock.length; | 679 int blockEnd = enclosingBlock.offset + enclosingBlock.length; |
| 652 element.setVisibleRange(functionEnd, blockEnd - functionEnd - 1); | 680 element.setVisibleRange(functionEnd, blockEnd - functionEnd - 1); |
| 653 } | 681 } |
| 654 } | 682 } |
| 655 if (node.returnType == null) { | 683 if (node.returnType == null) { |
| 656 element.hasImplicitReturnType = true; | 684 element.hasImplicitReturnType = true; |
| 657 } | 685 } |
| 658 _currentHolder.addFunction(element); | 686 _currentHolder.addFunction(element); |
| 659 expression.element = element; | 687 expression.element = element; |
| 660 functionName.staticElement = element; | 688 functionName.staticElement = element; |
| 689 setMetadata(element, node); |
| 661 } else { | 690 } else { |
| 662 SimpleIdentifier propertyNameNode = node.name; | 691 SimpleIdentifier propertyNameNode = node.name; |
| 663 if (propertyNameNode == null) { | 692 if (propertyNameNode == null) { |
| 664 // TODO(brianwilkerson) Report this internal error. | 693 // TODO(brianwilkerson) Report this internal error. |
| 665 return null; | 694 return null; |
| 666 } | 695 } |
| 667 String propertyName = propertyNameNode.name; | 696 String propertyName = propertyNameNode.name; |
| 668 TopLevelVariableElementImpl variable = _currentHolder | 697 TopLevelVariableElementImpl variable = _currentHolder |
| 669 .getTopLevelVariable(propertyName) as TopLevelVariableElementImpl; | 698 .getTopLevelVariable(propertyName) as TopLevelVariableElementImpl; |
| 670 if (variable == null) { | 699 if (variable == null) { |
| (...skipping 21 matching lines...) Expand all Loading... |
| 692 getter.variable = variable; | 721 getter.variable = variable; |
| 693 getter.getter = true; | 722 getter.getter = true; |
| 694 getter.static = true; | 723 getter.static = true; |
| 695 variable.getter = getter; | 724 variable.getter = getter; |
| 696 if (node.returnType == null) { | 725 if (node.returnType == null) { |
| 697 getter.hasImplicitReturnType = true; | 726 getter.hasImplicitReturnType = true; |
| 698 } | 727 } |
| 699 _currentHolder.addAccessor(getter); | 728 _currentHolder.addAccessor(getter); |
| 700 expression.element = getter; | 729 expression.element = getter; |
| 701 propertyNameNode.staticElement = getter; | 730 propertyNameNode.staticElement = getter; |
| 731 setMetadata(getter, node); |
| 702 } else { | 732 } else { |
| 703 PropertyAccessorElementImpl setter = | 733 PropertyAccessorElementImpl setter = |
| 704 new PropertyAccessorElementImpl.forNode(propertyNameNode); | 734 new PropertyAccessorElementImpl.forNode(propertyNameNode); |
| 705 _setDoc(setter, node); | 735 _setDoc(setter, node); |
| 706 if (node.externalKeyword != null) { | 736 if (node.externalKeyword != null) { |
| 707 setter.external = true; | 737 setter.external = true; |
| 708 } | 738 } |
| 709 setter.functions = holder.functions; | 739 setter.functions = holder.functions; |
| 710 setter.labels = holder.labels; | 740 setter.labels = holder.labels; |
| 711 setter.localVariables = holder.localVariables; | 741 setter.localVariables = holder.localVariables; |
| 712 setter.parameters = holder.parameters; | 742 setter.parameters = holder.parameters; |
| 713 if (body.isAsynchronous) { | 743 if (body.isAsynchronous) { |
| 714 setter.asynchronous = true; | 744 setter.asynchronous = true; |
| 715 } | 745 } |
| 716 if (body.isGenerator) { | 746 if (body.isGenerator) { |
| 717 setter.generator = true; | 747 setter.generator = true; |
| 718 } | 748 } |
| 719 setter.variable = variable; | 749 setter.variable = variable; |
| 720 setter.setter = true; | 750 setter.setter = true; |
| 721 setter.static = true; | 751 setter.static = true; |
| 722 if (node.returnType == null) { | 752 if (node.returnType == null) { |
| 723 setter.hasImplicitReturnType = true; | 753 setter.hasImplicitReturnType = true; |
| 724 } | 754 } |
| 725 variable.setter = setter; | 755 variable.setter = setter; |
| 726 variable.final2 = false; | 756 variable.final2 = false; |
| 727 _currentHolder.addAccessor(setter); | 757 _currentHolder.addAccessor(setter); |
| 728 expression.element = setter; | 758 expression.element = setter; |
| 729 propertyNameNode.staticElement = setter; | 759 propertyNameNode.staticElement = setter; |
| 760 setMetadata(setter, node); |
| 730 } | 761 } |
| 731 } | 762 } |
| 732 holder.validate(); | 763 holder.validate(); |
| 733 } | 764 } |
| 734 return null; | 765 return null; |
| 735 } | 766 } |
| 736 | 767 |
| 737 @override | 768 @override |
| 738 Object visitFunctionExpression(FunctionExpression node) { | 769 Object visitFunctionExpression(FunctionExpression node) { |
| 739 if (node.parent is FunctionDeclaration) { | 770 if (node.parent is FunctionDeclaration) { |
| (...skipping 53 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 793 FunctionTypeAliasElementImpl element = | 824 FunctionTypeAliasElementImpl element = |
| 794 new FunctionTypeAliasElementImpl.forNode(aliasName); | 825 new FunctionTypeAliasElementImpl.forNode(aliasName); |
| 795 _setDoc(element, node); | 826 _setDoc(element, node); |
| 796 element.parameters = parameters; | 827 element.parameters = parameters; |
| 797 element.typeParameters = typeParameters; | 828 element.typeParameters = typeParameters; |
| 798 _createTypeParameterTypes(typeParameters); | 829 _createTypeParameterTypes(typeParameters); |
| 799 element.type = new FunctionTypeImpl.forTypedef(element); | 830 element.type = new FunctionTypeImpl.forTypedef(element); |
| 800 _currentHolder.addTypeAlias(element); | 831 _currentHolder.addTypeAlias(element); |
| 801 aliasName.staticElement = element; | 832 aliasName.staticElement = element; |
| 802 holder.validate(); | 833 holder.validate(); |
| 834 setMetadata(element, node); |
| 803 return null; | 835 return null; |
| 804 } | 836 } |
| 805 | 837 |
| 806 @override | 838 @override |
| 807 Object visitFunctionTypedFormalParameter(FunctionTypedFormalParameter node) { | 839 Object visitFunctionTypedFormalParameter(FunctionTypedFormalParameter node) { |
| 808 if (node.parent is! DefaultFormalParameter) { | 840 if (node.parent is! DefaultFormalParameter) { |
| 809 SimpleIdentifier parameterName = node.identifier; | 841 SimpleIdentifier parameterName = node.identifier; |
| 810 ParameterElementImpl parameter = | 842 ParameterElementImpl parameter = |
| 811 new ParameterElementImpl.forNode(parameterName); | 843 new ParameterElementImpl.forNode(parameterName); |
| 812 parameter.parameterKind = node.kind; | 844 parameter.parameterKind = node.kind; |
| 813 _setParameterVisibleRange(node, parameter); | 845 _setParameterVisibleRange(node, parameter); |
| 814 _currentHolder.addParameter(parameter); | 846 _currentHolder.addParameter(parameter); |
| 815 parameterName.staticElement = parameter; | 847 parameterName.staticElement = parameter; |
| 816 } | 848 } |
| 817 // | 849 // |
| 818 // The children of this parameter include any parameters defined on the type | 850 // The children of this parameter include any parameters defined on the type |
| 819 //of this parameter. | 851 //of this parameter. |
| 820 // | 852 // |
| 821 ElementHolder holder = new ElementHolder(); | 853 ElementHolder holder = new ElementHolder(); |
| 822 _visitChildren(holder, node); | 854 _visitChildren(holder, node); |
| 823 ParameterElementImpl element = node.element; | 855 ParameterElementImpl element = node.element; |
| 824 element.parameters = holder.parameters; | 856 element.parameters = holder.parameters; |
| 825 element.typeParameters = holder.typeParameters; | 857 element.typeParameters = holder.typeParameters; |
| 826 holder.validate(); | 858 holder.validate(); |
| 859 _setMetadataForParameter(element, node); |
| 827 return null; | 860 return null; |
| 828 } | 861 } |
| 829 | 862 |
| 830 @override | 863 @override |
| 831 Object visitLabeledStatement(LabeledStatement node) { | 864 Object visitLabeledStatement(LabeledStatement node) { |
| 832 bool onSwitchStatement = node.statement is SwitchStatement; | 865 bool onSwitchStatement = node.statement is SwitchStatement; |
| 833 for (Label label in node.labels) { | 866 for (Label label in node.labels) { |
| 834 SimpleIdentifier labelName = label.label; | 867 SimpleIdentifier labelName = label.label; |
| 835 LabelElementImpl element = | 868 LabelElementImpl element = |
| 836 new LabelElementImpl(labelName, onSwitchStatement, false); | 869 new LabelElementImpl(labelName, onSwitchStatement, false); |
| (...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 878 element.asynchronous = true; | 911 element.asynchronous = true; |
| 879 } | 912 } |
| 880 if (body.isGenerator) { | 913 if (body.isGenerator) { |
| 881 element.generator = true; | 914 element.generator = true; |
| 882 } | 915 } |
| 883 if (node.returnType == null) { | 916 if (node.returnType == null) { |
| 884 element.hasImplicitReturnType = true; | 917 element.hasImplicitReturnType = true; |
| 885 } | 918 } |
| 886 _currentHolder.addMethod(element); | 919 _currentHolder.addMethod(element); |
| 887 methodName.staticElement = element; | 920 methodName.staticElement = element; |
| 921 setMetadata(element, node); |
| 888 } else { | 922 } else { |
| 889 SimpleIdentifier propertyNameNode = node.name; | 923 SimpleIdentifier propertyNameNode = node.name; |
| 890 String propertyName = propertyNameNode.name; | 924 String propertyName = propertyNameNode.name; |
| 891 FieldElementImpl field = | 925 FieldElementImpl field = |
| 892 _currentHolder.getField(propertyName) as FieldElementImpl; | 926 _currentHolder.getField(propertyName) as FieldElementImpl; |
| 893 if (field == null) { | 927 if (field == null) { |
| 894 field = new FieldElementImpl(node.name.name, -1); | 928 field = new FieldElementImpl(node.name.name, -1); |
| 895 field.final2 = true; | 929 field.final2 = true; |
| 896 field.static = isStatic; | 930 field.static = isStatic; |
| 897 field.synthetic = true; | 931 field.synthetic = true; |
| (...skipping 18 matching lines...) Expand all Loading... |
| 916 getter.variable = field; | 950 getter.variable = field; |
| 917 getter.abstract = node.isAbstract; | 951 getter.abstract = node.isAbstract; |
| 918 getter.getter = true; | 952 getter.getter = true; |
| 919 getter.static = isStatic; | 953 getter.static = isStatic; |
| 920 field.getter = getter; | 954 field.getter = getter; |
| 921 if (node.returnType == null) { | 955 if (node.returnType == null) { |
| 922 getter.hasImplicitReturnType = true; | 956 getter.hasImplicitReturnType = true; |
| 923 } | 957 } |
| 924 _currentHolder.addAccessor(getter); | 958 _currentHolder.addAccessor(getter); |
| 925 propertyNameNode.staticElement = getter; | 959 propertyNameNode.staticElement = getter; |
| 960 setMetadata(getter, node); |
| 926 } else { | 961 } else { |
| 927 PropertyAccessorElementImpl setter = | 962 PropertyAccessorElementImpl setter = |
| 928 new PropertyAccessorElementImpl.forNode(propertyNameNode); | 963 new PropertyAccessorElementImpl.forNode(propertyNameNode); |
| 929 _setDoc(setter, node); | 964 _setDoc(setter, node); |
| 930 if (node.externalKeyword != null) { | 965 if (node.externalKeyword != null) { |
| 931 setter.external = true; | 966 setter.external = true; |
| 932 } | 967 } |
| 933 setter.functions = holder.functions; | 968 setter.functions = holder.functions; |
| 934 setter.labels = holder.labels; | 969 setter.labels = holder.labels; |
| 935 setter.localVariables = holder.localVariables; | 970 setter.localVariables = holder.localVariables; |
| 936 setter.parameters = holder.parameters; | 971 setter.parameters = holder.parameters; |
| 937 if (body.isAsynchronous) { | 972 if (body.isAsynchronous) { |
| 938 setter.asynchronous = true; | 973 setter.asynchronous = true; |
| 939 } | 974 } |
| 940 if (body.isGenerator) { | 975 if (body.isGenerator) { |
| 941 setter.generator = true; | 976 setter.generator = true; |
| 942 } | 977 } |
| 943 setter.variable = field; | 978 setter.variable = field; |
| 944 setter.abstract = node.isAbstract; | 979 setter.abstract = node.isAbstract; |
| 945 setter.setter = true; | 980 setter.setter = true; |
| 946 setter.static = isStatic; | 981 setter.static = isStatic; |
| 947 if (node.returnType == null) { | 982 if (node.returnType == null) { |
| 948 setter.hasImplicitReturnType = true; | 983 setter.hasImplicitReturnType = true; |
| 949 } | 984 } |
| 950 field.setter = setter; | 985 field.setter = setter; |
| 951 field.final2 = false; | 986 field.final2 = false; |
| 952 _currentHolder.addAccessor(setter); | 987 _currentHolder.addAccessor(setter); |
| 953 propertyNameNode.staticElement = setter; | 988 propertyNameNode.staticElement = setter; |
| 989 setMetadata(setter, node); |
| 954 } | 990 } |
| 955 } | 991 } |
| 956 holder.validate(); | 992 holder.validate(); |
| 957 } catch (exception, stackTrace) { | 993 } catch (exception, stackTrace) { |
| 958 if (node.name.staticElement == null) { | 994 if (node.name.staticElement == null) { |
| 959 ClassDeclaration classNode = | 995 ClassDeclaration classNode = |
| 960 node.getAncestor((node) => node is ClassDeclaration); | 996 node.getAncestor((node) => node is ClassDeclaration); |
| 961 StringBuffer buffer = new StringBuffer(); | 997 StringBuffer buffer = new StringBuffer(); |
| 962 buffer.write("The element for the method "); | 998 buffer.write("The element for the method "); |
| 963 buffer.write(node.name); | 999 buffer.write(node.name); |
| (...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1000 parameter.const3 = node.isConst; | 1036 parameter.const3 = node.isConst; |
| 1001 parameter.final2 = node.isFinal; | 1037 parameter.final2 = node.isFinal; |
| 1002 parameter.parameterKind = node.kind; | 1038 parameter.parameterKind = node.kind; |
| 1003 _setParameterVisibleRange(node, parameter); | 1039 _setParameterVisibleRange(node, parameter); |
| 1004 if (node.type == null) { | 1040 if (node.type == null) { |
| 1005 parameter.hasImplicitType = true; | 1041 parameter.hasImplicitType = true; |
| 1006 } | 1042 } |
| 1007 _currentHolder.addParameter(parameter); | 1043 _currentHolder.addParameter(parameter); |
| 1008 parameterName.staticElement = parameter; | 1044 parameterName.staticElement = parameter; |
| 1009 } | 1045 } |
| 1010 return super.visitSimpleFormalParameter(node); | 1046 super.visitSimpleFormalParameter(node); |
| 1047 _setMetadataForParameter(node.element, node); |
| 1048 return null; |
| 1011 } | 1049 } |
| 1012 | 1050 |
| 1013 @override | 1051 @override |
| 1014 Object visitSwitchCase(SwitchCase node) { | 1052 Object visitSwitchCase(SwitchCase node) { |
| 1015 for (Label label in node.labels) { | 1053 for (Label label in node.labels) { |
| 1016 SimpleIdentifier labelName = label.label; | 1054 SimpleIdentifier labelName = label.label; |
| 1017 LabelElementImpl element = new LabelElementImpl(labelName, false, true); | 1055 LabelElementImpl element = new LabelElementImpl(labelName, false, true); |
| 1018 _currentHolder.addLabel(element); | 1056 _currentHolder.addLabel(element); |
| 1019 labelName.staticElement = element; | 1057 labelName.staticElement = element; |
| 1020 } | 1058 } |
| (...skipping 14 matching lines...) Expand all Loading... |
| 1035 @override | 1073 @override |
| 1036 Object visitTypeParameter(TypeParameter node) { | 1074 Object visitTypeParameter(TypeParameter node) { |
| 1037 SimpleIdentifier parameterName = node.name; | 1075 SimpleIdentifier parameterName = node.name; |
| 1038 TypeParameterElementImpl typeParameter = | 1076 TypeParameterElementImpl typeParameter = |
| 1039 new TypeParameterElementImpl.forNode(parameterName); | 1077 new TypeParameterElementImpl.forNode(parameterName); |
| 1040 TypeParameterTypeImpl typeParameterType = | 1078 TypeParameterTypeImpl typeParameterType = |
| 1041 new TypeParameterTypeImpl(typeParameter); | 1079 new TypeParameterTypeImpl(typeParameter); |
| 1042 typeParameter.type = typeParameterType; | 1080 typeParameter.type = typeParameterType; |
| 1043 _currentHolder.addTypeParameter(typeParameter); | 1081 _currentHolder.addTypeParameter(typeParameter); |
| 1044 parameterName.staticElement = typeParameter; | 1082 parameterName.staticElement = typeParameter; |
| 1083 setMetadata(typeParameter, node); |
| 1045 return super.visitTypeParameter(node); | 1084 return super.visitTypeParameter(node); |
| 1046 } | 1085 } |
| 1047 | 1086 |
| 1048 @override | 1087 @override |
| 1049 Object visitVariableDeclaration(VariableDeclaration node) { | 1088 Object visitVariableDeclaration(VariableDeclaration node) { |
| 1050 bool isConst = node.isConst; | 1089 bool isConst = node.isConst; |
| 1051 bool isFinal = node.isFinal; | 1090 bool isFinal = node.isFinal; |
| 1052 bool hasInitializer = node.initializer != null; | 1091 bool hasInitializer = node.initializer != null; |
| 1053 VariableElementImpl element; | 1092 VariableElementImpl element; |
| 1054 if (_inFieldContext) { | 1093 if (_inFieldContext) { |
| (...skipping 88 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1143 setter.setter = true; | 1182 setter.setter = true; |
| 1144 ParameterElementImpl parameter = | 1183 ParameterElementImpl parameter = |
| 1145 new ParameterElementImpl("_${element.name}", element.nameOffset); | 1184 new ParameterElementImpl("_${element.name}", element.nameOffset); |
| 1146 parameter.synthetic = true; | 1185 parameter.synthetic = true; |
| 1147 parameter.parameterKind = ParameterKind.REQUIRED; | 1186 parameter.parameterKind = ParameterKind.REQUIRED; |
| 1148 setter.parameters = <ParameterElement>[parameter]; | 1187 setter.parameters = <ParameterElement>[parameter]; |
| 1149 _currentHolder.addAccessor(setter); | 1188 _currentHolder.addAccessor(setter); |
| 1150 element.setter = setter; | 1189 element.setter = setter; |
| 1151 } | 1190 } |
| 1152 } | 1191 } |
| 1192 setMetadata(element, node); |
| 1153 return null; | 1193 return null; |
| 1154 } | 1194 } |
| 1155 | 1195 |
| 1156 /** | 1196 /** |
| 1157 * Build the table mapping field names to field elements for the fields define
d in the current | 1197 * Build the table mapping field names to field elements for the fields define
d in the current |
| 1158 * class. | 1198 * class. |
| 1159 * | 1199 * |
| 1160 * @param fields the field elements defined in the current class | 1200 * @param fields the field elements defined in the current class |
| 1161 */ | 1201 */ |
| 1162 void _buildFieldMap(List<FieldElement> fields) { | 1202 void _buildFieldMap(List<FieldElement> fields) { |
| (...skipping 144 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1307 Object visitMethodDeclaration(MethodDeclaration node) { | 1347 Object visitMethodDeclaration(MethodDeclaration node) { |
| 1308 nonFields.add(node); | 1348 nonFields.add(node); |
| 1309 return null; | 1349 return null; |
| 1310 } | 1350 } |
| 1311 | 1351 |
| 1312 @override | 1352 @override |
| 1313 Object visitNode(AstNode node) => node.accept(builder); | 1353 Object visitNode(AstNode node) => node.accept(builder); |
| 1314 } | 1354 } |
| 1315 | 1355 |
| 1316 /** | 1356 /** |
| 1357 * Helper methods used by element builder classes. |
| 1358 */ |
| 1359 class _ElementBuilderMixin { |
| 1360 /** |
| 1361 * Given a [node] that can have annotations associated with it and the |
| 1362 * [element] to which that node has been resolved, create the annotations in |
| 1363 * the element model representing the annotations on the node. |
| 1364 */ |
| 1365 void setMetadata(Element element, AnnotatedNode node) { |
| 1366 if (element is! ElementImpl) { |
| 1367 return; |
| 1368 } |
| 1369 List<ElementAnnotationImpl> annotationList = <ElementAnnotationImpl>[]; |
| 1370 _addAnnotations(annotationList, node.metadata, element); |
| 1371 if (node is VariableDeclaration && node.parent is VariableDeclarationList) { |
| 1372 VariableDeclarationList list = node.parent as VariableDeclarationList; |
| 1373 _addAnnotations(annotationList, list.metadata, element); |
| 1374 if (list.parent is FieldDeclaration) { |
| 1375 FieldDeclaration fieldDeclaration = list.parent as FieldDeclaration; |
| 1376 _addAnnotations(annotationList, fieldDeclaration.metadata, element); |
| 1377 } else if (list.parent is TopLevelVariableDeclaration) { |
| 1378 TopLevelVariableDeclaration variableDeclaration = |
| 1379 list.parent as TopLevelVariableDeclaration; |
| 1380 _addAnnotations(annotationList, variableDeclaration.metadata, element); |
| 1381 } |
| 1382 } |
| 1383 if (!annotationList.isEmpty) { |
| 1384 (element as ElementImpl).metadata = annotationList; |
| 1385 } |
| 1386 } |
| 1387 |
| 1388 /** |
| 1389 * Given a [node] that can have annotations associated with it and the |
| 1390 * [element] to which that node has been resolved, create the annotations in |
| 1391 * the element model representing the annotations on the node. |
| 1392 */ |
| 1393 void _setMetadataForParameter(Element element, NormalFormalParameter node) { |
| 1394 if (element is! ElementImpl) { |
| 1395 return; |
| 1396 } |
| 1397 List<ElementAnnotationImpl> annotationList = |
| 1398 new List<ElementAnnotationImpl>(); |
| 1399 _addAnnotations(annotationList, node.metadata, element); |
| 1400 if (!annotationList.isEmpty) { |
| 1401 (element as ElementImpl).metadata = annotationList; |
| 1402 } |
| 1403 } |
| 1404 |
| 1405 /** |
| 1406 * Generate annotation elements for each of the annotations in the |
| 1407 * [annotationList] and add them to the given list of [annotations]. |
| 1408 * |
| 1409 * [annotatedElement] is the element to which the annotations are being |
| 1410 * applied. |
| 1411 */ |
| 1412 static void _addAnnotations(List<ElementAnnotationImpl> annotationList, |
| 1413 NodeList<Annotation> annotations, Element annotatedElement) { |
| 1414 int annotationCount = annotations.length; |
| 1415 for (int i = 0; i < annotationCount; i++) { |
| 1416 Annotation annotation = annotations[i]; |
| 1417 ElementAnnotationImpl elementAnnotation = |
| 1418 new ElementAnnotationImpl(annotatedElement); |
| 1419 annotation.elementAnnotation = elementAnnotation; |
| 1420 annotationList.add(elementAnnotation); |
| 1421 } |
| 1422 } |
| 1423 } |
| 1424 |
| 1425 /** |
| 1317 * Instances of the class [_NamespaceCombinatorBuilder] can be used to visit | 1426 * Instances of the class [_NamespaceCombinatorBuilder] can be used to visit |
| 1318 * [Combinator] AST nodes and generate [NamespaceCombinator] elements. | 1427 * [Combinator] AST nodes and generate [NamespaceCombinator] elements. |
| 1319 */ | 1428 */ |
| 1320 class _NamespaceCombinatorBuilder extends SimpleAstVisitor<Object> { | 1429 class _NamespaceCombinatorBuilder extends SimpleAstVisitor<Object> { |
| 1321 /** | 1430 /** |
| 1322 * Elements generated so far. | 1431 * Elements generated so far. |
| 1323 */ | 1432 */ |
| 1324 final List<NamespaceCombinator> combinators = <NamespaceCombinator>[]; | 1433 final List<NamespaceCombinator> combinators = <NamespaceCombinator>[]; |
| 1325 | 1434 |
| 1326 @override | 1435 @override |
| (...skipping 14 matching lines...) Expand all Loading... |
| 1341 return null; | 1450 return null; |
| 1342 } | 1451 } |
| 1343 | 1452 |
| 1344 /** | 1453 /** |
| 1345 * Return the lexical identifiers associated with the given [identifiers]. | 1454 * Return the lexical identifiers associated with the given [identifiers]. |
| 1346 */ | 1455 */ |
| 1347 static List<String> _getIdentifiers(NodeList<SimpleIdentifier> identifiers) { | 1456 static List<String> _getIdentifiers(NodeList<SimpleIdentifier> identifiers) { |
| 1348 return identifiers.map((identifier) => identifier.name).toList(); | 1457 return identifiers.map((identifier) => identifier.name).toList(); |
| 1349 } | 1458 } |
| 1350 } | 1459 } |
| OLD | NEW |