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

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

Issue 1665683002: Revert "Create ElementAnnotation objects prior to resolution." (Closed) Base URL: git@github.com:dart-lang/sdk.git@master
Patch Set: 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 {
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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 }
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