Merge pull request #20274 from hvitved/rust/type-synth-type-param

Rust: Include synthetic type parameters in `Type.getATypeParameter`
This commit is contained in:
Tom Hvitved
2025-08-26 14:42:29 +02:00
committed by GitHub
2 changed files with 44 additions and 16 deletions

View File

@@ -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() }
}
/**

View File

@@ -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 |