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

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

Issue 1753963003: Add codeOffset/codeLength properties to ElementImpl. (Closed) Base URL: git@github.com:dart-lang/sdk.git@master
Patch Set: Created 4 years, 9 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/token.dart'; 10 import 'package:analyzer/dart/ast/token.dart';
(...skipping 364 matching lines...) Expand 10 before | Expand all | Expand 10 after
375 if (node.exceptionType == null) { 375 if (node.exceptionType == null) {
376 exception.hasImplicitType = true; 376 exception.hasImplicitType = true;
377 } 377 }
378 _currentHolder.addLocalVariable(exception); 378 _currentHolder.addLocalVariable(exception);
379 exceptionParameter.staticElement = exception; 379 exceptionParameter.staticElement = exception;
380 // stack trace 380 // stack trace
381 SimpleIdentifier stackTraceParameter = node.stackTraceParameter; 381 SimpleIdentifier stackTraceParameter = node.stackTraceParameter;
382 if (stackTraceParameter != null) { 382 if (stackTraceParameter != null) {
383 LocalVariableElementImpl stackTrace = 383 LocalVariableElementImpl stackTrace =
384 new LocalVariableElementImpl.forNode(stackTraceParameter); 384 new LocalVariableElementImpl.forNode(stackTraceParameter);
385 _setCodeRange(stackTrace, stackTraceParameter);
385 _currentHolder.addLocalVariable(stackTrace); 386 _currentHolder.addLocalVariable(stackTrace);
386 stackTraceParameter.staticElement = stackTrace; 387 stackTraceParameter.staticElement = stackTrace;
387 } 388 }
388 } 389 }
389 return super.visitCatchClause(node); 390 return super.visitCatchClause(node);
390 } 391 }
391 392
392 @override 393 @override
393 Object visitClassDeclaration(ClassDeclaration node) { 394 Object visitClassDeclaration(ClassDeclaration node) {
394 ElementHolder holder = new ElementHolder(); 395 ElementHolder holder = new ElementHolder();
(...skipping 11 matching lines...) Expand all
406 _buildFieldMap(holder.fieldsWithoutFlushing); 407 _buildFieldMap(holder.fieldsWithoutFlushing);
407 int count = nonFields.length; 408 int count = nonFields.length;
408 for (int i = 0; i < count; i++) { 409 for (int i = 0; i < count; i++) {
409 nonFields[i].accept(this); 410 nonFields[i].accept(this);
410 } 411 }
411 } finally { 412 } finally {
412 _currentHolder = previousHolder; 413 _currentHolder = previousHolder;
413 } 414 }
414 SimpleIdentifier className = node.name; 415 SimpleIdentifier className = node.name;
415 ClassElementImpl element = new ClassElementImpl.forNode(className); 416 ClassElementImpl element = new ClassElementImpl.forNode(className);
417 _setCodeRange(element, node);
416 element.metadata = _createElementAnnotations(node.metadata); 418 element.metadata = _createElementAnnotations(node.metadata);
417 List<TypeParameterElement> typeParameters = holder.typeParameters; 419 List<TypeParameterElement> typeParameters = holder.typeParameters;
418 List<DartType> typeArguments = _createTypeParameterTypes(typeParameters); 420 List<DartType> typeArguments = _createTypeParameterTypes(typeParameters);
419 InterfaceTypeImpl interfaceType = new InterfaceTypeImpl(element); 421 InterfaceTypeImpl interfaceType = new InterfaceTypeImpl(element);
420 interfaceType.typeArguments = typeArguments; 422 interfaceType.typeArguments = typeArguments;
421 element.type = interfaceType; 423 element.type = interfaceType;
422 element.typeParameters = typeParameters; 424 element.typeParameters = typeParameters;
423 setElementDocumentationComment(element, node); 425 setElementDocumentationComment(element, node);
424 element.abstract = node.isAbstract; 426 element.abstract = node.isAbstract;
425 element.accessors = holder.accessors; 427 element.accessors = holder.accessors;
(...skipping 29 matching lines...) Expand all
455 ClassElement classElement = node.element; 457 ClassElement classElement = node.element;
456 _buildFieldMap(classElement.fields); 458 _buildFieldMap(classElement.fields);
457 } 459 }
458 460
459 @override 461 @override
460 Object visitClassTypeAlias(ClassTypeAlias node) { 462 Object visitClassTypeAlias(ClassTypeAlias node) {
461 ElementHolder holder = new ElementHolder(); 463 ElementHolder holder = new ElementHolder();
462 _visitChildren(holder, node); 464 _visitChildren(holder, node);
463 SimpleIdentifier className = node.name; 465 SimpleIdentifier className = node.name;
464 ClassElementImpl element = new ClassElementImpl.forNode(className); 466 ClassElementImpl element = new ClassElementImpl.forNode(className);
467 _setCodeRange(element, node);
465 element.metadata = _createElementAnnotations(node.metadata); 468 element.metadata = _createElementAnnotations(node.metadata);
466 element.abstract = node.abstractKeyword != null; 469 element.abstract = node.abstractKeyword != null;
467 element.mixinApplication = true; 470 element.mixinApplication = true;
468 List<TypeParameterElement> typeParameters = holder.typeParameters; 471 List<TypeParameterElement> typeParameters = holder.typeParameters;
469 element.typeParameters = typeParameters; 472 element.typeParameters = typeParameters;
470 List<DartType> typeArguments = _createTypeParameterTypes(typeParameters); 473 List<DartType> typeArguments = _createTypeParameterTypes(typeParameters);
471 InterfaceTypeImpl interfaceType = new InterfaceTypeImpl(element); 474 InterfaceTypeImpl interfaceType = new InterfaceTypeImpl(element);
472 interfaceType.typeArguments = typeArguments; 475 interfaceType.typeArguments = typeArguments;
473 element.type = interfaceType; 476 element.type = interfaceType;
474 setElementDocumentationComment(element, node); 477 setElementDocumentationComment(element, node);
475 _currentHolder.addType(element); 478 _currentHolder.addType(element);
476 className.staticElement = element; 479 className.staticElement = element;
477 holder.validate(); 480 holder.validate();
478 return null; 481 return null;
479 } 482 }
480 483
481 @override 484 @override
485 Object visitCompilationUnit(CompilationUnit node) {
486 if (compilationUnitElement is ElementImpl) {
487 _setCodeRange(compilationUnitElement as ElementImpl, node);
488 }
489 return super.visitCompilationUnit(node);
490 }
491
492 @override
482 Object visitConstructorDeclaration(ConstructorDeclaration node) { 493 Object visitConstructorDeclaration(ConstructorDeclaration node) {
483 ElementHolder holder = new ElementHolder(); 494 ElementHolder holder = new ElementHolder();
484 bool wasInFunction = _inFunction; 495 bool wasInFunction = _inFunction;
485 _inFunction = true; 496 _inFunction = true;
486 try { 497 try {
487 _visitChildren(holder, node); 498 _visitChildren(holder, node);
488 } finally { 499 } finally {
489 _inFunction = wasInFunction; 500 _inFunction = wasInFunction;
490 } 501 }
491 FunctionBody body = node.body; 502 FunctionBody body = node.body;
492 SimpleIdentifier constructorName = node.name; 503 SimpleIdentifier constructorName = node.name;
493 ConstructorElementImpl element = 504 ConstructorElementImpl element =
494 new ConstructorElementImpl.forNode(constructorName); 505 new ConstructorElementImpl.forNode(constructorName);
506 _setCodeRange(element, node);
495 element.metadata = _createElementAnnotations(node.metadata); 507 element.metadata = _createElementAnnotations(node.metadata);
496 setElementDocumentationComment(element, node); 508 setElementDocumentationComment(element, node);
497 if (node.externalKeyword != null) { 509 if (node.externalKeyword != null) {
498 element.external = true; 510 element.external = true;
499 } 511 }
500 if (node.factoryKeyword != null) { 512 if (node.factoryKeyword != null) {
501 element.factory = true; 513 element.factory = true;
502 } 514 }
503 element.functions = holder.functions; 515 element.functions = holder.functions;
504 element.labels = holder.labels; 516 element.labels = holder.labels;
(...skipping 21 matching lines...) Expand all
526 } 538 }
527 holder.validate(); 539 holder.validate();
528 return null; 540 return null;
529 } 541 }
530 542
531 @override 543 @override
532 Object visitDeclaredIdentifier(DeclaredIdentifier node) { 544 Object visitDeclaredIdentifier(DeclaredIdentifier node) {
533 SimpleIdentifier variableName = node.identifier; 545 SimpleIdentifier variableName = node.identifier;
534 LocalVariableElementImpl element = 546 LocalVariableElementImpl element =
535 new LocalVariableElementImpl.forNode(variableName); 547 new LocalVariableElementImpl.forNode(variableName);
548 _setCodeRange(element, node);
536 element.metadata = _createElementAnnotations(node.metadata); 549 element.metadata = _createElementAnnotations(node.metadata);
537 ForEachStatement statement = node.parent as ForEachStatement; 550 ForEachStatement statement = node.parent as ForEachStatement;
538 int declarationEnd = node.offset + node.length; 551 int declarationEnd = node.offset + node.length;
539 int statementEnd = statement.offset + statement.length; 552 int statementEnd = statement.offset + statement.length;
540 element.setVisibleRange(declarationEnd, statementEnd - declarationEnd - 1); 553 element.setVisibleRange(declarationEnd, statementEnd - declarationEnd - 1);
541 element.const3 = node.isConst; 554 element.const3 = node.isConst;
542 element.final2 = node.isFinal; 555 element.final2 = node.isFinal;
543 if (node.type == null) { 556 if (node.type == null) {
544 element.hasImplicitType = true; 557 element.hasImplicitType = true;
545 } 558 }
(...skipping 12 matching lines...) Expand all
558 parameter = 571 parameter =
559 new DefaultFieldFormalParameterElementImpl.forNode(parameterName); 572 new DefaultFieldFormalParameterElementImpl.forNode(parameterName);
560 FieldElement field = 573 FieldElement field =
561 _fieldMap == null ? null : _fieldMap[parameterName.name]; 574 _fieldMap == null ? null : _fieldMap[parameterName.name];
562 if (field != null) { 575 if (field != null) {
563 (parameter as DefaultFieldFormalParameterElementImpl).field = field; 576 (parameter as DefaultFieldFormalParameterElementImpl).field = field;
564 } 577 }
565 } else { 578 } else {
566 parameter = new DefaultParameterElementImpl.forNode(parameterName); 579 parameter = new DefaultParameterElementImpl.forNode(parameterName);
567 } 580 }
581 _setCodeRange(parameter, node);
568 parameter.const3 = node.isConst; 582 parameter.const3 = node.isConst;
569 parameter.final2 = node.isFinal; 583 parameter.final2 = node.isFinal;
570 parameter.parameterKind = node.kind; 584 parameter.parameterKind = node.kind;
571 // set initializer, default value range 585 // set initializer, default value range
572 Expression defaultValue = node.defaultValue; 586 Expression defaultValue = node.defaultValue;
573 if (defaultValue != null) { 587 if (defaultValue != null) {
574 _visit(holder, defaultValue); 588 _visit(holder, defaultValue);
575 FunctionElementImpl initializer = 589 FunctionElementImpl initializer =
576 new FunctionElementImpl.forOffset(defaultValue.beginToken.offset); 590 new FunctionElementImpl.forOffset(defaultValue.beginToken.offset);
577 initializer.hasImplicitReturnType = true; 591 initializer.hasImplicitReturnType = true;
(...skipping 16 matching lines...) Expand all
594 parameterName.staticElement = parameter; 608 parameterName.staticElement = parameter;
595 normalParameter.accept(this); 609 normalParameter.accept(this);
596 holder.validate(); 610 holder.validate();
597 return null; 611 return null;
598 } 612 }
599 613
600 @override 614 @override
601 Object visitEnumDeclaration(EnumDeclaration node) { 615 Object visitEnumDeclaration(EnumDeclaration node) {
602 SimpleIdentifier enumName = node.name; 616 SimpleIdentifier enumName = node.name;
603 ClassElementImpl enumElement = new ClassElementImpl.forNode(enumName); 617 ClassElementImpl enumElement = new ClassElementImpl.forNode(enumName);
618 _setCodeRange(enumElement, node);
604 enumElement.metadata = _createElementAnnotations(node.metadata); 619 enumElement.metadata = _createElementAnnotations(node.metadata);
605 enumElement.enum2 = true; 620 enumElement.enum2 = true;
606 setElementDocumentationComment(enumElement, node); 621 setElementDocumentationComment(enumElement, node);
607 InterfaceTypeImpl enumType = new InterfaceTypeImpl(enumElement); 622 InterfaceTypeImpl enumType = new InterfaceTypeImpl(enumElement);
608 enumElement.type = enumType; 623 enumElement.type = enumType;
609 // The equivalent code for enums in the spec shows a single constructor, 624 // The equivalent code for enums in the spec shows a single constructor,
610 // but that constructor is not callable (since it is a compile-time error 625 // but that constructor is not callable (since it is a compile-time error
611 // to subclass, mix-in, implement, or explicitly instantiate an enum). So 626 // to subclass, mix-in, implement, or explicitly instantiate an enum). So
612 // we represent this as having no constructors. 627 // we represent this as having no constructors.
613 enumElement.constructors = ConstructorElement.EMPTY_LIST; 628 enumElement.constructors = ConstructorElement.EMPTY_LIST;
614 _currentHolder.addEnum(enumElement); 629 _currentHolder.addEnum(enumElement);
615 enumName.staticElement = enumElement; 630 enumName.staticElement = enumElement;
616 return super.visitEnumDeclaration(node); 631 return super.visitEnumDeclaration(node);
617 } 632 }
618 633
619 @override 634 @override
620 Object visitExportDirective(ExportDirective node) { 635 Object visitExportDirective(ExportDirective node) {
621 _createElementAnnotations(node.metadata); 636 _createElementAnnotations(node.metadata);
622 return super.visitExportDirective(node); 637 return super.visitExportDirective(node);
623 } 638 }
624 639
625 @override 640 @override
626 Object visitFieldFormalParameter(FieldFormalParameter node) { 641 Object visitFieldFormalParameter(FieldFormalParameter node) {
627 if (node.parent is! DefaultFormalParameter) { 642 if (node.parent is! DefaultFormalParameter) {
628 SimpleIdentifier parameterName = node.identifier; 643 SimpleIdentifier parameterName = node.identifier;
629 FieldElement field = 644 FieldElement field =
630 _fieldMap == null ? null : _fieldMap[parameterName.name]; 645 _fieldMap == null ? null : _fieldMap[parameterName.name];
631 FieldFormalParameterElementImpl parameter = 646 FieldFormalParameterElementImpl parameter =
632 new FieldFormalParameterElementImpl.forNode(parameterName); 647 new FieldFormalParameterElementImpl.forNode(parameterName);
648 _setCodeRange(parameter, node);
633 parameter.const3 = node.isConst; 649 parameter.const3 = node.isConst;
634 parameter.final2 = node.isFinal; 650 parameter.final2 = node.isFinal;
635 parameter.parameterKind = node.kind; 651 parameter.parameterKind = node.kind;
636 if (field != null) { 652 if (field != null) {
637 parameter.field = field; 653 parameter.field = field;
638 } 654 }
639 _currentHolder.addParameter(parameter); 655 _currentHolder.addParameter(parameter);
640 parameterName.staticElement = parameter; 656 parameterName.staticElement = parameter;
641 } 657 }
642 // 658 //
(...skipping 21 matching lines...) Expand all
664 _visitChildren(holder, node); 680 _visitChildren(holder, node);
665 } finally { 681 } finally {
666 _inFunction = wasInFunction; 682 _inFunction = wasInFunction;
667 } 683 }
668 FunctionBody body = expression.body; 684 FunctionBody body = expression.body;
669 Token property = node.propertyKeyword; 685 Token property = node.propertyKeyword;
670 if (property == null || _inFunction) { 686 if (property == null || _inFunction) {
671 SimpleIdentifier functionName = node.name; 687 SimpleIdentifier functionName = node.name;
672 FunctionElementImpl element = 688 FunctionElementImpl element =
673 new FunctionElementImpl.forNode(functionName); 689 new FunctionElementImpl.forNode(functionName);
690 _setCodeRange(element, node);
674 element.metadata = _createElementAnnotations(node.metadata); 691 element.metadata = _createElementAnnotations(node.metadata);
675 setElementDocumentationComment(element, node); 692 setElementDocumentationComment(element, node);
676 if (node.externalKeyword != null) { 693 if (node.externalKeyword != null) {
677 element.external = true; 694 element.external = true;
678 } 695 }
679 element.functions = holder.functions; 696 element.functions = holder.functions;
680 element.labels = holder.labels; 697 element.labels = holder.labels;
681 element.localVariables = holder.localVariables; 698 element.localVariables = holder.localVariables;
682 element.parameters = holder.parameters; 699 element.parameters = holder.parameters;
683 element.typeParameters = holder.typeParameters; 700 element.typeParameters = holder.typeParameters;
(...skipping 27 matching lines...) Expand all
711 .getTopLevelVariable(propertyName) as TopLevelVariableElementImpl; 728 .getTopLevelVariable(propertyName) as TopLevelVariableElementImpl;
712 if (variable == null) { 729 if (variable == null) {
713 variable = new TopLevelVariableElementImpl(node.name.name, -1); 730 variable = new TopLevelVariableElementImpl(node.name.name, -1);
714 variable.final2 = true; 731 variable.final2 = true;
715 variable.synthetic = true; 732 variable.synthetic = true;
716 _currentHolder.addTopLevelVariable(variable); 733 _currentHolder.addTopLevelVariable(variable);
717 } 734 }
718 if (node.isGetter) { 735 if (node.isGetter) {
719 PropertyAccessorElementImpl getter = 736 PropertyAccessorElementImpl getter =
720 new PropertyAccessorElementImpl.forNode(propertyNameNode); 737 new PropertyAccessorElementImpl.forNode(propertyNameNode);
738 _setCodeRange(getter, node);
721 getter.metadata = _createElementAnnotations(node.metadata); 739 getter.metadata = _createElementAnnotations(node.metadata);
722 setElementDocumentationComment(getter, node); 740 setElementDocumentationComment(getter, node);
723 if (node.externalKeyword != null) { 741 if (node.externalKeyword != null) {
724 getter.external = true; 742 getter.external = true;
725 } 743 }
726 getter.functions = holder.functions; 744 getter.functions = holder.functions;
727 getter.labels = holder.labels; 745 getter.labels = holder.labels;
728 getter.localVariables = holder.localVariables; 746 getter.localVariables = holder.localVariables;
729 if (body.isAsynchronous) { 747 if (body.isAsynchronous) {
730 getter.asynchronous = true; 748 getter.asynchronous = true;
731 } 749 }
732 if (body.isGenerator) { 750 if (body.isGenerator) {
733 getter.generator = true; 751 getter.generator = true;
734 } 752 }
735 getter.variable = variable; 753 getter.variable = variable;
736 getter.getter = true; 754 getter.getter = true;
737 getter.static = true; 755 getter.static = true;
738 variable.getter = getter; 756 variable.getter = getter;
739 if (node.returnType == null) { 757 if (node.returnType == null) {
740 getter.hasImplicitReturnType = true; 758 getter.hasImplicitReturnType = true;
741 } 759 }
742 _currentHolder.addAccessor(getter); 760 _currentHolder.addAccessor(getter);
743 expression.element = getter; 761 expression.element = getter;
744 propertyNameNode.staticElement = getter; 762 propertyNameNode.staticElement = getter;
745 } else { 763 } else {
746 PropertyAccessorElementImpl setter = 764 PropertyAccessorElementImpl setter =
747 new PropertyAccessorElementImpl.forNode(propertyNameNode); 765 new PropertyAccessorElementImpl.forNode(propertyNameNode);
766 _setCodeRange(setter, node);
748 setter.metadata = _createElementAnnotations(node.metadata); 767 setter.metadata = _createElementAnnotations(node.metadata);
749 setElementDocumentationComment(setter, node); 768 setElementDocumentationComment(setter, node);
750 if (node.externalKeyword != null) { 769 if (node.externalKeyword != null) {
751 setter.external = true; 770 setter.external = true;
752 } 771 }
753 setter.functions = holder.functions; 772 setter.functions = holder.functions;
754 setter.labels = holder.labels; 773 setter.labels = holder.labels;
755 setter.localVariables = holder.localVariables; 774 setter.localVariables = holder.localVariables;
756 setter.parameters = holder.parameters; 775 setter.parameters = holder.parameters;
757 if (body.isAsynchronous) { 776 if (body.isAsynchronous) {
(...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after
789 bool wasInFunction = _inFunction; 808 bool wasInFunction = _inFunction;
790 _inFunction = true; 809 _inFunction = true;
791 try { 810 try {
792 _visitChildren(holder, node); 811 _visitChildren(holder, node);
793 } finally { 812 } finally {
794 _inFunction = wasInFunction; 813 _inFunction = wasInFunction;
795 } 814 }
796 FunctionBody body = node.body; 815 FunctionBody body = node.body;
797 FunctionElementImpl element = 816 FunctionElementImpl element =
798 new FunctionElementImpl.forOffset(node.beginToken.offset); 817 new FunctionElementImpl.forOffset(node.beginToken.offset);
818 _setCodeRange(element, node);
799 element.functions = holder.functions; 819 element.functions = holder.functions;
800 element.labels = holder.labels; 820 element.labels = holder.labels;
801 element.localVariables = holder.localVariables; 821 element.localVariables = holder.localVariables;
802 element.parameters = holder.parameters; 822 element.parameters = holder.parameters;
803 element.typeParameters = holder.typeParameters; 823 element.typeParameters = holder.typeParameters;
804 if (body.isAsynchronous) { 824 if (body.isAsynchronous) {
805 element.asynchronous = true; 825 element.asynchronous = true;
806 } 826 }
807 if (body.isGenerator) { 827 if (body.isGenerator) {
808 element.generator = true; 828 element.generator = true;
(...skipping 18 matching lines...) Expand all
827 847
828 @override 848 @override
829 Object visitFunctionTypeAlias(FunctionTypeAlias node) { 849 Object visitFunctionTypeAlias(FunctionTypeAlias node) {
830 ElementHolder holder = new ElementHolder(); 850 ElementHolder holder = new ElementHolder();
831 _visitChildren(holder, node); 851 _visitChildren(holder, node);
832 SimpleIdentifier aliasName = node.name; 852 SimpleIdentifier aliasName = node.name;
833 List<ParameterElement> parameters = holder.parameters; 853 List<ParameterElement> parameters = holder.parameters;
834 List<TypeParameterElement> typeParameters = holder.typeParameters; 854 List<TypeParameterElement> typeParameters = holder.typeParameters;
835 FunctionTypeAliasElementImpl element = 855 FunctionTypeAliasElementImpl element =
836 new FunctionTypeAliasElementImpl.forNode(aliasName); 856 new FunctionTypeAliasElementImpl.forNode(aliasName);
857 _setCodeRange(element, node);
837 element.metadata = _createElementAnnotations(node.metadata); 858 element.metadata = _createElementAnnotations(node.metadata);
838 setElementDocumentationComment(element, node); 859 setElementDocumentationComment(element, node);
839 element.parameters = parameters; 860 element.parameters = parameters;
840 element.typeParameters = typeParameters; 861 element.typeParameters = typeParameters;
841 _createTypeParameterTypes(typeParameters); 862 _createTypeParameterTypes(typeParameters);
842 element.type = new FunctionTypeImpl.forTypedef(element); 863 element.type = new FunctionTypeImpl.forTypedef(element);
843 _currentHolder.addTypeAlias(element); 864 _currentHolder.addTypeAlias(element);
844 aliasName.staticElement = element; 865 aliasName.staticElement = element;
845 holder.validate(); 866 holder.validate();
846 return null; 867 return null;
847 } 868 }
848 869
849 @override 870 @override
850 Object visitFunctionTypedFormalParameter(FunctionTypedFormalParameter node) { 871 Object visitFunctionTypedFormalParameter(FunctionTypedFormalParameter node) {
851 if (node.parent is! DefaultFormalParameter) { 872 if (node.parent is! DefaultFormalParameter) {
852 SimpleIdentifier parameterName = node.identifier; 873 SimpleIdentifier parameterName = node.identifier;
853 ParameterElementImpl parameter = 874 ParameterElementImpl parameter =
854 new ParameterElementImpl.forNode(parameterName); 875 new ParameterElementImpl.forNode(parameterName);
876 _setCodeRange(parameter, node);
855 parameter.parameterKind = node.kind; 877 parameter.parameterKind = node.kind;
856 _setParameterVisibleRange(node, parameter); 878 _setParameterVisibleRange(node, parameter);
857 _currentHolder.addParameter(parameter); 879 _currentHolder.addParameter(parameter);
858 parameterName.staticElement = parameter; 880 parameterName.staticElement = parameter;
859 } 881 }
860 // 882 //
861 // The children of this parameter include any parameters defined on the type 883 // The children of this parameter include any parameters defined on the type
862 //of this parameter. 884 //of this parameter.
863 // 885 //
864 ElementHolder holder = new ElementHolder(); 886 ElementHolder holder = new ElementHolder();
(...skipping 12 matching lines...) Expand all
877 return super.visitImportDirective(node); 899 return super.visitImportDirective(node);
878 } 900 }
879 901
880 @override 902 @override
881 Object visitLabeledStatement(LabeledStatement node) { 903 Object visitLabeledStatement(LabeledStatement node) {
882 bool onSwitchStatement = node.statement is SwitchStatement; 904 bool onSwitchStatement = node.statement is SwitchStatement;
883 for (Label label in node.labels) { 905 for (Label label in node.labels) {
884 SimpleIdentifier labelName = label.label; 906 SimpleIdentifier labelName = label.label;
885 LabelElementImpl element = 907 LabelElementImpl element =
886 new LabelElementImpl.forNode(labelName, onSwitchStatement, false); 908 new LabelElementImpl.forNode(labelName, onSwitchStatement, false);
909 _setCodeRange(element, node);
887 _currentHolder.addLabel(element); 910 _currentHolder.addLabel(element);
888 labelName.staticElement = element; 911 labelName.staticElement = element;
889 } 912 }
890 return super.visitLabeledStatement(node); 913 return super.visitLabeledStatement(node);
891 } 914 }
892 915
893 @override 916 @override
894 Object visitLibraryDirective(LibraryDirective node) { 917 Object visitLibraryDirective(LibraryDirective node) {
895 _createElementAnnotations(node.metadata); 918 _createElementAnnotations(node.metadata);
896 return super.visitLibraryDirective(node); 919 return super.visitLibraryDirective(node);
(...skipping 15 matching lines...) Expand all
912 FunctionBody body = node.body; 935 FunctionBody body = node.body;
913 if (property == null) { 936 if (property == null) {
914 SimpleIdentifier methodName = node.name; 937 SimpleIdentifier methodName = node.name;
915 String nameOfMethod = methodName.name; 938 String nameOfMethod = methodName.name;
916 if (nameOfMethod == TokenType.MINUS.lexeme && 939 if (nameOfMethod == TokenType.MINUS.lexeme &&
917 node.parameters.parameters.length == 0) { 940 node.parameters.parameters.length == 0) {
918 nameOfMethod = "unary-"; 941 nameOfMethod = "unary-";
919 } 942 }
920 MethodElementImpl element = 943 MethodElementImpl element =
921 new MethodElementImpl(nameOfMethod, methodName.offset); 944 new MethodElementImpl(nameOfMethod, methodName.offset);
945 _setCodeRange(element, node);
922 element.metadata = _createElementAnnotations(node.metadata); 946 element.metadata = _createElementAnnotations(node.metadata);
923 setElementDocumentationComment(element, node); 947 setElementDocumentationComment(element, node);
924 element.abstract = node.isAbstract; 948 element.abstract = node.isAbstract;
925 if (node.externalKeyword != null) { 949 if (node.externalKeyword != null) {
926 element.external = true; 950 element.external = true;
927 } 951 }
928 element.functions = holder.functions; 952 element.functions = holder.functions;
929 element.labels = holder.labels; 953 element.labels = holder.labels;
930 element.localVariables = holder.localVariables; 954 element.localVariables = holder.localVariables;
931 element.parameters = holder.parameters; 955 element.parameters = holder.parameters;
(...skipping 18 matching lines...) Expand all
950 if (field == null) { 974 if (field == null) {
951 field = new FieldElementImpl(node.name.name, -1); 975 field = new FieldElementImpl(node.name.name, -1);
952 field.final2 = true; 976 field.final2 = true;
953 field.static = isStatic; 977 field.static = isStatic;
954 field.synthetic = true; 978 field.synthetic = true;
955 _currentHolder.addField(field); 979 _currentHolder.addField(field);
956 } 980 }
957 if (node.isGetter) { 981 if (node.isGetter) {
958 PropertyAccessorElementImpl getter = 982 PropertyAccessorElementImpl getter =
959 new PropertyAccessorElementImpl.forNode(propertyNameNode); 983 new PropertyAccessorElementImpl.forNode(propertyNameNode);
984 _setCodeRange(getter, node);
960 getter.metadata = _createElementAnnotations(node.metadata); 985 getter.metadata = _createElementAnnotations(node.metadata);
961 setElementDocumentationComment(getter, node); 986 setElementDocumentationComment(getter, node);
962 if (node.externalKeyword != null) { 987 if (node.externalKeyword != null) {
963 getter.external = true; 988 getter.external = true;
964 } 989 }
965 getter.functions = holder.functions; 990 getter.functions = holder.functions;
966 getter.labels = holder.labels; 991 getter.labels = holder.labels;
967 getter.localVariables = holder.localVariables; 992 getter.localVariables = holder.localVariables;
968 if (body.isAsynchronous) { 993 if (body.isAsynchronous) {
969 getter.asynchronous = true; 994 getter.asynchronous = true;
970 } 995 }
971 if (body.isGenerator) { 996 if (body.isGenerator) {
972 getter.generator = true; 997 getter.generator = true;
973 } 998 }
974 getter.variable = field; 999 getter.variable = field;
975 getter.abstract = node.isAbstract; 1000 getter.abstract = node.isAbstract;
976 getter.getter = true; 1001 getter.getter = true;
977 getter.static = isStatic; 1002 getter.static = isStatic;
978 field.getter = getter; 1003 field.getter = getter;
979 if (node.returnType == null) { 1004 if (node.returnType == null) {
980 getter.hasImplicitReturnType = true; 1005 getter.hasImplicitReturnType = true;
981 } 1006 }
982 _currentHolder.addAccessor(getter); 1007 _currentHolder.addAccessor(getter);
983 propertyNameNode.staticElement = getter; 1008 propertyNameNode.staticElement = getter;
984 } else { 1009 } else {
985 PropertyAccessorElementImpl setter = 1010 PropertyAccessorElementImpl setter =
986 new PropertyAccessorElementImpl.forNode(propertyNameNode); 1011 new PropertyAccessorElementImpl.forNode(propertyNameNode);
1012 _setCodeRange(setter, node);
987 setter.metadata = _createElementAnnotations(node.metadata); 1013 setter.metadata = _createElementAnnotations(node.metadata);
988 setElementDocumentationComment(setter, node); 1014 setElementDocumentationComment(setter, node);
989 if (node.externalKeyword != null) { 1015 if (node.externalKeyword != null) {
990 setter.external = true; 1016 setter.external = true;
991 } 1017 }
992 setter.functions = holder.functions; 1018 setter.functions = holder.functions;
993 setter.labels = holder.labels; 1019 setter.labels = holder.labels;
994 setter.localVariables = holder.localVariables; 1020 setter.localVariables = holder.localVariables;
995 setter.parameters = holder.parameters; 1021 setter.parameters = holder.parameters;
996 if (body.isAsynchronous) { 1022 if (body.isAsynchronous) {
(...skipping 58 matching lines...) Expand 10 before | Expand all | Expand 10 after
1055 _createElementAnnotations(node.metadata); 1081 _createElementAnnotations(node.metadata);
1056 return super.visitPartDirective(node); 1082 return super.visitPartDirective(node);
1057 } 1083 }
1058 1084
1059 @override 1085 @override
1060 Object visitSimpleFormalParameter(SimpleFormalParameter node) { 1086 Object visitSimpleFormalParameter(SimpleFormalParameter node) {
1061 if (node.parent is! DefaultFormalParameter) { 1087 if (node.parent is! DefaultFormalParameter) {
1062 SimpleIdentifier parameterName = node.identifier; 1088 SimpleIdentifier parameterName = node.identifier;
1063 ParameterElementImpl parameter = 1089 ParameterElementImpl parameter =
1064 new ParameterElementImpl.forNode(parameterName); 1090 new ParameterElementImpl.forNode(parameterName);
1091 _setCodeRange(parameter, node);
1065 parameter.const3 = node.isConst; 1092 parameter.const3 = node.isConst;
1066 parameter.final2 = node.isFinal; 1093 parameter.final2 = node.isFinal;
1067 parameter.parameterKind = node.kind; 1094 parameter.parameterKind = node.kind;
1068 _setParameterVisibleRange(node, parameter); 1095 _setParameterVisibleRange(node, parameter);
1069 if (node.type == null) { 1096 if (node.type == null) {
1070 parameter.hasImplicitType = true; 1097 parameter.hasImplicitType = true;
1071 } 1098 }
1072 _currentHolder.addParameter(parameter); 1099 _currentHolder.addParameter(parameter);
1073 parameterName.staticElement = parameter; 1100 parameterName.staticElement = parameter;
1074 } 1101 }
(...skipping 25 matching lines...) Expand all
1100 labelName.staticElement = element; 1127 labelName.staticElement = element;
1101 } 1128 }
1102 return super.visitSwitchDefault(node); 1129 return super.visitSwitchDefault(node);
1103 } 1130 }
1104 1131
1105 @override 1132 @override
1106 Object visitTypeParameter(TypeParameter node) { 1133 Object visitTypeParameter(TypeParameter node) {
1107 SimpleIdentifier parameterName = node.name; 1134 SimpleIdentifier parameterName = node.name;
1108 TypeParameterElementImpl typeParameter = 1135 TypeParameterElementImpl typeParameter =
1109 new TypeParameterElementImpl.forNode(parameterName); 1136 new TypeParameterElementImpl.forNode(parameterName);
1137 _setCodeRange(typeParameter, node);
1110 typeParameter.metadata = _createElementAnnotations(node.metadata); 1138 typeParameter.metadata = _createElementAnnotations(node.metadata);
1111 TypeParameterTypeImpl typeParameterType = 1139 TypeParameterTypeImpl typeParameterType =
1112 new TypeParameterTypeImpl(typeParameter); 1140 new TypeParameterTypeImpl(typeParameter);
1113 typeParameter.type = typeParameterType; 1141 typeParameter.type = typeParameterType;
1114 _currentHolder.addTypeParameter(typeParameter); 1142 _currentHolder.addTypeParameter(typeParameter);
1115 parameterName.staticElement = typeParameter; 1143 parameterName.staticElement = typeParameter;
1116 return super.visitTypeParameter(node); 1144 return super.visitTypeParameter(node);
1117 } 1145 }
1118 1146
1119 @override 1147 @override
1120 Object visitVariableDeclaration(VariableDeclaration node) { 1148 Object visitVariableDeclaration(VariableDeclaration node) {
1121 bool isConst = node.isConst; 1149 bool isConst = node.isConst;
1122 bool isFinal = node.isFinal; 1150 bool isFinal = node.isFinal;
1123 bool hasInitializer = node.initializer != null; 1151 bool hasInitializer = node.initializer != null;
1124 VariableDeclarationList varList = node.parent; 1152 VariableDeclarationList varList = node.parent;
1125 FieldDeclaration fieldNode = 1153 FieldDeclaration fieldNode =
1126 varList.parent is FieldDeclaration ? varList.parent : null; 1154 varList.parent is FieldDeclaration ? varList.parent : null;
1127 VariableElementImpl element; 1155 VariableElementImpl element;
1128 if (fieldNode != null) { 1156 if (fieldNode != null) {
1129 SimpleIdentifier fieldName = node.name; 1157 SimpleIdentifier fieldName = node.name;
1130 FieldElementImpl field; 1158 FieldElementImpl field;
1131 if ((isConst || isFinal && !fieldNode.isStatic) && hasInitializer) { 1159 if ((isConst || isFinal && !fieldNode.isStatic) && hasInitializer) {
1132 field = new ConstFieldElementImpl.forNode(fieldName); 1160 field = new ConstFieldElementImpl.forNode(fieldName);
1133 } else { 1161 } else {
1134 field = new FieldElementImpl.forNode(fieldName); 1162 field = new FieldElementImpl.forNode(fieldName);
1135 } 1163 }
1136 element = field; 1164 element = field;
1137 field.static = fieldNode.isStatic; 1165 field.static = fieldNode.isStatic;
1166 _setCodeRange(element, node);
1138 setElementDocumentationComment(element, fieldNode); 1167 setElementDocumentationComment(element, fieldNode);
1139 field.hasImplicitType = varList.type == null; 1168 field.hasImplicitType = varList.type == null;
1140 _currentHolder.addField(field); 1169 _currentHolder.addField(field);
1141 fieldName.staticElement = field; 1170 fieldName.staticElement = field;
1142 } else if (_inFunction) { 1171 } else if (_inFunction) {
1143 SimpleIdentifier variableName = node.name; 1172 SimpleIdentifier variableName = node.name;
1144 LocalVariableElementImpl variable; 1173 LocalVariableElementImpl variable;
1145 if (isConst && hasInitializer) { 1174 if (isConst && hasInitializer) {
1146 variable = new ConstLocalVariableElementImpl.forNode(variableName); 1175 variable = new ConstLocalVariableElementImpl.forNode(variableName);
1147 } else { 1176 } else {
1148 variable = new LocalVariableElementImpl.forNode(variableName); 1177 variable = new LocalVariableElementImpl.forNode(variableName);
1149 } 1178 }
1150 element = variable; 1179 element = variable;
1180 _setCodeRange(element, node);
1151 Block enclosingBlock = node.getAncestor((node) => node is Block); 1181 Block enclosingBlock = node.getAncestor((node) => node is Block);
1152 // TODO(brianwilkerson) This isn't right for variables declared in a for 1182 // TODO(brianwilkerson) This isn't right for variables declared in a for
1153 // loop. 1183 // loop.
1154 variable.setVisibleRange(enclosingBlock.offset, enclosingBlock.length); 1184 variable.setVisibleRange(enclosingBlock.offset, enclosingBlock.length);
1155 variable.hasImplicitType = varList.type == null; 1185 variable.hasImplicitType = varList.type == null;
1156 _currentHolder.addLocalVariable(variable); 1186 _currentHolder.addLocalVariable(variable);
1157 variableName.staticElement = element; 1187 variableName.staticElement = element;
1158 } else { 1188 } else {
1159 SimpleIdentifier variableName = node.name; 1189 SimpleIdentifier variableName = node.name;
1160 TopLevelVariableElementImpl variable; 1190 TopLevelVariableElementImpl variable;
1161 if (isConst && hasInitializer) { 1191 if (isConst && hasInitializer) {
1162 variable = new ConstTopLevelVariableElementImpl.forNode(variableName); 1192 variable = new ConstTopLevelVariableElementImpl.forNode(variableName);
1163 } else { 1193 } else {
1164 variable = new TopLevelVariableElementImpl.forNode(variableName); 1194 variable = new TopLevelVariableElementImpl.forNode(variableName);
1165 } 1195 }
1166 element = variable; 1196 element = variable;
1197 _setCodeRange(element, node);
1167 if (varList.parent is TopLevelVariableDeclaration) { 1198 if (varList.parent is TopLevelVariableDeclaration) {
1168 setElementDocumentationComment(element, varList.parent); 1199 setElementDocumentationComment(element, varList.parent);
1169 } 1200 }
1170 variable.hasImplicitType = varList.type == null; 1201 variable.hasImplicitType = varList.type == null;
1171 _currentHolder.addTopLevelVariable(variable); 1202 _currentHolder.addTopLevelVariable(variable);
1172 variableName.staticElement = element; 1203 variableName.staticElement = element;
1173 } 1204 }
1174 element.const3 = isConst; 1205 element.const3 = isConst;
1175 element.final2 = isFinal; 1206 element.final2 = isFinal;
1176 if (hasInitializer) { 1207 if (hasInitializer) {
(...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after
1219 List<ElementAnnotation> elementAnnotations; 1250 List<ElementAnnotation> elementAnnotations;
1220 if (parent is FieldDeclaration) { 1251 if (parent is FieldDeclaration) {
1221 elementAnnotations = _createElementAnnotations(parent.metadata); 1252 elementAnnotations = _createElementAnnotations(parent.metadata);
1222 } else if (parent is TopLevelVariableDeclaration) { 1253 } else if (parent is TopLevelVariableDeclaration) {
1223 elementAnnotations = _createElementAnnotations(parent.metadata); 1254 elementAnnotations = _createElementAnnotations(parent.metadata);
1224 } else { 1255 } else {
1225 // Local variable declaration 1256 // Local variable declaration
1226 elementAnnotations = _createElementAnnotations(node.metadata); 1257 elementAnnotations = _createElementAnnotations(node.metadata);
1227 } 1258 }
1228 for (VariableDeclaration variableDeclaration in node.variables) { 1259 for (VariableDeclaration variableDeclaration in node.variables) {
1229 (variableDeclaration.element as ElementImpl).metadata = 1260 ElementImpl element = variableDeclaration.element as ElementImpl;
1230 elementAnnotations; 1261 _setCodeRange(element, node.parent);
1262 element.metadata = elementAnnotations;
1231 } 1263 }
1232 return null; 1264 return null;
1233 } 1265 }
1234 1266
1235 /** 1267 /**
1236 * Build the table mapping field names to field elements for the fields define d in the current 1268 * Build the table mapping field names to field elements for the fields define d in the current
1237 * class. 1269 * class.
1238 * 1270 *
1239 * @param fields the field elements defined in the current class 1271 * @param fields the field elements defined in the current class
1240 */ 1272 */
(...skipping 71 matching lines...) Expand 10 before | Expand all | Expand 10 after
1312 if (parent is ConstructorDeclaration) { 1344 if (parent is ConstructorDeclaration) {
1313 return parent.body; 1345 return parent.body;
1314 } else if (parent is FunctionExpression) { 1346 } else if (parent is FunctionExpression) {
1315 return parent.body; 1347 return parent.body;
1316 } else if (parent is MethodDeclaration) { 1348 } else if (parent is MethodDeclaration) {
1317 return parent.body; 1349 return parent.body;
1318 } 1350 }
1319 return null; 1351 return null;
1320 } 1352 }
1321 1353
1354 void _setCodeRange(ElementImpl element, AstNode node) {
Brian Wilkerson 2016/03/02 00:08:09 Should / could this happen automatically in the 'f
scheglov 2016/03/02 04:57:01 Unfortunately it does not work well for constructo
1355 element.setCodeRange(node.offset, node.length);
1356 }
1357
1322 /** 1358 /**
1323 * Sets the visible source range for formal parameter. 1359 * Sets the visible source range for formal parameter.
1324 */ 1360 */
1325 void _setParameterVisibleRange( 1361 void _setParameterVisibleRange(
1326 FormalParameter node, ParameterElementImpl element) { 1362 FormalParameter node, ParameterElementImpl element) {
1327 FunctionBody body = _getFunctionBody(node); 1363 FunctionBody body = _getFunctionBody(node);
1328 if (body is BlockFunctionBody || body is ExpressionFunctionBody) { 1364 if (body is BlockFunctionBody || body is ExpressionFunctionBody) {
1329 element.setVisibleRange(body.offset, body.length); 1365 element.setVisibleRange(body.offset, body.length);
1330 } 1366 }
1331 } 1367 }
(...skipping 86 matching lines...) Expand 10 before | Expand all | Expand 10 after
1418 return null; 1454 return null;
1419 } 1455 }
1420 1456
1421 /** 1457 /**
1422 * Return the lexical identifiers associated with the given [identifiers]. 1458 * Return the lexical identifiers associated with the given [identifiers].
1423 */ 1459 */
1424 static List<String> _getIdentifiers(NodeList<SimpleIdentifier> identifiers) { 1460 static List<String> _getIdentifiers(NodeList<SimpleIdentifier> identifiers) {
1425 return identifiers.map((identifier) => identifier.name).toList(); 1461 return identifiers.map((identifier) => identifier.name).toList();
1426 } 1462 }
1427 } 1463 }
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