Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(32)

Side by Side Diff: pkg/analyzer/lib/src/dart/element/builder.dart

Issue 1660713002: Create ElementAnnotation objects prior to resolution. (Closed) Base URL: git@github.com:dart-lang/sdk.git@master
Patch Set: Fix accidental comment change Created 4 years, 10 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « no previous file | pkg/analyzer/lib/src/dart/element/element.dart » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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 }
OLDNEW
« no previous file with comments | « no previous file | pkg/analyzer/lib/src/dart/element/element.dart » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698