@@ -82,14 +82,23 @@ abstract class Type extends TType {
82
82
pragma [ nomagic]
83
83
abstract TupleField getTupleField ( int i ) ;
84
84
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 ) ;
87
91
88
92
/** Gets the default type for the `i`th type parameter, if any. */
89
93
TypeMention getTypeParameterDefault ( int i ) { none ( ) }
90
94
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 ( _) }
93
102
94
103
/** Gets a textual representation of this type. */
95
104
abstract string toString ( ) ;
@@ -108,7 +117,9 @@ class TupleType extends Type, TTuple {
108
117
109
118
override TupleField getTupleField ( int i ) { none ( ) }
110
119
111
- override TypeParameter getTypeParameter ( int i ) { result = TTupleTypeParameter ( arity , i ) }
120
+ override TypeParameter getPositionalTypeParameter ( int i ) {
121
+ result = TTupleTypeParameter ( arity , i )
122
+ }
112
123
113
124
/** Gets the arity of this tuple type. */
114
125
int getArity ( ) { result = arity }
@@ -141,7 +152,7 @@ class StructType extends StructOrEnumType, TStruct {
141
152
142
153
override TupleField getTupleField ( int i ) { result = struct .getTupleField ( i ) }
143
154
144
- override TypeParameter getTypeParameter ( int i ) {
155
+ override TypeParameter getPositionalTypeParameter ( int i ) {
145
156
result = TTypeParamTypeParameter ( struct .getGenericParamList ( ) .getTypeParam ( i ) )
146
157
}
147
158
@@ -166,7 +177,7 @@ class EnumType extends StructOrEnumType, TEnum {
166
177
167
178
override TupleField getTupleField ( int i ) { none ( ) }
168
179
169
- override TypeParameter getTypeParameter ( int i ) {
180
+ override TypeParameter getPositionalTypeParameter ( int i ) {
170
181
result = TTypeParamTypeParameter ( enum .getGenericParamList ( ) .getTypeParam ( i ) )
171
182
}
172
183
@@ -192,10 +203,18 @@ class TraitType extends Type, TTrait {
192
203
193
204
override TupleField getTupleField ( int i ) { none ( ) }
194
205
195
- override TypeParameter getTypeParameter ( int i ) {
206
+ override TypeParameter getPositionalTypeParameter ( int i ) {
196
207
result = TTypeParamTypeParameter ( trait .getGenericParamList ( ) .getTypeParam ( i ) )
197
208
}
198
209
210
+ override TypeParameter getATypeParameter ( ) {
211
+ result = super .getATypeParameter ( )
212
+ or
213
+ result .( AssociatedTypeTypeParameter ) .getTrait ( ) = trait
214
+ or
215
+ result .( SelfTypeParameter ) .getTrait ( ) = trait
216
+ }
217
+
199
218
override TypeMention getTypeParameterDefault ( int i ) {
200
219
result = trait .getGenericParamList ( ) .getTypeParam ( i ) .getDefaultType ( )
201
220
}
@@ -218,7 +237,7 @@ class ArrayType extends Type, TArrayType {
218
237
219
238
override TupleField getTupleField ( int i ) { none ( ) }
220
239
221
- override TypeParameter getTypeParameter ( int i ) {
240
+ override TypeParameter getPositionalTypeParameter ( int i ) {
222
241
result = TArrayTypeParameter ( ) and
223
242
i = 0
224
243
}
@@ -241,7 +260,7 @@ class RefType extends Type, TRefType {
241
260
242
261
override TupleField getTupleField ( int i ) { none ( ) }
243
262
244
- override TypeParameter getTypeParameter ( int i ) {
263
+ override TypeParameter getPositionalTypeParameter ( int i ) {
245
264
result = TRefTypeParameter ( ) and
246
265
i = 0
247
266
}
@@ -274,7 +293,7 @@ class ImplTraitType extends Type, TImplTraitType {
274
293
275
294
override TupleField getTupleField ( int i ) { none ( ) }
276
295
277
- override TypeParameter getTypeParameter ( int i ) {
296
+ override TypeParameter getPositionalTypeParameter ( int i ) {
278
297
exists ( TypeParam tp |
279
298
implTraitTypeParam ( impl , i , tp ) and
280
299
result = TImplTraitTypeParameter ( impl , tp )
@@ -295,10 +314,19 @@ class DynTraitType extends Type, TDynTraitType {
295
314
296
315
override TupleField getTupleField ( int i ) { none ( ) }
297
316
298
- override DynTraitTypeParameter getTypeParameter ( int i ) {
317
+ override DynTraitTypeParameter getPositionalTypeParameter ( int i ) {
299
318
result = TDynTraitTypeParameter ( trait .getGenericParamList ( ) .getTypeParam ( i ) )
300
319
}
301
320
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
+
302
330
Trait getTrait ( ) { result = trait }
303
331
304
332
override string toString ( ) { result = "dyn " + trait .getName ( ) .toString ( ) }
@@ -336,7 +364,7 @@ class SliceType extends Type, TSliceType {
336
364
337
365
override TupleField getTupleField ( int i ) { none ( ) }
338
366
339
- override TypeParameter getTypeParameter ( int i ) {
367
+ override TypeParameter getPositionalTypeParameter ( int i ) {
340
368
result = TSliceTypeParameter ( ) and
341
369
i = 0
342
370
}
@@ -352,7 +380,7 @@ abstract class TypeParameter extends Type {
352
380
353
381
override TupleField getTupleField ( int i ) { none ( ) }
354
382
355
- override TypeParameter getTypeParameter ( int i ) { none ( ) }
383
+ override TypeParameter getPositionalTypeParameter ( int i ) { none ( ) }
356
384
}
357
385
358
386
private class RawTypeParameter = @type_param or @trait or @type_alias or @impl_trait_type_repr;
@@ -548,7 +576,7 @@ class ImplTraitTypeTypeParameter extends ImplTraitType, TypeParameter {
548
576
549
577
override TupleField getTupleField ( int i ) { none ( ) }
550
578
551
- override TypeParameter getTypeParameter ( int i ) { none ( ) }
579
+ override TypeParameter getPositionalTypeParameter ( int i ) { none ( ) }
552
580
}
553
581
554
582
/**
0 commit comments