mirror of
https://github.com/github/codeql.git
synced 2025-12-17 01:03:14 +01:00
Merge pull request #20274 from hvitved/rust/type-synth-type-param
Rust: Include synthetic type parameters in `Type.getATypeParameter`
This commit is contained in:
@@ -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() }
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
@@ -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 |
|
||||
|
||||
Reference in New Issue
Block a user