OLD | NEW |
1 // Copyright (c) 2014, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2014, the Dart project authors. Please see the AUTHORS file |
2 // for details. All rights reserved. Use of this source code is governed by a | 2 // for details. All rights reserved. Use of this source code is governed by a |
3 // BSD-style license that can be found in the LICENSE file. | 3 // BSD-style license that can be found in the LICENSE file. |
4 | 4 |
5 library analyzer.src.dart.element.member; | 5 library analyzer.src.dart.element.member; |
6 | 6 |
7 import 'package:analyzer/dart/ast/ast.dart'; | 7 import 'package:analyzer/dart/ast/ast.dart'; |
8 import 'package:analyzer/dart/constant/value.dart'; | 8 import 'package:analyzer/dart/constant/value.dart'; |
9 import 'package:analyzer/dart/element/element.dart'; | 9 import 'package:analyzer/dart/element/element.dart'; |
10 import 'package:analyzer/dart/element/type.dart'; | 10 import 'package:analyzer/dart/element/type.dart'; |
(...skipping 919 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
930 * | 930 * |
931 * If we have `C<num>.m` and we ask for the type parameter "S", we should get | 931 * If we have `C<num>.m` and we ask for the type parameter "S", we should get |
932 * `<S extends num>` instead of `<S extends T>`. This is how the parameter | 932 * `<S extends num>` instead of `<S extends T>`. This is how the parameter |
933 * and return types work, see: [FunctionType.parameters], | 933 * and return types work, see: [FunctionType.parameters], |
934 * [FunctionType.returnType], and [ParameterMember]. | 934 * [FunctionType.returnType], and [ParameterMember]. |
935 */ | 935 */ |
936 class TypeParameterMember extends Member implements TypeParameterElement { | 936 class TypeParameterMember extends Member implements TypeParameterElement { |
937 @override | 937 @override |
938 final DartType bound; | 938 final DartType bound; |
939 | 939 |
| 940 DartType _type; |
| 941 |
940 TypeParameterMember( | 942 TypeParameterMember( |
941 TypeParameterElement baseElement, DartType definingType, this.bound) | 943 TypeParameterElement baseElement, DartType definingType, this.bound) |
942 : super(baseElement, definingType); | 944 : super(baseElement, definingType) { |
| 945 _type = new TypeParameterTypeImpl(this); |
| 946 } |
943 | 947 |
944 @override | 948 @override |
945 TypeParameterElement get baseElement => | 949 TypeParameterElement get baseElement => |
946 super.baseElement as TypeParameterElement; | 950 super.baseElement as TypeParameterElement; |
947 | 951 |
948 @override | 952 @override |
949 Element get enclosingElement => baseElement.enclosingElement; | 953 Element get enclosingElement => baseElement.enclosingElement; |
950 | 954 |
951 @override | 955 @override |
952 TypeParameterType get type => baseElement.type; | 956 TypeParameterType get type => _type; |
953 | 957 |
954 @override | 958 @override |
955 accept(ElementVisitor visitor) => visitor.visitTypeParameterElement(this); | 959 accept(ElementVisitor visitor) => visitor.visitTypeParameterElement(this); |
956 | 960 |
| 961 @override |
| 962 int get hashCode => baseElement.hashCode; |
| 963 |
| 964 @override |
| 965 bool operator ==(obj) => |
| 966 // TODO(jmesserly): this equality should consider the bound, see: |
| 967 // https://github.com/dart-lang/sdk/issues/27210 |
| 968 obj is TypeParameterMember && obj.baseElement == baseElement; |
| 969 |
957 /** | 970 /** |
958 * If the given [parameter]'s type is different when any type parameters from | 971 * If the given [parameter]'s type is different when any type parameters from |
959 * the defining type's declaration are replaced with the actual type | 972 * the defining type's declaration are replaced with the actual type |
960 * arguments from the [definingType], create a parameter member representing | 973 * arguments from the [definingType], create a parameter member representing |
961 * the given parameter. Return the member that was created, or the base | 974 * the given parameter. Return the member that was created, or the base |
962 * parameter if no member was created. | 975 * parameter if no member was created. |
963 */ | 976 */ |
964 static TypeParameterElement from( | 977 static TypeParameterElement from( |
965 TypeParameterElement parameter, ParameterizedType definingType) { | 978 TypeParameterElement parameter, ParameterizedType definingType) { |
966 if (parameter?.bound == null || definingType.typeArguments.isEmpty) { | 979 if (parameter?.bound == null || definingType.typeArguments.isEmpty) { |
(...skipping 80 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1047 DartObject computeConstantValue() => baseElement.computeConstantValue(); | 1060 DartObject computeConstantValue() => baseElement.computeConstantValue(); |
1048 | 1061 |
1049 @override | 1062 @override |
1050 void visitChildren(ElementVisitor visitor) { | 1063 void visitChildren(ElementVisitor visitor) { |
1051 // TODO(brianwilkerson) We need to finish implementing the accessors used | 1064 // TODO(brianwilkerson) We need to finish implementing the accessors used |
1052 // below so that we can safely invoke them. | 1065 // below so that we can safely invoke them. |
1053 super.visitChildren(visitor); | 1066 super.visitChildren(visitor); |
1054 baseElement.initializer?.accept(visitor); | 1067 baseElement.initializer?.accept(visitor); |
1055 } | 1068 } |
1056 } | 1069 } |
OLD | NEW |