From 9ef839dc8a5be3e5a9bbe7b2f57e3fffa200d6f1 Mon Sep 17 00:00:00 2001 From: Tom Hvitved Date: Mon, 25 Aug 2025 13:09:41 +0200 Subject: [PATCH] Rust: Include synthetic type parameters in `Type.getATypeParameter` --- rust/ql/lib/codeql/rust/internal/Type.qll | 58 ++++++++++++++----- .../lib/codeql/rust/internal/TypeMention.qll | 2 +- 2 files changed, 44 insertions(+), 16 deletions(-) diff --git a/rust/ql/lib/codeql/rust/internal/Type.qll b/rust/ql/lib/codeql/rust/internal/Type.qll index 88eb50e09e38..56c179354b40 100644 --- a/rust/ql/lib/codeql/rust/internal/Type.qll +++ b/rust/ql/lib/codeql/rust/internal/Type.qll @@ -82,14 +82,23 @@ abstract class Type extends TType { pragma[nomagic] abstract TupleField getTupleField(int i); - /** Gets the `i`th type parameter of this type, if any. */ - abstract TypeParameter getTypeParameter(int i); + /** + * Gets the `i`th positional type parameter of this type, if any. + * + * This excludes synthetic type parameters, such as associated types in traits. + */ + abstract TypeParameter getPositionalTypeParameter(int i); /** Gets the default type for the `i`th type parameter, if any. */ TypeMention getTypeParameterDefault(int i) { none() } - /** Gets a type parameter of this type. */ - final TypeParameter getATypeParameter() { result = this.getTypeParameter(_) } + /** + * Gets a type parameter of this type. + * + * This includes both positional type parameters and synthetic type parameters, + * such as associated types in traits. + */ + TypeParameter getATypeParameter() { result = this.getPositionalTypeParameter(_) } /** Gets a textual representation of this type. */ abstract string toString(); @@ -108,7 +117,9 @@ class TupleType extends Type, TTuple { override TupleField getTupleField(int i) { none() } - override TypeParameter getTypeParameter(int i) { result = TTupleTypeParameter(arity, i) } + override TypeParameter getPositionalTypeParameter(int i) { + result = TTupleTypeParameter(arity, i) + } /** Gets the arity of this tuple type. */ int getArity() { result = arity } @@ -141,7 +152,7 @@ class StructType extends StructOrEnumType, TStruct { override TupleField getTupleField(int i) { result = struct.getTupleField(i) } - override TypeParameter getTypeParameter(int i) { + override TypeParameter getPositionalTypeParameter(int i) { result = TTypeParamTypeParameter(struct.getGenericParamList().getTypeParam(i)) } @@ -166,7 +177,7 @@ class EnumType extends StructOrEnumType, TEnum { override TupleField getTupleField(int i) { none() } - override TypeParameter getTypeParameter(int i) { + override TypeParameter getPositionalTypeParameter(int i) { result = TTypeParamTypeParameter(enum.getGenericParamList().getTypeParam(i)) } @@ -192,10 +203,18 @@ class TraitType extends Type, TTrait { override TupleField getTupleField(int i) { none() } - override TypeParameter getTypeParameter(int i) { + override TypeParameter getPositionalTypeParameter(int i) { result = TTypeParamTypeParameter(trait.getGenericParamList().getTypeParam(i)) } + override TypeParameter getATypeParameter() { + result = super.getATypeParameter() + or + result.(AssociatedTypeTypeParameter).getTrait() = trait + or + result.(SelfTypeParameter).getTrait() = trait + } + override TypeMention getTypeParameterDefault(int i) { result = trait.getGenericParamList().getTypeParam(i).getDefaultType() } @@ -218,7 +237,7 @@ class ArrayType extends Type, TArrayType { override TupleField getTupleField(int i) { none() } - override TypeParameter getTypeParameter(int i) { + override TypeParameter getPositionalTypeParameter(int i) { result = TArrayTypeParameter() and i = 0 } @@ -241,7 +260,7 @@ class RefType extends Type, TRefType { override TupleField getTupleField(int i) { none() } - override TypeParameter getTypeParameter(int i) { + override TypeParameter getPositionalTypeParameter(int i) { result = TRefTypeParameter() and i = 0 } @@ -274,7 +293,7 @@ class ImplTraitType extends Type, TImplTraitType { override TupleField getTupleField(int i) { none() } - override TypeParameter getTypeParameter(int i) { + override TypeParameter getPositionalTypeParameter(int i) { exists(TypeParam tp | implTraitTypeParam(impl, i, tp) and result = TImplTraitTypeParameter(impl, tp) @@ -295,10 +314,19 @@ class DynTraitType extends Type, TDynTraitType { override TupleField getTupleField(int i) { none() } - override DynTraitTypeParameter getTypeParameter(int i) { + override DynTraitTypeParameter getPositionalTypeParameter(int i) { result = TDynTraitTypeParameter(trait.getGenericParamList().getTypeParam(i)) } + override TypeParameter getATypeParameter() { + result = super.getATypeParameter() + or + exists(AstNode n | + dynTraitTypeParameter(trait, n) and + result = TDynTraitTypeParameter(n) + ) + } + Trait getTrait() { result = trait } override string toString() { result = "dyn " + trait.getName().toString() } @@ -336,7 +364,7 @@ class SliceType extends Type, TSliceType { override TupleField getTupleField(int i) { none() } - override TypeParameter getTypeParameter(int i) { + override TypeParameter getPositionalTypeParameter(int i) { result = TSliceTypeParameter() and i = 0 } @@ -352,7 +380,7 @@ abstract class TypeParameter extends Type { override TupleField getTupleField(int i) { none() } - override TypeParameter getTypeParameter(int i) { none() } + override TypeParameter getPositionalTypeParameter(int i) { none() } } private class RawTypeParameter = @type_param or @trait or @type_alias or @impl_trait_type_repr; @@ -548,7 +576,7 @@ class ImplTraitTypeTypeParameter extends ImplTraitType, TypeParameter { override TupleField getTupleField(int i) { none() } - override TypeParameter getTypeParameter(int i) { none() } + override TypeParameter getPositionalTypeParameter(int i) { none() } } /** diff --git a/rust/ql/lib/codeql/rust/internal/TypeMention.qll b/rust/ql/lib/codeql/rust/internal/TypeMention.qll index f7c5f2f25e0e..c36e19842377 100644 --- a/rust/ql/lib/codeql/rust/internal/TypeMention.qll +++ b/rust/ql/lib/codeql/rust/internal/TypeMention.qll @@ -182,7 +182,7 @@ class NonAliasPathTypeMention extends PathTypeMention { private TypeMention getTypeMentionForTypeParameter(TypeParameter tp) { exists(int i | result = this.getPositionalTypeArgument(pragma[only_bind_into](i)) and - tp = this.resolveRootType().getTypeParameter(pragma[only_bind_into](i)) + tp = this.resolveRootType().getPositionalTypeParameter(pragma[only_bind_into](i)) ) or exists(TypeAlias alias |