Skip to content

Commit 3527fca

Browse files
authored
Merge pull request #20274 from hvitved/rust/type-synth-type-param
Rust: Include synthetic type parameters in `Type.getATypeParameter`
2 parents 87d1a14 + 9ef839d commit 3527fca

File tree

2 files changed

+44
-16
lines changed

2 files changed

+44
-16
lines changed

rust/ql/lib/codeql/rust/internal/Type.qll

Lines changed: 43 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -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

358386
private 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
/**

rust/ql/lib/codeql/rust/internal/TypeMention.qll

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -182,7 +182,7 @@ class NonAliasPathTypeMention extends PathTypeMention {
182182
private TypeMention getTypeMentionForTypeParameter(TypeParameter tp) {
183183
exists(int i |
184184
result = this.getPositionalTypeArgument(pragma[only_bind_into](i)) and
185-
tp = this.resolveRootType().getTypeParameter(pragma[only_bind_into](i))
185+
tp = this.resolveRootType().getPositionalTypeParameter(pragma[only_bind_into](i))
186186
)
187187
or
188188
exists(TypeAlias alias |

0 commit comments

Comments
 (0)