@@ -82,14 +82,23 @@ abstract class Type extends TType {
8282 pragma [ nomagic]
8383 abstract TupleField getTupleField ( int i ) ;
8484
85- /** Gets the `i`th type parameter of this type, if any. */
86- abstract TypeParameter getTypeParameter ( int i ) ;
85+ /**
86+ * Gets the `i`th positional type parameter of this type, if any.
87+ *
88+ * This excludes synthetic type parameters, such as associated types in traits.
89+ */
90+ abstract TypeParameter getPositionalTypeParameter ( int i ) ;
8791
8892 /** Gets the default type for the `i`th type parameter, if any. */
8993 TypeMention getTypeParameterDefault ( int i ) { none ( ) }
9094
91- /** Gets a type parameter of this type. */
92- final TypeParameter getATypeParameter ( ) { result = this .getTypeParameter ( _) }
95+ /**
96+ * Gets a type parameter of this type.
97+ *
98+ * This includes both positional type parameters and synthetic type parameters,
99+ * such as associated types in traits.
100+ */
101+ TypeParameter getATypeParameter ( ) { result = this .getPositionalTypeParameter ( _) }
93102
94103 /** Gets a textual representation of this type. */
95104 abstract string toString ( ) ;
@@ -108,7 +117,9 @@ class TupleType extends Type, TTuple {
108117
109118 override TupleField getTupleField ( int i ) { none ( ) }
110119
111- override TypeParameter getTypeParameter ( int i ) { result = TTupleTypeParameter ( arity , i ) }
120+ override TypeParameter getPositionalTypeParameter ( int i ) {
121+ result = TTupleTypeParameter ( arity , i )
122+ }
112123
113124 /** Gets the arity of this tuple type. */
114125 int getArity ( ) { result = arity }
@@ -141,7 +152,7 @@ class StructType extends StructOrEnumType, TStruct {
141152
142153 override TupleField getTupleField ( int i ) { result = struct .getTupleField ( i ) }
143154
144- override TypeParameter getTypeParameter ( int i ) {
155+ override TypeParameter getPositionalTypeParameter ( int i ) {
145156 result = TTypeParamTypeParameter ( struct .getGenericParamList ( ) .getTypeParam ( i ) )
146157 }
147158
@@ -166,7 +177,7 @@ class EnumType extends StructOrEnumType, TEnum {
166177
167178 override TupleField getTupleField ( int i ) { none ( ) }
168179
169- override TypeParameter getTypeParameter ( int i ) {
180+ override TypeParameter getPositionalTypeParameter ( int i ) {
170181 result = TTypeParamTypeParameter ( enum .getGenericParamList ( ) .getTypeParam ( i ) )
171182 }
172183
@@ -192,10 +203,18 @@ class TraitType extends Type, TTrait {
192203
193204 override TupleField getTupleField ( int i ) { none ( ) }
194205
195- override TypeParameter getTypeParameter ( int i ) {
206+ override TypeParameter getPositionalTypeParameter ( int i ) {
196207 result = TTypeParamTypeParameter ( trait .getGenericParamList ( ) .getTypeParam ( i ) )
197208 }
198209
210+ override TypeParameter getATypeParameter ( ) {
211+ result = super .getATypeParameter ( )
212+ or
213+ result .( AssociatedTypeTypeParameter ) .getTrait ( ) = trait
214+ or
215+ result .( SelfTypeParameter ) .getTrait ( ) = trait
216+ }
217+
199218 override TypeMention getTypeParameterDefault ( int i ) {
200219 result = trait .getGenericParamList ( ) .getTypeParam ( i ) .getDefaultType ( )
201220 }
@@ -218,7 +237,7 @@ class ArrayType extends Type, TArrayType {
218237
219238 override TupleField getTupleField ( int i ) { none ( ) }
220239
221- override TypeParameter getTypeParameter ( int i ) {
240+ override TypeParameter getPositionalTypeParameter ( int i ) {
222241 result = TArrayTypeParameter ( ) and
223242 i = 0
224243 }
@@ -241,7 +260,7 @@ class RefType extends Type, TRefType {
241260
242261 override TupleField getTupleField ( int i ) { none ( ) }
243262
244- override TypeParameter getTypeParameter ( int i ) {
263+ override TypeParameter getPositionalTypeParameter ( int i ) {
245264 result = TRefTypeParameter ( ) and
246265 i = 0
247266 }
@@ -274,7 +293,7 @@ class ImplTraitType extends Type, TImplTraitType {
274293
275294 override TupleField getTupleField ( int i ) { none ( ) }
276295
277- override TypeParameter getTypeParameter ( int i ) {
296+ override TypeParameter getPositionalTypeParameter ( int i ) {
278297 exists ( TypeParam tp |
279298 implTraitTypeParam ( impl , i , tp ) and
280299 result = TImplTraitTypeParameter ( impl , tp )
@@ -295,10 +314,19 @@ class DynTraitType extends Type, TDynTraitType {
295314
296315 override TupleField getTupleField ( int i ) { none ( ) }
297316
298- override DynTraitTypeParameter getTypeParameter ( int i ) {
317+ override DynTraitTypeParameter getPositionalTypeParameter ( int i ) {
299318 result = TDynTraitTypeParameter ( trait .getGenericParamList ( ) .getTypeParam ( i ) )
300319 }
301320
321+ override TypeParameter getATypeParameter ( ) {
322+ result = super .getATypeParameter ( )
323+ or
324+ exists ( AstNode n |
325+ dynTraitTypeParameter ( trait , n ) and
326+ result = TDynTraitTypeParameter ( n )
327+ )
328+ }
329+
302330 Trait getTrait ( ) { result = trait }
303331
304332 override string toString ( ) { result = "dyn " + trait .getName ( ) .toString ( ) }
@@ -336,7 +364,7 @@ class SliceType extends Type, TSliceType {
336364
337365 override TupleField getTupleField ( int i ) { none ( ) }
338366
339- override TypeParameter getTypeParameter ( int i ) {
367+ override TypeParameter getPositionalTypeParameter ( int i ) {
340368 result = TSliceTypeParameter ( ) and
341369 i = 0
342370 }
@@ -352,7 +380,7 @@ abstract class TypeParameter extends Type {
352380
353381 override TupleField getTupleField ( int i ) { none ( ) }
354382
355- override TypeParameter getTypeParameter ( int i ) { none ( ) }
383+ override TypeParameter getPositionalTypeParameter ( int i ) { none ( ) }
356384}
357385
358386private class RawTypeParameter = @type_param or @trait or @type_alias or @impl_trait_type_repr;
@@ -548,7 +576,7 @@ class ImplTraitTypeTypeParameter extends ImplTraitType, TypeParameter {
548576
549577 override TupleField getTupleField ( int i ) { none ( ) }
550578
551- override TypeParameter getTypeParameter ( int i ) { none ( ) }
579+ override TypeParameter getPositionalTypeParameter ( int i ) { none ( ) }
552580}
553581
554582/**
0 commit comments