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