@@ -9,10 +9,17 @@ private import codeql.rust.elements.internal.generated.Synth
99private import codeql.rust.frameworks.stdlib.Stdlib
1010private import codeql.rust.frameworks.stdlib.Builtins as Builtins
1111
12+ /** Gets a type alias of `trait` or of a supertrait of `trait`. */
13+ private TypeAlias getTraitTypeAlias ( Trait trait ) {
14+ result = trait .getSupertrait * ( ) .getAssocItemList ( ) .getAnAssocItem ( )
15+ }
16+
1217/**
13- * Holds if a dyn trait type should have a type parameter associated with `n`. A
14- * dyn trait type inherits the type parameters of the trait it implements. That
15- * includes the type parameters corresponding to associated types.
18+ * Holds if a dyn trait type for the trait `trait` should have a type parameter
19+ * associated with `n`.
20+ *
21+ * A dyn trait type inherits the type parameters of the trait it implements.
22+ * That includes the type parameters corresponding to associated types.
1623 *
1724 * For instance in
1825 * ```rust
@@ -24,10 +31,7 @@ private import codeql.rust.frameworks.stdlib.Builtins as Builtins
2431 */
2532private predicate dynTraitTypeParameter ( Trait trait , AstNode n ) {
2633 trait = any ( DynTraitTypeRepr dt ) .getTrait ( ) and
27- (
28- n = trait .getGenericParamList ( ) .getATypeParam ( ) or
29- n = trait .( TraitItemNode ) .getAnAssocItem ( ) .( TypeAlias )
30- )
34+ n = [ trait .getGenericParamList ( ) .getATypeParam ( ) .( AstNode ) , getTraitTypeAlias ( trait ) ]
3135}
3236
3337cached
@@ -39,8 +43,10 @@ newtype TType =
3943 TNeverType ( ) or
4044 TUnknownType ( ) or
4145 TTypeParamTypeParameter ( TypeParam t ) or
42- TAssociatedTypeTypeParameter ( TypeAlias t ) { any ( TraitItemNode trait ) .getAnAssocItem ( ) = t } or
43- TDynTraitTypeParameter ( AstNode n ) { dynTraitTypeParameter ( _, n ) } or
46+ TAssociatedTypeTypeParameter ( Trait trait , TypeAlias typeAlias ) {
47+ getTraitTypeAlias ( trait ) = typeAlias
48+ } or
49+ TDynTraitTypeParameter ( Trait trait , AstNode n ) { dynTraitTypeParameter ( trait , n ) } or
4450 TImplTraitTypeParameter ( ImplTraitTypeRepr implTrait , TypeParam tp ) {
4551 implTraitTypeParam ( implTrait , _, tp )
4652 } or
@@ -270,17 +276,10 @@ class DynTraitType extends Type, TDynTraitType {
270276 DynTraitType ( ) { this = TDynTraitType ( trait ) }
271277
272278 override DynTraitTypeParameter getPositionalTypeParameter ( int i ) {
273- result = TDynTraitTypeParameter ( trait .getGenericParamList ( ) .getTypeParam ( i ) )
279+ result . getTypeParam ( ) = trait .getGenericParamList ( ) .getTypeParam ( i )
274280 }
275281
276- override TypeParameter getATypeParameter ( ) {
277- result = super .getATypeParameter ( )
278- or
279- exists ( AstNode n |
280- dynTraitTypeParameter ( trait , n ) and
281- result = TDynTraitTypeParameter ( n )
282- )
283- }
282+ override DynTraitTypeParameter getATypeParameter ( ) { result .getTrait ( ) = trait }
284283
285284 Trait getTrait ( ) { result = trait }
286285
@@ -427,30 +426,54 @@ class TypeParamTypeParameter extends TypeParameter, TTypeParamTypeParameter {
427426 * // ...
428427 * }
429428 * ```
429+ * Furthermore, associated types of a supertrait induce a corresponding type
430+ * parameter in any subtraits. E.g., if we have a trait `SubTrait: ATrait` then
431+ * `SubTrait` also has a type parameter for the associated type
432+ * `AssociatedType`.
430433 */
431434class AssociatedTypeTypeParameter extends TypeParameter , TAssociatedTypeTypeParameter {
435+ private Trait trait ;
432436 private TypeAlias typeAlias ;
433437
434- AssociatedTypeTypeParameter ( ) { this = TAssociatedTypeTypeParameter ( typeAlias ) }
438+ AssociatedTypeTypeParameter ( ) { this = TAssociatedTypeTypeParameter ( trait , typeAlias ) }
435439
436440 TypeAlias getTypeAlias ( ) { result = typeAlias }
437441
438442 /** Gets the trait that contains this associated type declaration. */
439- TraitItemNode getTrait ( ) { result . getAnAssocItem ( ) = typeAlias }
443+ TraitItemNode getTrait ( ) { result = trait }
440444
441- override ItemNode getDeclaringItem ( ) { result = this .getTrait ( ) }
445+ /**
446+ * Holds if this associated type type parameter corresponds directly its
447+ * trait, that is, it is not inherited from a supertrait.
448+ */
449+ predicate isDirect ( ) { trait .( TraitItemNode ) .getAnAssocItem ( ) = typeAlias }
450+
451+ override ItemNode getDeclaringItem ( ) { result = trait }
442452
443- override string toString ( ) { result = typeAlias .getName ( ) .getText ( ) }
453+ override string toString ( ) {
454+ result = typeAlias .getName ( ) .getText ( ) + "[" + trait .getName ( ) .toString ( ) + "]"
455+ }
444456
445457 override Location getLocation ( ) { result = typeAlias .getLocation ( ) }
446458}
447459
460+ /** Gets the associated type type-parameter corresponding directly to `typeAlias`. */
461+ AssociatedTypeTypeParameter getAssociatedTypeTypeParameter ( TypeAlias typeAlias ) {
462+ result .isDirect ( ) and result .getTypeAlias ( ) = typeAlias
463+ }
464+
465+ /** Gets the dyn type type-parameter corresponding directly to `typeAlias`. */
466+ DynTraitTypeParameter getDynTraitTypeParameter ( TypeAlias typeAlias ) {
467+ result .getTraitTypeParameter ( ) = getAssociatedTypeTypeParameter ( typeAlias )
468+ }
469+
448470class DynTraitTypeParameter extends TypeParameter , TDynTraitTypeParameter {
471+ private Trait trait ;
449472 private AstNode n ;
450473
451- DynTraitTypeParameter ( ) { this = TDynTraitTypeParameter ( n ) }
474+ DynTraitTypeParameter ( ) { this = TDynTraitTypeParameter ( trait , n ) }
452475
453- Trait getTrait ( ) { dynTraitTypeParameter ( result , n ) }
476+ Trait getTrait ( ) { result = trait }
454477
455478 /** Gets the dyn trait type that this type parameter belongs to. */
456479 DynTraitType getDynTraitType ( ) { result .getTrait ( ) = this .getTrait ( ) }
@@ -465,7 +488,7 @@ class DynTraitTypeParameter extends TypeParameter, TDynTraitTypeParameter {
465488 TypeParameter getTraitTypeParameter ( ) {
466489 result .( TypeParamTypeParameter ) .getTypeParam ( ) = n
467490 or
468- result . ( AssociatedTypeTypeParameter ) . getTypeAlias ( ) = n
491+ result = TAssociatedTypeTypeParameter ( trait , n )
469492 }
470493
471494 private string toStringInner ( ) {
0 commit comments