Skip to content

Commit 008231b

Browse files
committed
Rust: Include synthetic type parameters in Type.getATypeParameter
1 parent 4be995d commit 008231b

File tree

2 files changed

+43
-16
lines changed

2 files changed

+43
-16
lines changed

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

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

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

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)