@@ -82,14 +82,22 @@ 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 for example associated type parameters.
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 and other type parameters, such as associated types.
99+ */
100+ TypeParameter getATypeParameter ( ) { result = this .getPositionalTypeParameter ( _) }
93101
94102 /** Gets a textual representation of this type. */
95103 abstract string toString ( ) ;
@@ -108,7 +116,9 @@ class TupleType extends Type, TTuple {
108116
109117 override TupleField getTupleField ( int i ) { none ( ) }
110118
111- override TypeParameter getTypeParameter ( int i ) { result = TTupleTypeParameter ( arity , i ) }
119+ override TypeParameter getPositionalTypeParameter ( int i ) {
120+ result = TTupleTypeParameter ( arity , i )
121+ }
112122
113123 /** Gets the arity of this tuple type. */
114124 int getArity ( ) { result = arity }
@@ -141,7 +151,7 @@ class StructType extends StructOrEnumType, TStruct {
141151
142152 override TupleField getTupleField ( int i ) { result = struct .getTupleField ( i ) }
143153
144- override TypeParameter getTypeParameter ( int i ) {
154+ override TypeParameter getPositionalTypeParameter ( int i ) {
145155 result = TTypeParamTypeParameter ( struct .getGenericParamList ( ) .getTypeParam ( i ) )
146156 }
147157
@@ -166,7 +176,7 @@ class EnumType extends StructOrEnumType, TEnum {
166176
167177 override TupleField getTupleField ( int i ) { none ( ) }
168178
169- override TypeParameter getTypeParameter ( int i ) {
179+ override TypeParameter getPositionalTypeParameter ( int i ) {
170180 result = TTypeParamTypeParameter ( enum .getGenericParamList ( ) .getTypeParam ( i ) )
171181 }
172182
@@ -192,10 +202,18 @@ class TraitType extends Type, TTrait {
192202
193203 override TupleField getTupleField ( int i ) { none ( ) }
194204
195- override TypeParameter getTypeParameter ( int i ) {
205+ override TypeParameter getPositionalTypeParameter ( int i ) {
196206 result = TTypeParamTypeParameter ( trait .getGenericParamList ( ) .getTypeParam ( i ) )
197207 }
198208
209+ override TypeParameter getATypeParameter ( ) {
210+ result = super .getATypeParameter ( )
211+ or
212+ result .( AssociatedTypeTypeParameter ) .getTrait ( ) = trait
213+ or
214+ result .( SelfTypeParameter ) .getTrait ( ) = trait
215+ }
216+
199217 override TypeMention getTypeParameterDefault ( int i ) {
200218 result = trait .getGenericParamList ( ) .getTypeParam ( i ) .getDefaultType ( )
201219 }
@@ -218,7 +236,7 @@ class ArrayType extends Type, TArrayType {
218236
219237 override TupleField getTupleField ( int i ) { none ( ) }
220238
221- override TypeParameter getTypeParameter ( int i ) {
239+ override TypeParameter getPositionalTypeParameter ( int i ) {
222240 result = TArrayTypeParameter ( ) and
223241 i = 0
224242 }
@@ -241,7 +259,7 @@ class RefType extends Type, TRefType {
241259
242260 override TupleField getTupleField ( int i ) { none ( ) }
243261
244- override TypeParameter getTypeParameter ( int i ) {
262+ override TypeParameter getPositionalTypeParameter ( int i ) {
245263 result = TRefTypeParameter ( ) and
246264 i = 0
247265 }
@@ -274,7 +292,7 @@ class ImplTraitType extends Type, TImplTraitType {
274292
275293 override TupleField getTupleField ( int i ) { none ( ) }
276294
277- override TypeParameter getTypeParameter ( int i ) {
295+ override TypeParameter getPositionalTypeParameter ( int i ) {
278296 exists ( TypeParam tp |
279297 implTraitTypeParam ( impl , i , tp ) and
280298 result = TImplTraitTypeParameter ( impl , tp )
@@ -295,10 +313,19 @@ class DynTraitType extends Type, TDynTraitType {
295313
296314 override TupleField getTupleField ( int i ) { none ( ) }
297315
298- override DynTraitTypeParameter getTypeParameter ( int i ) {
316+ override DynTraitTypeParameter getPositionalTypeParameter ( int i ) {
299317 result = TDynTraitTypeParameter ( trait .getGenericParamList ( ) .getTypeParam ( i ) )
300318 }
301319
320+ override TypeParameter getATypeParameter ( ) {
321+ result = super .getATypeParameter ( )
322+ or
323+ exists ( AstNode n |
324+ dynTraitTypeParameter ( trait , n ) and
325+ result = TDynTraitTypeParameter ( n )
326+ )
327+ }
328+
302329 Trait getTrait ( ) { result = trait }
303330
304331 override string toString ( ) { result = "dyn " + trait .getName ( ) .toString ( ) }
@@ -336,7 +363,7 @@ class SliceType extends Type, TSliceType {
336363
337364 override TupleField getTupleField ( int i ) { none ( ) }
338365
339- override TypeParameter getTypeParameter ( int i ) {
366+ override TypeParameter getPositionalTypeParameter ( int i ) {
340367 result = TSliceTypeParameter ( ) and
341368 i = 0
342369 }
@@ -352,7 +379,7 @@ abstract class TypeParameter extends Type {
352379
353380 override TupleField getTupleField ( int i ) { none ( ) }
354381
355- override TypeParameter getTypeParameter ( int i ) { none ( ) }
382+ override TypeParameter getPositionalTypeParameter ( int i ) { none ( ) }
356383}
357384
358385private class RawTypeParameter = @type_param or @trait or @type_alias or @impl_trait_type_repr;
@@ -548,7 +575,7 @@ class ImplTraitTypeTypeParameter extends ImplTraitType, TypeParameter {
548575
549576 override TupleField getTupleField ( int i ) { none ( ) }
550577
551- override TypeParameter getTypeParameter ( int i ) { none ( ) }
578+ override TypeParameter getPositionalTypeParameter ( int i ) { none ( ) }
552579}
553580
554581/**
0 commit comments