Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
58 changes: 43 additions & 15 deletions rust/ql/lib/codeql/rust/internal/Type.qll
Original file line number Diff line number Diff line change
Expand Up @@ -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(_) }
Copy link

Copilot AI Aug 25, 2025

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The default implementation of getATypeParameter() only returns positional type parameters. This means that types like StructType, EnumType, etc. won't include their synthetic type parameters unless they override this method. Consider making this method abstract or providing a more comprehensive default implementation.

Suggested change
TypeParameter getATypeParameter() { result = this.getPositionalTypeParameter(_) }
abstract TypeParameter getATypeParameter();

Copilot uses AI. Check for mistakes.

/** Gets a textual representation of this type. */
abstract string toString();
Expand All @@ -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 }
Expand Down Expand Up @@ -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))
}

Expand All @@ -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))
}

Expand All @@ -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()
}
Expand All @@ -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
}
Expand All @@ -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
}
Expand Down Expand Up @@ -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)
Expand All @@ -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() }
Expand Down Expand Up @@ -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
}
Expand All @@ -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;
Expand Down Expand Up @@ -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() }
}

/**
Expand Down
2 changes: 1 addition & 1 deletion rust/ql/lib/codeql/rust/internal/TypeMention.qll
Original file line number Diff line number Diff line change
Expand Up @@ -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 |
Expand Down