@@ -7,6 +7,27 @@ private import codeql.rust.internal.CachedStages
77private import codeql.rust.elements.internal.generated.Raw
88private import codeql.rust.elements.internal.generated.Synth
99
10+ /**
11+ * Holds if a dyn trait type should have a type parameter associated with `n`. A
12+ * dyn trait type inherits the type parameters of the trait it implements. That
13+ * includes the type parameters corresponding to associated types.
14+ *
15+ * For instance in
16+ * ```rust
17+ * trait SomeTrait<A> {
18+ * type AssociatedType;
19+ * }
20+ * ```
21+ * this predicate holds for the nodes `A` and `type AssociatedType`.
22+ */
23+ private predicate dynTraitTypeParameter ( Trait trait , AstNode n ) {
24+ trait = any ( DynTraitTypeRepr dt ) .getTrait ( ) and
25+ (
26+ n = trait .getGenericParamList ( ) .getATypeParam ( ) or
27+ n = trait .( TraitItemNode ) .getAnAssocItem ( ) .( TypeAlias )
28+ )
29+ }
30+
1031cached
1132newtype TType =
1233 TTuple ( int arity ) {
@@ -30,9 +51,7 @@ newtype TType =
3051 TTypeParamTypeParameter ( TypeParam t ) or
3152 TAssociatedTypeTypeParameter ( TypeAlias t ) { any ( TraitItemNode trait ) .getAnAssocItem ( ) = t } or
3253 TArrayTypeParameter ( ) or
33- TDynTraitTypeParameter ( TypeParam tp ) {
34- tp = any ( DynTraitTypeRepr dt ) .getTrait ( ) .getGenericParamList ( ) .getATypeParam ( )
35- } or
54+ TDynTraitTypeParameter ( AstNode n ) { dynTraitTypeParameter ( _, n ) } or
3655 TRefTypeParameter ( ) or
3756 TSelfTypeParameter ( Trait t ) or
3857 TSliceTypeParameter ( )
@@ -406,15 +425,35 @@ class ArrayTypeParameter extends TypeParameter, TArrayTypeParameter {
406425}
407426
408427class DynTraitTypeParameter extends TypeParameter , TDynTraitTypeParameter {
409- private TypeParam typeParam ;
428+ private AstNode n ;
410429
411- DynTraitTypeParameter ( ) { this = TDynTraitTypeParameter ( typeParam ) }
430+ DynTraitTypeParameter ( ) { this = TDynTraitTypeParameter ( n ) }
412431
413- TypeParam getTypeParam ( ) { result = typeParam }
432+ Trait getTrait ( ) { dynTraitTypeParameter ( result , n ) }
414433
415- override string toString ( ) { result = "dyn(" + typeParam .toString ( ) + ")" }
434+ /** Gets the dyn trait type that this type parameter belongs to. */
435+ DynTraitType getDynTraitType ( ) { result .getTrait ( ) = this .getTrait ( ) }
416436
417- override Location getLocation ( ) { result = typeParam .getLocation ( ) }
437+ /** Gets the `TypeParam` of this dyn trait type parameter, if any. */
438+ TypeParam getTypeParam ( ) { result = n }
439+
440+ /** Gets the `TypeAlias` of this dyn trait type parameter, if any. */
441+ TypeAlias getTypeAlias ( ) { result = n }
442+
443+ /** Gets the trait type parameter that this dyn trait type parameter corresponds to. */
444+ TypeParameter getTraitTypeParameter ( ) {
445+ result .( TypeParamTypeParameter ) .getTypeParam ( ) = n
446+ or
447+ result .( AssociatedTypeTypeParameter ) .getTypeAlias ( ) = n
448+ }
449+
450+ private string toStringInner ( ) {
451+ result = [ this .getTypeParam ( ) .toString ( ) , this .getTypeAlias ( ) .getName ( ) .toString ( ) ]
452+ }
453+
454+ override string toString ( ) { result = "dyn(" + this .toStringInner ( ) + ")" }
455+
456+ override Location getLocation ( ) { result = n .getLocation ( ) }
418457}
419458
420459/** An implicit reference type parameter. */
@@ -503,8 +542,7 @@ final class ImplTypeAbstraction extends TypeAbstraction, Impl {
503542
504543final class DynTypeAbstraction extends TypeAbstraction , DynTraitTypeRepr {
505544 override TypeParameter getATypeParameter ( ) {
506- result .( TypeParamTypeParameter ) .getTypeParam ( ) =
507- this .getTrait ( ) .getGenericParamList ( ) .getATypeParam ( )
545+ result = any ( DynTraitTypeParameter tp | tp .getTrait ( ) = this .getTrait ( ) ) .getTraitTypeParameter ( )
508546 }
509547}
510548
0 commit comments