diff --git a/rust/ql/lib/codeql/rust/internal/PathResolution.qll b/rust/ql/lib/codeql/rust/internal/PathResolution.qll index c70ab0049d56..c6ab2135d973 100644 --- a/rust/ql/lib/codeql/rust/internal/PathResolution.qll +++ b/rust/ql/lib/codeql/rust/internal/PathResolution.qll @@ -194,21 +194,11 @@ abstract class ItemNode extends Locatable { this = result.(ImplOrTraitItemNode).getAnItemInSelfScope() or name = "crate" and - result = - any(CrateItemNode crate | - this = crate.getASourceFile() - or - this = crate.getModuleNode() - ) + this = result.(CrateItemNode).getARootModuleNode() or // todo: implement properly name = "$crate" and - result = - any(CrateItemNode crate | - this = crate.getASourceFile() - or - this = crate.getModuleNode() - ).(Crate).getADependency*() and + result = any(CrateItemNode crate | this = crate.getARootModuleNode()).(Crate).getADependency*() and result.(CrateItemNode).isPotentialDollarCrateTarget() } @@ -237,7 +227,7 @@ abstract private class ModuleLikeNode extends ItemNode { predicate isRoot() { this instanceof SourceFileItemNode or - this = any(CrateItemNode c).getModuleNode() + this = any(Crate c).getModule() } } @@ -294,6 +284,15 @@ class CrateItemNode extends ItemNode instanceof Crate { ) } + /** + * Gets a root module node belonging to this crate. + */ + ModuleLikeNode getARootModuleNode() { + result = this.getASourceFile() + or + result = super.getModule() + } + pragma[nomagic] predicate isPotentialDollarCrateTarget() { exists(string name, RelevantPath p |