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

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

Issue 2758123002: Create a new element for generic function types (Closed)
Patch Set: Created 3 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
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.element; 5 library analyzer.src.dart.element.element;
6 6
7 import 'dart:collection'; 7 import 'dart:collection';
8 import 'dart:math' show min; 8 import 'dart:math' show min;
9 9
10 import 'package:analyzer/dart/ast/ast.dart'; 10 import 'package:analyzer/dart/ast/ast.dart';
(...skipping 395 matching lines...) Expand 10 before | Expand all | Expand 10 after
406 * An [AbstractClassElementImpl] which is a class. 406 * An [AbstractClassElementImpl] which is a class.
407 */ 407 */
408 class ClassElementImpl extends AbstractClassElementImpl 408 class ClassElementImpl extends AbstractClassElementImpl
409 with TypeParameterizedElementMixin { 409 with TypeParameterizedElementMixin {
410 /** 410 /**
411 * The unlinked representation of the class in the summary. 411 * The unlinked representation of the class in the summary.
412 */ 412 */
413 final UnlinkedClass _unlinkedClass; 413 final UnlinkedClass _unlinkedClass;
414 414
415 /** 415 /**
416 * A list containing all of the type parameters defined for this class.
417 */
418 List<TypeParameterElement> _typeParameters = TypeParameterElement.EMPTY_LIST;
419
420 /**
421 * The superclass of the class, or `null` for [Object]. 416 * The superclass of the class, or `null` for [Object].
422 */ 417 */
423 InterfaceType _supertype; 418 InterfaceType _supertype;
424 419
425 /** 420 /**
426 * The type defined by the class. 421 * The type defined by the class.
427 */ 422 */
428 InterfaceType _type; 423 InterfaceType _type;
429 424
430 /** 425 /**
(...skipping 462 matching lines...) Expand 10 before | Expand all | Expand 10 after
893 @override 888 @override
894 InterfaceType get type { 889 InterfaceType get type {
895 if (_type == null) { 890 if (_type == null) {
896 InterfaceTypeImpl type = new InterfaceTypeImpl(this); 891 InterfaceTypeImpl type = new InterfaceTypeImpl(this);
897 type.typeArguments = typeParameterTypes; 892 type.typeArguments = typeParameterTypes;
898 _type = type; 893 _type = type;
899 } 894 }
900 return _type; 895 return _type;
901 } 896 }
902 897
903 @override
904 TypeParameterizedElementMixin get typeParameterContext => this;
905
906 @override
907 List<TypeParameterElement> get typeParameters {
908 if (_unlinkedClass != null) {
909 return super.typeParameters;
910 }
911 return _typeParameters;
912 }
913
914 /** 898 /**
915 * Set the type parameters defined for this class to the given 899 * Set the type parameters defined for this class to the given
916 * [typeParameters]. 900 * [typeParameters].
917 */ 901 */
918 void set typeParameters(List<TypeParameterElement> typeParameters) { 902 void set typeParameters(List<TypeParameterElement> typeParameters) {
919 _assertNotResynthesized(_unlinkedClass); 903 _assertNotResynthesized(_unlinkedClass);
920 for (TypeParameterElement typeParameter in typeParameters) { 904 for (TypeParameterElement typeParameter in typeParameters) {
921 (typeParameter as TypeParameterElementImpl).enclosingElement = this; 905 (typeParameter as TypeParameterElementImpl).enclosingElement = this;
922 } 906 }
923 this._typeParameters = typeParameters; 907 this._typeParameterElements = typeParameters;
924 } 908 }
925 909
926 @override 910 @override
927 List<UnlinkedTypeParam> get unlinkedTypeParams => 911 List<UnlinkedTypeParam> get unlinkedTypeParams =>
928 _unlinkedClass.typeParameters; 912 _unlinkedClass?.typeParameters;
929 913
930 @override 914 @override
931 ConstructorElement get unnamedConstructor { 915 ConstructorElement get unnamedConstructor {
932 for (ConstructorElement element in constructors) { 916 for (ConstructorElement element in constructors) {
933 String name = element.displayName; 917 String name = element.displayName;
934 if (name == null || name.isEmpty) { 918 if (name == null || name.isEmpty) {
935 return element; 919 return element;
936 } 920 }
937 } 921 }
938 return null; 922 return null;
(...skipping 2212 matching lines...) Expand 10 before | Expand all | Expand 10 after
3151 ResynthesizerContext context = unit.resynthesizerContext; 3135 ResynthesizerContext context = unit.resynthesizerContext;
3152 for (int i = 0; i < length; i++) { 3136 for (int i = 0; i < length; i++) {
3153 annotations[i] = context.buildAnnotation(this, unlinkedConsts[i]); 3137 annotations[i] = context.buildAnnotation(this, unlinkedConsts[i]);
3154 } 3138 }
3155 return annotations; 3139 return annotations;
3156 } else { 3140 } else {
3157 return const <ElementAnnotation>[]; 3141 return const <ElementAnnotation>[];
3158 } 3142 }
3159 } 3143 }
3160 3144
3145 /**
3146 * If the element associated with the given [type] is a generic function type
3147 * element, then make it a child of this element. Return the [type] as a
3148 * convenience.
3149 */
3150 DartType _checkElementOfType(DartType type) {
3151 Element element = type?.element;
3152 if (element is GenericFunctionTypeElementImpl) {
3153 element.enclosingElement = this;
3154 }
3155 return type;
3156 }
3157
3158 /**
3159 * If the given [type] is a generic function type, then the element associated
3160 * with the type is implicitly a child of this element and should be visted by
3161 * the given [visitor].
3162 */
3163 void _safelyVisitPossibleChild(DartType type, ElementVisitor visitor) {
3164 Element element = type?.element;
3165 if (element is GenericFunctionTypeElementImpl) {
3166 element.accept(visitor);
3167 }
3168 }
3169
3161 static int findElementIndexUsingIdentical(List items, Object item) { 3170 static int findElementIndexUsingIdentical(List items, Object item) {
3162 int length = items.length; 3171 int length = items.length;
3163 for (int i = 0; i < length; i++) { 3172 for (int i = 0; i < length; i++) {
3164 if (identical(items[i], item)) { 3173 if (identical(items[i], item)) {
3165 return i; 3174 return i;
3166 } 3175 }
3167 } 3176 }
3168 throw new StateError('Unable to find $item in $items'); 3177 throw new StateError('Unable to find $item in $items');
3169 } 3178 }
3170 } 3179 }
(...skipping 412 matching lines...) Expand 10 before | Expand all | Expand 10 after
3583 * element. 3592 * element.
3584 */ 3593 */
3585 List<LocalVariableElement> _localVariables; 3594 List<LocalVariableElement> _localVariables;
3586 3595
3587 /** 3596 /**
3588 * A list containing all of the parameters defined by this executable element. 3597 * A list containing all of the parameters defined by this executable element.
3589 */ 3598 */
3590 List<ParameterElement> _parameters; 3599 List<ParameterElement> _parameters;
3591 3600
3592 /** 3601 /**
3593 * A list containing all of the type parameters defined for this executable
3594 * element.
3595 */
3596 List<TypeParameterElement> _typeParameters;
3597
3598 /**
3599 * The declared return type of this executable element. 3602 * The declared return type of this executable element.
3600 */ 3603 */
3601 DartType _declaredReturnType; 3604 DartType _declaredReturnType;
3602 3605
3603 /** 3606 /**
3604 * The inferred return type of this executable element. 3607 * The inferred return type of this executable element.
3605 */ 3608 */
3606 DartType _returnType; 3609 DartType _returnType;
3607 3610
3608 /** 3611 /**
(...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after
3651 @override 3654 @override
3652 int get codeOffset { 3655 int get codeOffset {
3653 if (serializedExecutable != null) { 3656 if (serializedExecutable != null) {
3654 return serializedExecutable.codeRange?.offset; 3657 return serializedExecutable.codeRange?.offset;
3655 } 3658 }
3656 return super.codeOffset; 3659 return super.codeOffset;
3657 } 3660 }
3658 3661
3659 void set declaredReturnType(DartType returnType) { 3662 void set declaredReturnType(DartType returnType) {
3660 _assertNotResynthesized(serializedExecutable); 3663 _assertNotResynthesized(serializedExecutable);
3661 _declaredReturnType = returnType; 3664 _declaredReturnType = _checkElementOfType(returnType);
3662 } 3665 }
3663 3666
3664 @override 3667 @override
3665 String get displayName { 3668 String get displayName {
3666 if (serializedExecutable != null) { 3669 if (serializedExecutable != null) {
3667 return serializedExecutable.name; 3670 return serializedExecutable.name;
3668 } 3671 }
3669 return super.displayName; 3672 return super.displayName;
3670 } 3673 }
3671 3674
(...skipping 210 matching lines...) Expand 10 before | Expand all | Expand 10 after
3882 _declaredReturnType = enclosingUnit.resynthesizerContext.resolveTypeRef( 3885 _declaredReturnType = enclosingUnit.resynthesizerContext.resolveTypeRef(
3883 serializedExecutable.returnType, typeParameterContext, 3886 serializedExecutable.returnType, typeParameterContext,
3884 defaultVoid: isSetter && context.analysisOptions.strongMode, 3887 defaultVoid: isSetter && context.analysisOptions.strongMode,
3885 declaredType: true); 3888 declaredType: true);
3886 } 3889 }
3887 return _returnType ?? _declaredReturnType; 3890 return _returnType ?? _declaredReturnType;
3888 } 3891 }
3889 3892
3890 void set returnType(DartType returnType) { 3893 void set returnType(DartType returnType) {
3891 _assertNotResynthesized(serializedExecutable); 3894 _assertNotResynthesized(serializedExecutable);
3892 _returnType = returnType; 3895 _returnType = _checkElementOfType(returnType);
3893 } 3896 }
3894 3897
3895 @override 3898 @override
3896 FunctionType get type { 3899 FunctionType get type {
3897 if (serializedExecutable != null) { 3900 if (serializedExecutable != null) {
3898 _type ??= new FunctionTypeImpl.elementWithNameAndArgs( 3901 _type ??= new FunctionTypeImpl.elementWithNameAndArgs(
3899 this, null, allEnclosingTypeParameterTypes, false); 3902 this, null, allEnclosingTypeParameterTypes, false);
3900 } 3903 }
3901 return _type; 3904 return _type;
3902 } 3905 }
3903 3906
3904 void set type(FunctionType type) { 3907 void set type(FunctionType type) {
3905 _assertNotResynthesized(serializedExecutable); 3908 _assertNotResynthesized(serializedExecutable);
3906 _type = type; 3909 _type = type;
3907 } 3910 }
3908 3911
3909 @override
3910 TypeParameterizedElementMixin get typeParameterContext => this;
3911
3912 @override
3913 List<TypeParameterElement> get typeParameters {
3914 if (serializedExecutable != null) {
3915 return super.typeParameters;
3916 }
3917 return _typeParameters ?? const <TypeParameterElement>[];
3918 }
3919
3920 /** 3912 /**
3921 * Set the type parameters defined by this executable element to the given 3913 * Set the type parameters defined by this executable element to the given
3922 * [typeParameters]. 3914 * [typeParameters].
3923 */ 3915 */
3924 void set typeParameters(List<TypeParameterElement> typeParameters) { 3916 void set typeParameters(List<TypeParameterElement> typeParameters) {
3925 _assertNotResynthesized(serializedExecutable); 3917 _assertNotResynthesized(serializedExecutable);
3926 for (TypeParameterElement parameter in typeParameters) { 3918 for (TypeParameterElement parameter in typeParameters) {
3927 (parameter as TypeParameterElementImpl).enclosingElement = this; 3919 (parameter as TypeParameterElementImpl).enclosingElement = this;
3928 } 3920 }
3929 this._typeParameters = typeParameters; 3921 this._typeParameterElements = typeParameters;
3930 } 3922 }
3931 3923
3932 @override 3924 @override
3933 List<UnlinkedTypeParam> get unlinkedTypeParams => 3925 List<UnlinkedTypeParam> get unlinkedTypeParams =>
3934 serializedExecutable.typeParameters; 3926 serializedExecutable?.typeParameters;
3935 3927
3936 @override 3928 @override
3937 void appendTo(StringBuffer buffer) { 3929 void appendTo(StringBuffer buffer) {
3938 if (this.kind != ElementKind.GETTER) { 3930 if (this.kind != ElementKind.GETTER) {
3939 int typeParameterCount = typeParameters.length; 3931 int typeParameterCount = typeParameters.length;
3940 if (typeParameterCount > 0) { 3932 if (typeParameterCount > 0) {
3941 buffer.write('<'); 3933 buffer.write('<');
3942 for (int i = 0; i < typeParameterCount; i++) { 3934 for (int i = 0; i < typeParameterCount; i++) {
3943 if (i > 0) { 3935 if (i > 0) {
3944 buffer.write(", "); 3936 buffer.write(", ");
(...skipping 65 matching lines...) Expand 10 before | Expand all | Expand 10 after
4010 if (parameterImpl.identifier == identifier) { 4002 if (parameterImpl.identifier == identifier) {
4011 return parameterImpl; 4003 return parameterImpl;
4012 } 4004 }
4013 } 4005 }
4014 return null; 4006 return null;
4015 } 4007 }
4016 4008
4017 @override 4009 @override
4018 void visitChildren(ElementVisitor visitor) { 4010 void visitChildren(ElementVisitor visitor) {
4019 super.visitChildren(visitor); 4011 super.visitChildren(visitor);
4012 _safelyVisitPossibleChild(returnType, visitor);
4020 safelyVisitChildren(typeParameters, visitor); 4013 safelyVisitChildren(typeParameters, visitor);
4021 safelyVisitChildren(parameters, visitor); 4014 safelyVisitChildren(parameters, visitor);
4022 safelyVisitChildren(_functions, visitor); 4015 safelyVisitChildren(functions, visitor);
4023 safelyVisitChildren(_labels, visitor); 4016 safelyVisitChildren(labels, visitor);
4024 safelyVisitChildren(_localVariables, visitor); 4017 safelyVisitChildren(localVariables, visitor);
4025 } 4018 }
4026 } 4019 }
4027 4020
4028 /** 4021 /**
4029 * A concrete implementation of an [ExportElement]. 4022 * A concrete implementation of an [ExportElement].
4030 */ 4023 */
4031 class ExportElementImpl extends UriReferencedElementImpl 4024 class ExportElementImpl extends UriReferencedElementImpl
4032 implements ExportElement { 4025 implements ExportElement {
4033 /** 4026 /**
4034 * The unlinked representation of the export in the summary. 4027 * The unlinked representation of the export in the summary.
(...skipping 463 matching lines...) Expand 10 before | Expand all | Expand 10 after
4498 this._parameters = parameters; 4491 this._parameters = parameters;
4499 } 4492 }
4500 4493
4501 /** 4494 /**
4502 * Set the type parameters defined by this type alias to the given 4495 * Set the type parameters defined by this type alias to the given
4503 * [parameters] without becoming the parent of the parameters. This should 4496 * [parameters] without becoming the parent of the parameters. This should
4504 * only be used by the [TypeResolverVisitor] when creating a synthetic type 4497 * only be used by the [TypeResolverVisitor] when creating a synthetic type
4505 * alias. 4498 * alias.
4506 */ 4499 */
4507 void shareTypeParameters(List<TypeParameterElement> typeParameters) { 4500 void shareTypeParameters(List<TypeParameterElement> typeParameters) {
4508 this._typeParameters = typeParameters; 4501 this._typeParameterElements = typeParameters;
4509 } 4502 }
4510 4503
4511 /** 4504 /**
4512 * Create and return [FunctionElement]s for the given [unlinkedFunctions]. 4505 * Create and return [FunctionElement]s for the given [unlinkedFunctions].
4513 */ 4506 */
4514 static List<FunctionElement> resynthesizeList( 4507 static List<FunctionElement> resynthesizeList(
4515 ExecutableElementImpl executableElement, 4508 ExecutableElementImpl executableElement,
4516 List<UnlinkedExecutable> unlinkedFunctions) { 4509 List<UnlinkedExecutable> unlinkedFunctions) {
4517 int length = unlinkedFunctions.length; 4510 int length = unlinkedFunctions.length;
4518 if (length != 0) { 4511 if (length != 0) {
(...skipping 108 matching lines...) Expand 10 before | Expand all | Expand 10 after
4627 * The return type defined by this type alias. 4620 * The return type defined by this type alias.
4628 */ 4621 */
4629 DartType _returnType; 4622 DartType _returnType;
4630 4623
4631 /** 4624 /**
4632 * The type of function defined by this type alias. 4625 * The type of function defined by this type alias.
4633 */ 4626 */
4634 FunctionType _type; 4627 FunctionType _type;
4635 4628
4636 /** 4629 /**
4637 * A list containing all of the type parameters defined for this type.
4638 */
4639 List<TypeParameterElement> _typeParameters = TypeParameterElement.EMPTY_LIST;
4640
4641 /**
4642 * Initialize a newly created type alias element to have the given name. 4630 * Initialize a newly created type alias element to have the given name.
4643 * 4631 *
4644 * [name] the name of this element 4632 * [name] the name of this element
4645 * [nameOffset] the offset of the name of this element in the file that 4633 * [nameOffset] the offset of the name of this element in the file that
4646 * contains the declaration of this element 4634 * contains the declaration of this element
4647 */ 4635 */
4648 FunctionTypeAliasElementImpl(String name, int nameOffset) 4636 FunctionTypeAliasElementImpl(String name, int nameOffset)
4649 : _unlinkedTypedef = null, 4637 : _unlinkedTypedef = null,
4650 super(name, nameOffset); 4638 super(name, nameOffset);
4651 4639
(...skipping 105 matching lines...) Expand 10 before | Expand all | Expand 10 after
4757 if (_unlinkedTypedef != null && _returnType == null) { 4745 if (_unlinkedTypedef != null && _returnType == null) {
4758 _returnType = enclosingUnit.resynthesizerContext.resolveTypeRef( 4746 _returnType = enclosingUnit.resynthesizerContext.resolveTypeRef(
4759 _unlinkedTypedef.returnType, this, 4747 _unlinkedTypedef.returnType, this,
4760 declaredType: true); 4748 declaredType: true);
4761 } 4749 }
4762 return _returnType; 4750 return _returnType;
4763 } 4751 }
4764 4752
4765 void set returnType(DartType returnType) { 4753 void set returnType(DartType returnType) {
4766 _assertNotResynthesized(_unlinkedTypedef); 4754 _assertNotResynthesized(_unlinkedTypedef);
4767 _returnType = returnType; 4755 _returnType = _checkElementOfType(returnType);
4768 } 4756 }
4769 4757
4770 @override 4758 @override
4771 FunctionType get type { 4759 FunctionType get type {
4772 if (_unlinkedTypedef != null && _type == null) { 4760 if (_unlinkedTypedef != null && _type == null) {
4773 _type = new FunctionTypeImpl.forTypedef(this); 4761 _type = new FunctionTypeImpl.forTypedef(this);
4774 } 4762 }
4775 return _type; 4763 return _type;
4776 } 4764 }
4777 4765
4778 void set type(FunctionType type) { 4766 void set type(FunctionType type) {
4779 _assertNotResynthesized(_unlinkedTypedef); 4767 _assertNotResynthesized(_unlinkedTypedef);
4780 _type = type; 4768 _type = type;
4781 } 4769 }
4782 4770
4783 @override
4784 TypeParameterizedElementMixin get typeParameterContext => this;
4785
4786 @override
4787 List<TypeParameterElement> get typeParameters {
4788 if (_unlinkedTypedef != null) {
4789 return super.typeParameters;
4790 }
4791 return _typeParameters;
4792 }
4793
4794 /** 4771 /**
4795 * Set the type parameters defined for this type to the given 4772 * Set the type parameters defined for this type to the given
4796 * [typeParameters]. 4773 * [typeParameters].
4797 */ 4774 */
4798 void set typeParameters(List<TypeParameterElement> typeParameters) { 4775 void set typeParameters(List<TypeParameterElement> typeParameters) {
4799 _assertNotResynthesized(_unlinkedTypedef); 4776 _assertNotResynthesized(_unlinkedTypedef);
4800 for (TypeParameterElement typeParameter in typeParameters) { 4777 for (TypeParameterElement typeParameter in typeParameters) {
4801 (typeParameter as TypeParameterElementImpl).enclosingElement = this; 4778 (typeParameter as TypeParameterElementImpl).enclosingElement = this;
4802 } 4779 }
4803 this._typeParameters = typeParameters; 4780 this._typeParameterElements = typeParameters;
4804 } 4781 }
4805 4782
4806 @override 4783 @override
4807 List<UnlinkedTypeParam> get unlinkedTypeParams => 4784 List<UnlinkedTypeParam> get unlinkedTypeParams =>
4808 _unlinkedTypedef.typeParameters; 4785 _unlinkedTypedef?.typeParameters;
4809 4786
4810 @override 4787 @override
4811 /*=T*/ accept/*<T>*/(ElementVisitor<dynamic/*=T*/ > visitor) => 4788 /*=T*/ accept/*<T>*/(ElementVisitor<dynamic/*=T*/ > visitor) =>
4812 visitor.visitFunctionTypeAliasElement(this); 4789 visitor.visitFunctionTypeAliasElement(this);
4813 4790
4814 @override 4791 @override
4815 void appendTo(StringBuffer buffer) { 4792 void appendTo(StringBuffer buffer) {
4816 buffer.write("typedef "); 4793 buffer.write("typedef ");
4817 buffer.write(displayName); 4794 buffer.write(displayName);
4818 int typeParameterCount = _typeParameters.length; 4795 List<TypeParameterElement> typeParameters = this.typeParameters;
4796 int typeParameterCount = typeParameters.length;
4819 if (typeParameterCount > 0) { 4797 if (typeParameterCount > 0) {
4820 buffer.write("<"); 4798 buffer.write("<");
4821 for (int i = 0; i < typeParameterCount; i++) { 4799 for (int i = 0; i < typeParameterCount; i++) {
4822 if (i > 0) { 4800 if (i > 0) {
4823 buffer.write(", "); 4801 buffer.write(", ");
4824 } 4802 }
4825 (_typeParameters[i] as TypeParameterElementImpl).appendTo(buffer); 4803 (typeParameters[i] as TypeParameterElementImpl).appendTo(buffer);
4826 } 4804 }
4827 buffer.write(">"); 4805 buffer.write(">");
4828 } 4806 }
4829 buffer.write("("); 4807 buffer.write("(");
4830 List<ParameterElement> parameterList = parameters; 4808 List<ParameterElement> parameterList = parameters;
4831 int parameterCount = parameterList.length; 4809 int parameterCount = parameterList.length;
4832 for (int i = 0; i < parameterCount; i++) { 4810 for (int i = 0; i < parameterCount; i++) {
4833 if (i > 0) { 4811 if (i > 0) {
4834 buffer.write(", "); 4812 buffer.write(", ");
4835 } 4813 }
(...skipping 14 matching lines...) Expand all
4850 getNodeMatching((node) => node is FunctionTypeAlias); 4828 getNodeMatching((node) => node is FunctionTypeAlias);
4851 4829
4852 @override 4830 @override
4853 ElementImpl getChild(String identifier) { 4831 ElementImpl getChild(String identifier) {
4854 for (ParameterElement parameter in parameters) { 4832 for (ParameterElement parameter in parameters) {
4855 ParameterElementImpl parameterImpl = parameter; 4833 ParameterElementImpl parameterImpl = parameter;
4856 if (parameterImpl.identifier == identifier) { 4834 if (parameterImpl.identifier == identifier) {
4857 return parameterImpl; 4835 return parameterImpl;
4858 } 4836 }
4859 } 4837 }
4860 for (TypeParameterElement typeParameter in _typeParameters) { 4838 for (TypeParameterElement typeParameter in typeParameters) {
4861 TypeParameterElementImpl typeParameterImpl = typeParameter; 4839 TypeParameterElementImpl typeParameterImpl = typeParameter;
4862 if (typeParameterImpl.identifier == identifier) { 4840 if (typeParameterImpl.identifier == identifier) {
4863 return typeParameterImpl; 4841 return typeParameterImpl;
4864 } 4842 }
4865 } 4843 }
4866 return null; 4844 return null;
4867 } 4845 }
4868 4846
4869 @override 4847 @override
4870 void visitChildren(ElementVisitor visitor) { 4848 void visitChildren(ElementVisitor visitor) {
4871 super.visitChildren(visitor); 4849 super.visitChildren(visitor);
4850 _safelyVisitPossibleChild(returnType, visitor);
4872 safelyVisitChildren(parameters, visitor); 4851 safelyVisitChildren(parameters, visitor);
4873 safelyVisitChildren(typeParameters, visitor); 4852 safelyVisitChildren(typeParameters, visitor);
4874 } 4853 }
4875 } 4854 }
4876 4855
4877 /** 4856 /**
4857 * The element used for a generic function type.
4858 *
4859 * Clients may not extend, implement or mix-in this class.
4860 */
4861 class GenericFunctionTypeElementImpl extends ElementImpl
4862 with TypeParameterizedElementMixin
4863 implements GenericFunctionTypeElement {
4864 /**
4865 * The unlinked representation of the generic function type in the summary.
4866 */
4867 UnlinkedGenericFunctionType _unlinkedGenericFunctionType;
4868
4869 /**
4870 * The declared return type of the function.
4871 */
4872 DartType _returnType;
4873
4874 /**
4875 * The elements representing the parameters of the function.
4876 */
4877 List<ParameterElement> _parameters;
4878
4879 /**
4880 * The type defined by this element.
4881 */
4882 FunctionType _type;
4883
4884 /**
4885 * Initialize a newly created function element to have no name and the given
4886 * [nameOffset]. This is used for function expressions, that have no name.
4887 */
4888 GenericFunctionTypeElementImpl.forOffset(int nameOffset)
4889 : super("", nameOffset);
4890
4891 /**
4892 * Initialize from serialized information.
4893 */
4894 GenericFunctionTypeElementImpl.forSerialized(ElementImpl enclosingElement)
4895 : super.forSerialized(enclosingElement);
4896
4897 @override
4898 TypeParameterizedElementMixin get enclosingTypeParameterContext =>
4899 (enclosingElement as ElementImpl).typeParameterContext;
4900
4901 @override
4902 ElementKind get kind => ElementKind.GENERIC_FUNCTION_TYPE;
4903
4904 @override
4905 List<ParameterElement> get parameters {
4906 if (_unlinkedGenericFunctionType != null) {
4907 _parameters ??= ParameterElementImpl.resynthesizeList(
4908 _unlinkedGenericFunctionType.parameters, this);
4909 }
4910 return _parameters ?? const <ParameterElement>[];
4911 }
4912
4913 /**
4914 * Set the parameters defined by this function type element to the given
4915 * [parameters].
4916 */
4917 void set parameters(List<ParameterElement> parameters) {
4918 _assertNotResynthesized(_unlinkedGenericFunctionType);
4919 for (ParameterElement parameter in parameters) {
4920 (parameter as ParameterElementImpl).enclosingElement = this;
4921 }
4922 this._parameters = parameters;
4923 }
4924
4925 @override
4926 DartType get returnType {
4927 if (_unlinkedGenericFunctionType != null && _returnType == null) {
4928 _returnType = enclosingUnit.resynthesizerContext.resolveTypeRef(
4929 _unlinkedGenericFunctionType.returnType, typeParameterContext,
4930 defaultVoid: false, declaredType: true);
4931 }
4932 return _returnType;
4933 }
4934
4935 /**
4936 * Set the return type defined by this function type element to the given
4937 * [returnType].
4938 */
4939 void set returnType(DartType returnType) {
4940 _assertNotResynthesized(_unlinkedGenericFunctionType);
4941 _returnType = _checkElementOfType(returnType);
4942 }
4943
4944 @override
4945 FunctionType get type {
4946 if (_unlinkedGenericFunctionType != null) {
4947 _type ??= new FunctionTypeImpl.elementWithNameAndArgs(
4948 this, null, allEnclosingTypeParameterTypes, false);
4949 }
4950 return _type;
4951 }
4952
4953 /**
4954 * Set the function type defined by this function type element to the given
4955 * [type].
4956 */
4957 void set type(FunctionType type) {
4958 _assertNotResynthesized(_unlinkedGenericFunctionType);
4959 _type = type;
4960 }
4961
4962 /**
4963 * Set the type parameters defined by this function type element to the given
4964 * [typeParameters].
4965 */
4966 void set typeParameters(List<TypeParameterElement> typeParameters) {
4967 _assertNotResynthesized(_unlinkedGenericFunctionType);
4968 for (TypeParameterElement parameter in typeParameters) {
4969 (parameter as TypeParameterElementImpl).enclosingElement = this;
4970 }
4971 this._typeParameterElements = typeParameters;
4972 }
4973
4974 @override
4975 List<UnlinkedTypeParam> get unlinkedTypeParams =>
4976 _unlinkedGenericFunctionType?.typeParameters;
4977
4978 @override
4979 T accept<T>(ElementVisitor<T> visitor) {
4980 return visitor.visitGenericFunctionTypeElement(this);
4981 }
4982
4983 @override
4984 void appendTo(StringBuffer buffer) {
4985 DartType type = returnType;
4986 if (type is TypeImpl) {
4987 type.appendTo(buffer, new HashSet<TypeImpl>());
4988 buffer.write(' Function');
4989 } else {
4990 buffer.write('Function');
4991 }
4992 List<TypeParameterElement> typeParams = typeParameters;
4993 int typeParameterCount = typeParams.length;
4994 if (typeParameterCount > 0) {
4995 buffer.write('<');
4996 for (int i = 0; i < typeParameterCount; i++) {
4997 if (i > 0) {
4998 buffer.write(', ');
4999 }
5000 (typeParams[i] as TypeParameterElementImpl).appendTo(buffer);
5001 }
5002 buffer.write('>');
5003 }
5004 List<ParameterElement> params = parameters;
5005 buffer.write('(');
5006 for (int i = 0; i < params.length; i++) {
5007 if (i > 0) {
5008 buffer.write(', ');
5009 }
5010 (params[i] as ParameterElementImpl).appendTo(buffer);
5011 }
5012 buffer.write(')');
5013 }
5014
5015 @override
5016 void visitChildren(ElementVisitor visitor) {
5017 super.visitChildren(visitor);
5018 _safelyVisitPossibleChild(returnType, visitor);
5019 safelyVisitChildren(typeParameters, visitor);
5020 safelyVisitChildren(parameters, visitor);
5021 }
5022 }
5023
5024 /**
4878 * A function type alias of the form 5025 * A function type alias of the form
4879 * `typedef` identifier typeParameters = genericFunctionType; 5026 * `typedef` identifier typeParameters = genericFunctionType;
4880 * 5027 *
4881 * Clients may not extend, implement or mix-in this class. 5028 * Clients may not extend, implement or mix-in this class.
4882 */ 5029 */
4883 class GenericTypeAliasElementImpl extends ElementImpl 5030 class GenericTypeAliasElementImpl extends ElementImpl
4884 with TypeParameterizedElementMixin 5031 with TypeParameterizedElementMixin
4885 implements FunctionTypeAliasElement { 5032 implements FunctionTypeAliasElement {
4886 /** 5033 /**
4887 * The unlinked representation of the type in the summary. 5034 * The unlinked representation of the type in the summary.
4888 */ 5035 */
4889 final UnlinkedTypedef _unlinkedTypedef; 5036 final UnlinkedTypedef _unlinkedTypedef;
4890 5037
4891 /** 5038 /**
4892 * The element representing the generic function type if this is a generic 5039 * The element representing the generic function type if this is a generic
4893 * function type alias, or `null` if it isn't. 5040 * function type alias, or `null` if it isn't.
4894 */ 5041 */
4895 FunctionElement _function; 5042 FunctionElement _function;
4896 5043
4897 /** 5044 /**
4898 * The type of function defined by this type alias. 5045 * The type of function defined by this type alias.
4899 */ 5046 */
4900 FunctionType _type; 5047 FunctionType _type;
4901 5048
4902 /** 5049 /**
4903 * A list containing all of the type parameters defined for this type.
4904 */
4905 List<TypeParameterElement> _typeParameters = TypeParameterElement.EMPTY_LIST;
4906
4907 /**
4908 * Initialize a newly created type alias element to have the given [name]. 5050 * Initialize a newly created type alias element to have the given [name].
4909 */ 5051 */
4910 GenericTypeAliasElementImpl.forNode(Identifier name) 5052 GenericTypeAliasElementImpl.forNode(Identifier name)
4911 : _unlinkedTypedef = null, 5053 : _unlinkedTypedef = null,
4912 super.forNode(name); 5054 super.forNode(name);
4913 5055
4914 /** 5056 /**
4915 * Initialize using the given serialized information. 5057 * Initialize using the given serialized information.
4916 */ 5058 */
4917 GenericTypeAliasElementImpl.forSerialized( 5059 GenericTypeAliasElementImpl.forSerialized(
(...skipping 107 matching lines...) Expand 10 before | Expand all | Expand 10 after
5025 _type = new FunctionTypeImpl.forTypedef(this); 5167 _type = new FunctionTypeImpl.forTypedef(this);
5026 } 5168 }
5027 return _type; 5169 return _type;
5028 } 5170 }
5029 5171
5030 void set type(FunctionType type) { 5172 void set type(FunctionType type) {
5031 _assertNotResynthesized(_unlinkedTypedef); 5173 _assertNotResynthesized(_unlinkedTypedef);
5032 _type = type; 5174 _type = type;
5033 } 5175 }
5034 5176
5035 @override
5036 TypeParameterizedElementMixin get typeParameterContext => this;
5037
5038 @override
5039 List<TypeParameterElement> get typeParameters {
5040 if (_unlinkedTypedef != null) {
5041 return super.typeParameters;
5042 }
5043 return _typeParameters;
5044 }
5045
5046 /** 5177 /**
5047 * Set the type parameters defined for this type to the given 5178 * Set the type parameters defined for this type to the given
5048 * [typeParameters]. 5179 * [typeParameters].
5049 */ 5180 */
5050 void set typeParameters(List<TypeParameterElement> typeParameters) { 5181 void set typeParameters(List<TypeParameterElement> typeParameters) {
5051 _assertNotResynthesized(_unlinkedTypedef); 5182 _assertNotResynthesized(_unlinkedTypedef);
5052 for (TypeParameterElement typeParameter in typeParameters) { 5183 for (TypeParameterElement typeParameter in typeParameters) {
5053 (typeParameter as TypeParameterElementImpl).enclosingElement = this; 5184 (typeParameter as TypeParameterElementImpl).enclosingElement = this;
5054 } 5185 }
5055 this._typeParameters = typeParameters; 5186 this._typeParameterElements = typeParameters;
5056 } 5187 }
5057 5188
5058 @override 5189 @override
5059 List<UnlinkedTypeParam> get unlinkedTypeParams => 5190 List<UnlinkedTypeParam> get unlinkedTypeParams =>
5060 _unlinkedTypedef.typeParameters; 5191 _unlinkedTypedef?.typeParameters;
5061 5192
5062 @override 5193 @override
5063 /*=T*/ accept/*<T>*/(ElementVisitor<dynamic/*=T*/ > visitor) => 5194 /*=T*/ accept/*<T>*/(ElementVisitor<dynamic/*=T*/ > visitor) =>
5064 visitor.visitFunctionTypeAliasElement(this); 5195 visitor.visitFunctionTypeAliasElement(this);
5065 5196
5066 @override 5197 @override
5067 void appendTo(StringBuffer buffer) { 5198 void appendTo(StringBuffer buffer) {
5068 buffer.write("typedef "); 5199 buffer.write("typedef ");
5069 buffer.write(displayName); 5200 buffer.write(displayName);
5070 int typeParameterCount = _typeParameters.length; 5201 var typeParameters = this.typeParameters;
5202 int typeParameterCount = typeParameters.length;
5071 if (typeParameterCount > 0) { 5203 if (typeParameterCount > 0) {
5072 buffer.write("<"); 5204 buffer.write("<");
5073 for (int i = 0; i < typeParameterCount; i++) { 5205 for (int i = 0; i < typeParameterCount; i++) {
5074 if (i > 0) { 5206 if (i > 0) {
5075 buffer.write(", "); 5207 buffer.write(", ");
5076 } 5208 }
5077 (_typeParameters[i] as TypeParameterElementImpl).appendTo(buffer); 5209 (typeParameters[i] as TypeParameterElementImpl).appendTo(buffer);
5078 } 5210 }
5079 buffer.write(">"); 5211 buffer.write(">");
5080 } 5212 }
5081 buffer.write(" = "); 5213 buffer.write(" = ");
5082 (function as FunctionElementImpl).appendTo(buffer); 5214 (function as FunctionElementImpl).appendTo(buffer);
5083 } 5215 }
5084 5216
5085 @override 5217 @override
5086 FunctionTypeAlias computeNode() => 5218 FunctionTypeAlias computeNode() =>
5087 getNodeMatching((node) => node is GenericTypeAlias); 5219 getNodeMatching((node) => node is GenericTypeAlias);
5088 5220
5089 @override 5221 @override
5090 ElementImpl getChild(String identifier) { 5222 ElementImpl getChild(String identifier) {
5091 for (TypeParameterElement typeParameter in _typeParameters) { 5223 for (TypeParameterElement typeParameter in typeParameters) {
5092 TypeParameterElementImpl typeParameterImpl = typeParameter; 5224 TypeParameterElementImpl typeParameterImpl = typeParameter;
5093 if (typeParameterImpl.identifier == identifier) { 5225 if (typeParameterImpl.identifier == identifier) {
5094 return typeParameterImpl; 5226 return typeParameterImpl;
5095 } 5227 }
5096 } 5228 }
5097 return null; 5229 return null;
5098 } 5230 }
5099 5231
5100 @override 5232 @override
5101 void visitChildren(ElementVisitor visitor) { 5233 void visitChildren(ElementVisitor visitor) {
(...skipping 2035 matching lines...) Expand 10 before | Expand all | Expand 10 after
7137 _declaredType = enclosingUnit.resynthesizerContext.resolveTypeRef( 7269 _declaredType = enclosingUnit.resynthesizerContext.resolveTypeRef(
7138 _unlinkedVariable.type, typeParameterContext, 7270 _unlinkedVariable.type, typeParameterContext,
7139 declaredType: true); 7271 declaredType: true);
7140 } 7272 }
7141 return super.type; 7273 return super.type;
7142 } 7274 }
7143 7275
7144 @override 7276 @override
7145 void set type(DartType type) { 7277 void set type(DartType type) {
7146 _assertNotResynthesized(_unlinkedVariable); 7278 _assertNotResynthesized(_unlinkedVariable);
7147 _type = type; 7279 _type = _checkElementOfType(type);
7148 } 7280 }
7149 7281
7150 /** 7282 /**
7151 * Subclasses need this getter, see [ConstVariableElement._unlinkedConst]. 7283 * Subclasses need this getter, see [ConstVariableElement._unlinkedConst].
7152 */ 7284 */
7153 UnlinkedExpr get _unlinkedConst => _unlinkedVariable?.initializer?.bodyExpr; 7285 UnlinkedExpr get _unlinkedConst => _unlinkedVariable?.initializer?.bodyExpr;
7154 } 7286 }
7155 7287
7156 /** 7288 /**
7157 * A concrete implementation of a [ParameterElement]. 7289 * A concrete implementation of a [ParameterElement].
(...skipping 956 matching lines...) Expand 10 before | Expand all | Expand 10 after
8114 DartType get propagatedType { 8246 DartType get propagatedType {
8115 if (_unlinkedVariable != null && _propagatedType == null) { 8247 if (_unlinkedVariable != null && _propagatedType == null) {
8116 _propagatedType = enclosingUnit.resynthesizerContext.resolveLinkedType( 8248 _propagatedType = enclosingUnit.resynthesizerContext.resolveLinkedType(
8117 _unlinkedVariable.propagatedTypeSlot, typeParameterContext); 8249 _unlinkedVariable.propagatedTypeSlot, typeParameterContext);
8118 } 8250 }
8119 return _propagatedType; 8251 return _propagatedType;
8120 } 8252 }
8121 8253
8122 void set propagatedType(DartType propagatedType) { 8254 void set propagatedType(DartType propagatedType) {
8123 _assertNotResynthesized(_unlinkedVariable); 8255 _assertNotResynthesized(_unlinkedVariable);
8124 _propagatedType = propagatedType; 8256 _propagatedType = _checkElementOfType(propagatedType);
8125 } 8257 }
8126 8258
8127 @override 8259 @override
8128 DartType get type { 8260 DartType get type {
8129 if (isSynthetic && _type == null) { 8261 if (isSynthetic && _type == null) {
8130 if (getter != null) { 8262 if (getter != null) {
8131 _type = getter.returnType; 8263 _type = getter.returnType;
8132 } else if (setter != null) { 8264 } else if (setter != null) {
8133 List<ParameterElement> parameters = setter.parameters; 8265 List<ParameterElement> parameters = setter.parameters;
8134 _type = parameters.isNotEmpty 8266 _type = parameters.isNotEmpty
(...skipping 268 matching lines...) Expand 10 before | Expand all | Expand 10 after
8403 } 8535 }
8404 return _bound ??= enclosingUnit.resynthesizerContext.resolveTypeRef( 8536 return _bound ??= enclosingUnit.resynthesizerContext.resolveTypeRef(
8405 _unlinkedTypeParam.bound, enclosingElement, 8537 _unlinkedTypeParam.bound, enclosingElement,
8406 instantiateToBoundsAllowed: false, declaredType: true); 8538 instantiateToBoundsAllowed: false, declaredType: true);
8407 } 8539 }
8408 return _bound; 8540 return _bound;
8409 } 8541 }
8410 8542
8411 void set bound(DartType bound) { 8543 void set bound(DartType bound) {
8412 _assertNotResynthesized(_unlinkedTypeParam); 8544 _assertNotResynthesized(_unlinkedTypeParam);
8413 _bound = bound; 8545 _bound = _checkElementOfType(bound);
8414 } 8546 }
8415 8547
8416 @override 8548 @override
8417 int get codeLength { 8549 int get codeLength {
8418 if (_unlinkedTypeParam != null) { 8550 if (_unlinkedTypeParam != null) {
8419 return _unlinkedTypeParam.codeRange?.length; 8551 return _unlinkedTypeParam.codeRange?.length;
8420 } 8552 }
8421 return super.codeLength; 8553 return super.codeLength;
8422 } 8554 }
8423 8555
(...skipping 60 matching lines...) Expand 10 before | Expand all | Expand 10 after
8484 buffer.write(bound); 8616 buffer.write(bound);
8485 } 8617 }
8486 } 8618 }
8487 } 8619 }
8488 8620
8489 /** 8621 /**
8490 * Mixin representing an element which can have type parameters. 8622 * Mixin representing an element which can have type parameters.
8491 */ 8623 */
8492 abstract class TypeParameterizedElementMixin 8624 abstract class TypeParameterizedElementMixin
8493 implements TypeParameterizedElement, ElementImpl { 8625 implements TypeParameterizedElement, ElementImpl {
8626 /**
8627 * The cached number of type parameters that are in scope in this context, or
8628 * `null` if the number has not yet been computed.
8629 */
8494 int _nestingLevel; 8630 int _nestingLevel;
8631
8632 /**
8633 * A cached list containing the type parameters declared by this element
8634 * directly, or `null` if the elements have not been created yet. This does
8635 * not include type parameters that are declared by any enclosing elements.
8636 */
8495 List<TypeParameterElement> _typeParameterElements; 8637 List<TypeParameterElement> _typeParameterElements;
8638
8639 /**
8640 * A cached list containing the type parameter types declared by this element
8641 * directly, or `null` if the list has not been computed yet.
8642 */
8496 List<TypeParameterType> _typeParameterTypes; 8643 List<TypeParameterType> _typeParameterTypes;
8644
8645 /**
8646 * A cached list containing all of the type parameter types of this element,
8647 * including those declared by this element directly and those declared by any
8648 * enclosing elements, or `null` if the list has not been computed yet.
8649 */
8497 List<TypeParameterType> _allTypeParameterTypes; 8650 List<TypeParameterType> _allTypeParameterTypes;
8498 8651
8499 /** 8652 /**
8500 * Return all type parameter types of the element that encloses element. 8653 * Return all type parameter types of the element that encloses element.
8501 * Not `null`, but might be empty for top-level and static class members. 8654 * Not `null`, but might be empty for top-level and static class members.
8502 */ 8655 */
8503 List<TypeParameterType> get allEnclosingTypeParameterTypes { 8656 List<TypeParameterType> get allEnclosingTypeParameterTypes {
8504 return enclosingTypeParameterContext?.allTypeParameterTypes ?? 8657 return enclosingTypeParameterContext?.allTypeParameterTypes ??
8505 const <TypeParameterType>[]; 8658 const <TypeParameterType>[];
8506 } 8659 }
(...skipping 16 matching lines...) Expand all
8523 /** 8676 /**
8524 * Get the type parameter context enclosing this one, if any. 8677 * Get the type parameter context enclosing this one, if any.
8525 */ 8678 */
8526 TypeParameterizedElementMixin get enclosingTypeParameterContext; 8679 TypeParameterizedElementMixin get enclosingTypeParameterContext;
8527 8680
8528 /** 8681 /**
8529 * The unit in which this element is resynthesized. 8682 * The unit in which this element is resynthesized.
8530 */ 8683 */
8531 CompilationUnitElementImpl get enclosingUnit; 8684 CompilationUnitElementImpl get enclosingUnit;
8532 8685
8686 @override
8687 TypeParameterizedElementMixin get typeParameterContext => this;
8688
8533 /** 8689 /**
8534 * Find out how many type parameters are in scope in this context. 8690 * Find out how many type parameters are in scope in this context.
8535 */ 8691 */
8536 int get typeParameterNestingLevel => 8692 int get typeParameterNestingLevel =>
8537 _nestingLevel ??= unlinkedTypeParams.length + 8693 _nestingLevel ??= unlinkedTypeParams.length +
8538 (enclosingTypeParameterContext?.typeParameterNestingLevel ?? 0); 8694 (enclosingTypeParameterContext?.typeParameterNestingLevel ?? 0);
8539 8695
8696 @override
8540 List<TypeParameterElement> get typeParameters { 8697 List<TypeParameterElement> get typeParameters {
8541 if (_typeParameterElements == null) { 8698 if (_typeParameterElements == null) {
8542 int enclosingNestingLevel = 8699 List<UnlinkedTypeParam> unlinkedParams = unlinkedTypeParams;
8543 enclosingTypeParameterContext?.typeParameterNestingLevel ?? 0; 8700 if (unlinkedParams != null) {
8544 int numTypeParameters = unlinkedTypeParams.length; 8701 int enclosingNestingLevel =
8545 _typeParameterElements = 8702 enclosingTypeParameterContext?.typeParameterNestingLevel ?? 0;
8546 new List<TypeParameterElement>(numTypeParameters); 8703 int numTypeParameters = unlinkedParams.length;
8547 for (int i = 0; i < numTypeParameters; i++) { 8704 _typeParameterElements =
8548 _typeParameterElements[i] = new TypeParameterElementImpl.forSerialized( 8705 new List<TypeParameterElement>(numTypeParameters);
8549 unlinkedTypeParams[i], this, enclosingNestingLevel + i); 8706 for (int i = 0; i < numTypeParameters; i++) {
8707 _typeParameterElements[i] =
8708 new TypeParameterElementImpl.forSerialized(
8709 unlinkedParams[i], this, enclosingNestingLevel + i);
8710 }
8550 } 8711 }
8551 } 8712 }
8552 return _typeParameterElements; 8713 return _typeParameterElements ?? const <TypeParameterElement>[];
8553 } 8714 }
8554 8715
8555 /** 8716 /**
8556 * Get a list of [TypeParameterType] objects corresponding to the 8717 * Get a list of [TypeParameterType] objects corresponding to the
8557 * element's type parameters. 8718 * element's type parameters.
8558 */ 8719 */
8559 List<TypeParameterType> get typeParameterTypes { 8720 List<TypeParameterType> get typeParameterTypes {
8560 return _typeParameterTypes ??= typeParameters 8721 return _typeParameterTypes ??= typeParameters
8561 .map((TypeParameterElement e) => e.type) 8722 .map((TypeParameterElement e) => e.type)
8562 .toList(growable: false); 8723 .toList(growable: false);
8563 } 8724 }
8564 8725
8565 /** 8726 /**
8566 * Get the [UnlinkedTypeParam]s representing the type parameters declared by 8727 * Get the [UnlinkedTypeParam]s representing the type parameters declared by
8567 * this element. 8728 * this element, or `null` if this element isn't from a summary.
8568 * 8729 *
8569 * TODO(scheglov) make private after switching linker to Impl 8730 * TODO(scheglov) make private after switching linker to Impl
8570 */ 8731 */
8571 List<UnlinkedTypeParam> get unlinkedTypeParams; 8732 List<UnlinkedTypeParam> get unlinkedTypeParams;
8572 8733
8573 /** 8734 /**
8574 * Convert the given [index] into a type parameter type. 8735 * Convert the given [index] into a type parameter type.
8575 */ 8736 */
8576 TypeParameterType getTypeParameterType(int index) { 8737 TypeParameterType getTypeParameterType(int index) {
8577 List<TypeParameterType> types = typeParameterTypes; 8738 List<TypeParameterType> types = typeParameterTypes;
(...skipping 179 matching lines...) Expand 10 before | Expand all | Expand 10 after
8757 * initializers. However, analyzer also needs to handle incorrect Dart code, 8918 * initializers. However, analyzer also needs to handle incorrect Dart code,
8758 * in which case there might be some constant variables that lack 8919 * in which case there might be some constant variables that lack
8759 * initializers. 8920 * initializers.
8760 */ 8921 */
8761 Expression get constantInitializer => null; 8922 Expression get constantInitializer => null;
8762 8923
8763 @override 8924 @override
8764 DartObject get constantValue => evaluationResult?.value; 8925 DartObject get constantValue => evaluationResult?.value;
8765 8926
8766 void set declaredType(DartType type) { 8927 void set declaredType(DartType type) {
8767 _declaredType = type; 8928 _declaredType = _checkElementOfType(type);
8768 } 8929 }
8769 8930
8770 @override 8931 @override
8771 String get displayName => name; 8932 String get displayName => name;
8772 8933
8773 /** 8934 /**
8774 * Return the result of evaluating this variable's initializer as a 8935 * Return the result of evaluating this variable's initializer as a
8775 * compile-time constant expression, or `null` if this variable is not a 8936 * compile-time constant expression, or `null` if this variable is not a
8776 * 'const' variable, if it does not have an initializer, or if the compilation 8937 * 'const' variable, if it does not have an initializer, or if the compilation
8777 * unit containing the variable has not been resolved. 8938 * unit containing the variable has not been resolved.
(...skipping 65 matching lines...) Expand 10 before | Expand all | Expand 10 after
8843 @override 9004 @override
8844 bool get isPotentiallyMutatedInScope => false; 9005 bool get isPotentiallyMutatedInScope => false;
8845 9006
8846 @override 9007 @override
8847 bool get isStatic => hasModifier(Modifier.STATIC); 9008 bool get isStatic => hasModifier(Modifier.STATIC);
8848 9009
8849 @override 9010 @override
8850 DartType get type => _type ?? _declaredType; 9011 DartType get type => _type ?? _declaredType;
8851 9012
8852 void set type(DartType type) { 9013 void set type(DartType type) {
8853 _type = type; 9014 _type = _checkElementOfType(type);
8854 } 9015 }
8855 9016
8856 @override 9017 @override
8857 void appendTo(StringBuffer buffer) { 9018 void appendTo(StringBuffer buffer) {
8858 buffer.write(type); 9019 buffer.write(type);
8859 buffer.write(" "); 9020 buffer.write(" ");
8860 buffer.write(displayName); 9021 buffer.write(displayName);
8861 } 9022 }
8862 9023
8863 @override 9024 @override
(...skipping 16 matching lines...) Expand all
8880 9041
8881 @override 9042 @override
8882 void visitElement(Element element) { 9043 void visitElement(Element element) {
8883 int offset = element.nameOffset; 9044 int offset = element.nameOffset;
8884 if (offset != -1) { 9045 if (offset != -1) {
8885 map[offset] = element; 9046 map[offset] = element;
8886 } 9047 }
8887 super.visitElement(element); 9048 super.visitElement(element);
8888 } 9049 }
8889 } 9050 }
OLDNEW
« no previous file with comments | « pkg/analyzer/lib/src/dart/element/builder.dart ('k') | pkg/analyzer/lib/src/dart/element/type.dart » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698