44
55private import rust
66private import codeql.rust.elements.internal.generated.ParentChild
7+ private import codeql.rust.elements.internal.CallExprImpl:: Impl as CallExprImpl
78private import codeql.rust.internal.CachedStages
89private import codeql.rust.frameworks.stdlib.Builtins as Builtins
910private import codeql.util.Option
@@ -604,7 +605,13 @@ private class EnumItemNode extends TypeItemNode instanceof Enum {
604605 }
605606}
606607
607- private class VariantItemNode extends ItemNode instanceof Variant {
608+ /** An item that can be referenced with arguments. */
609+ abstract class ParameterizableItemNode extends ItemNode {
610+ /** Gets the arity this item. */
611+ abstract int getArity ( ) ;
612+ }
613+
614+ private class VariantItemNode extends ParameterizableItemNode instanceof Variant {
608615 override string getName ( ) { result = Variant .super .getName ( ) .getText ( ) }
609616
610617 override Namespace getNamespace ( ) {
@@ -617,6 +624,8 @@ private class VariantItemNode extends ItemNode instanceof Variant {
617624
618625 override Visibility getVisibility ( ) { result = super .getEnum ( ) .getVisibility ( ) }
619626
627+ override int getArity ( ) { result = super .getFieldList ( ) .( TupleFieldList ) .getNumberOfFields ( ) }
628+
620629 override predicate hasCanonicalPath ( Crate c ) { this .hasCanonicalPathPrefix ( c ) }
621630
622631 bindingset [ c]
@@ -638,7 +647,7 @@ private class VariantItemNode extends ItemNode instanceof Variant {
638647 }
639648}
640649
641- class FunctionItemNode extends AssocItemNode instanceof Function {
650+ class FunctionItemNode extends AssocItemNode , ParameterizableItemNode instanceof Function {
642651 override string getName ( ) { result = Function .super .getName ( ) .getText ( ) }
643652
644653 override predicate hasImplementation ( ) { Function .super .hasImplementation ( ) }
@@ -648,6 +657,8 @@ class FunctionItemNode extends AssocItemNode instanceof Function {
648657 override TypeParam getTypeParam ( int i ) { result = super .getGenericParamList ( ) .getTypeParam ( i ) }
649658
650659 override Visibility getVisibility ( ) { result = Function .super .getVisibility ( ) }
660+
661+ override int getArity ( ) { result = super .getNumberOfParamsInclSelf ( ) }
651662}
652663
653664abstract class ImplOrTraitItemNode extends ItemNode {
@@ -712,8 +723,10 @@ final class ImplItemNode extends ImplOrTraitItemNode instanceof Impl {
712723 TypeParamItemNode getBlanketImplementationTypeParam ( ) { result = this .resolveSelfTy ( ) }
713724
714725 /**
715- * Holds if this impl block is a blanket implementation. That is, the
726+ * Holds if this impl block is a [ blanket implementation][1] . That is, the
716727 * implementation targets a generic parameter of the impl block.
728+ *
729+ * [1]: https://doc.rust-lang.org/book/ch10-02-traits.html#using-trait-bounds-to-conditionally-implement-methods
717730 */
718731 predicate isBlanketImplementation ( ) { exists ( this .getBlanketImplementationTypeParam ( ) ) }
719732
@@ -865,7 +878,7 @@ private class ImplItemNodeImpl extends ImplItemNode {
865878 TraitItemNode resolveTraitTyCand ( ) { result = resolvePathCand ( this .getTraitPath ( ) ) }
866879}
867880
868- private class StructItemNode extends TypeItemNode instanceof Struct {
881+ private class StructItemNode extends TypeItemNode , ParameterizableItemNode instanceof Struct {
869882 override string getName ( ) { result = Struct .super .getName ( ) .getText ( ) }
870883
871884 override Namespace getNamespace ( ) {
@@ -877,6 +890,8 @@ private class StructItemNode extends TypeItemNode instanceof Struct {
877890
878891 override Visibility getVisibility ( ) { result = Struct .super .getVisibility ( ) }
879892
893+ override int getArity ( ) { result = super .getFieldList ( ) .( TupleFieldList ) .getNumberOfFields ( ) }
894+
880895 override TypeParam getTypeParam ( int i ) { result = super .getGenericParamList ( ) .getTypeParam ( i ) }
881896
882897 override predicate hasCanonicalPath ( Crate c ) { this .hasCanonicalPathPrefix ( c ) }
@@ -1687,6 +1702,14 @@ private ItemNode resolvePathCand(RelevantPath path) {
16871702 or
16881703 not pathUsesNamespace ( path , _) and
16891704 not path = any ( MacroCall mc ) .getPath ( )
1705+ ) and
1706+ (
1707+ not path = CallExprImpl:: getFunctionPath ( _)
1708+ or
1709+ exists ( CallExpr ce |
1710+ path = CallExprImpl:: getFunctionPath ( ce ) and
1711+ result .( ParameterizableItemNode ) .getArity ( ) = ce .getNumberOfArgs ( )
1712+ )
16901713 )
16911714}
16921715
0 commit comments