@@ -196,11 +196,11 @@ abstract class ItemNode extends Locatable {
196196 this = result .( ImplOrTraitItemNode ) .getAnItemInSelfScope ( )
197197 or
198198 name = "crate" and
199- this = result .( CrateItemNode ) .getARootModuleNode ( )
199+ this = result .( CrateItemNode ) .getASourceFile ( )
200200 or
201201 // todo: implement properly
202202 name = "$crate" and
203- result = any ( CrateItemNode crate | this = crate .getARootModuleNode ( ) ) .( Crate ) .getADependency * ( ) and
203+ result = any ( CrateItemNode crate | this = crate .getASourceFile ( ) ) .( Crate ) .getADependency * ( ) and
204204 result .( CrateItemNode ) .isPotentialDollarCrateTarget ( )
205205 }
206206
@@ -281,12 +281,6 @@ abstract private class ModuleLikeNode extends ItemNode {
281281 not mid instanceof ModuleLikeNode
282282 )
283283 }
284-
285- /**
286- * Holds if this is a root module, meaning either a source file or
287- * the entry module of a crate.
288- */
289- predicate isRoot ( ) { this instanceof SourceFileItemNode }
290284}
291285
292286private class SourceFileItemNode extends ModuleLikeNode , SourceFile {
@@ -312,16 +306,13 @@ private class SourceFileItemNode extends ModuleLikeNode, SourceFile {
312306
313307class CrateItemNode extends ItemNode instanceof Crate {
314308 /**
315- * Gets the module node that defines this crate.
316- *
317- * This is either a source file, when the crate is defined in source code,
318- * or a module, when the crate is defined in a dependency.
309+ * Gets the source file that defines this crate.
319310 */
320311 pragma [ nomagic]
321- ModuleLikeNode getModuleNode ( ) { result = super .getSourceFile ( ) }
312+ SourceFileItemNode getSourceFile ( ) { result = super .getSourceFile ( ) }
322313
323314 /**
324- * Gets a source file that belongs to this crate, if any .
315+ * Gets a source file that belongs to this crate.
325316 *
326317 * This is calculated as those source files that can be reached from the entry
327318 * file of this crate using zero or more `mod` imports, without going through
@@ -339,11 +330,6 @@ class CrateItemNode extends ItemNode instanceof Crate {
339330 )
340331 }
341332
342- /**
343- * Gets a root module node belonging to this crate.
344- */
345- ModuleLikeNode getARootModuleNode ( ) { result = this .getASourceFile ( ) }
346-
347333 pragma [ nomagic]
348334 predicate isPotentialDollarCrateTarget ( ) {
349335 exists ( string name , RelevantPath p |
@@ -985,7 +971,7 @@ private predicate modImport0(Module m, string name, Folder lookup) {
985971 // sibling import
986972 lookup = parent and
987973 (
988- m .getFile ( ) = any ( CrateItemNode c ) .getModuleNode ( ) . ( SourceFileItemNode ) .getFile ( )
974+ m .getFile ( ) = any ( CrateItemNode c ) .getSourceFile ( ) .getFile ( )
989975 or
990976 m .getFile ( ) .getBaseName ( ) = "mod.rs"
991977 )
@@ -1073,25 +1059,18 @@ private predicate fileImportEdge(Module mod, string name, ItemNode item) {
10731059 */
10741060pragma [ nomagic]
10751061private predicate crateDefEdge ( CrateItemNode c , string name , ItemNode i ) {
1076- i = c .getModuleNode ( ) .getASuccessorRec ( name ) and
1062+ i = c .getSourceFile ( ) .getASuccessorRec ( name ) and
10771063 not i instanceof Crate
10781064}
10791065
10801066/**
10811067 * Holds if `m` depends on crate `dep` named `name`.
10821068 */
10831069private predicate crateDependencyEdge ( ModuleLikeNode m , string name , CrateItemNode dep ) {
1084- exists ( CrateItemNode c | dep = c .( Crate ) .getDependency ( name ) |
1085- // entry module/entry source file
1086- m = c .getModuleNode ( )
1087- or
1088- // entry/transitive source file
1070+ exists ( CrateItemNode c |
1071+ dep = c .( Crate ) .getDependency ( name ) and
10891072 m = c .getASourceFile ( )
10901073 )
1091- or
1092- // paths inside the crate graph use the name of the crate itself as prefix,
1093- // although that is not valid in Rust
1094- dep = any ( Crate c | name = c .getName ( ) and m = c .getSourceFile ( ) )
10951074}
10961075
10971076private predicate useTreeDeclares ( UseTree tree , string name ) {
@@ -1159,9 +1138,9 @@ class RelevantPath extends Path {
11591138
11601139private predicate isModule ( ItemNode m ) { m instanceof Module }
11611140
1162- /** Holds if root module `root ` contains the module `m`. */
1163- private predicate rootHasModule ( ItemNode root , ItemNode m ) =
1164- doublyBoundedFastTC( hasChild / 2 , isRoot / 1 , isModule / 1 ) ( root , m )
1141+ /** Holds if source file `source ` contains the module `m`. */
1142+ private predicate rootHasModule ( SourceFileItemNode source , ItemNode m ) =
1143+ doublyBoundedFastTC( hasChild / 2 , isSourceFile / 1 , isModule / 1 ) ( source , m )
11651144
11661145pragma [ nomagic]
11671146private ItemNode getOuterScope ( ItemNode i ) {
@@ -1214,14 +1193,14 @@ private ItemNode getASuccessorFull(ItemNode pred, string name, Namespace ns) {
12141193 ns = result .getNamespace ( )
12151194}
12161195
1217- private predicate isRoot ( ItemNode root ) { root . ( ModuleLikeNode ) . isRoot ( ) }
1196+ private predicate isSourceFile ( ItemNode source ) { source instanceof SourceFileItemNode }
12181197
12191198private predicate hasCratePath ( ItemNode i ) { any ( RelevantPath path ) .isCratePath ( _, i ) }
12201199
12211200private predicate hasChild ( ItemNode parent , ItemNode child ) { child .getImmediateParent ( ) = parent }
12221201
1223- private predicate rootHasCratePathTc ( ItemNode i1 , ItemNode i2 ) =
1224- doublyBoundedFastTC( hasChild / 2 , isRoot / 1 , hasCratePath / 1 ) ( i1 , i2 )
1202+ private predicate sourceFileHasCratePathTc ( ItemNode i1 , ItemNode i2 ) =
1203+ doublyBoundedFastTC( hasChild / 2 , isSourceFile / 1 , hasCratePath / 1 ) ( i1 , i2 )
12251204
12261205/**
12271206 * Holds if the unqualified path `p` references a keyword item named `name`, and
@@ -1231,10 +1210,10 @@ pragma[nomagic]
12311210private predicate keywordLookup ( ItemNode encl , string name , Namespace ns , RelevantPath p ) {
12321211 // For `($)crate`, jump directly to the root module
12331212 exists ( ItemNode i | p .isCratePath ( name , i ) |
1234- encl . ( ModuleLikeNode ) . isRoot ( ) and
1213+ encl instanceof SourceFile and
12351214 encl = i
12361215 or
1237- rootHasCratePathTc ( encl , i )
1216+ sourceFileHasCratePathTc ( encl , i )
12381217 )
12391218 or
12401219 name = [ "super" , "self" ] and
@@ -1449,12 +1428,8 @@ private predicate preludeEdge(SourceFile f, string name, ItemNode i) {
14491428private import codeql.rust.frameworks.stdlib.Bultins as Builtins
14501429
14511430pragma [ nomagic]
1452- private predicate builtinEdge ( ModuleLikeNode m , string name , ItemNode i ) {
1453- (
1454- m instanceof SourceFile
1455- or
1456- m = any ( CrateItemNode c ) .getModuleNode ( )
1457- ) and
1431+ private predicate builtinEdge ( SourceFile source , string name , ItemNode i ) {
1432+ exists ( source ) and
14581433 exists ( SourceFileItemNode builtins |
14591434 builtins .getFile ( ) .getParentContainer ( ) instanceof Builtins:: BuiltinsFolder and
14601435 i = builtins .getASuccessorRec ( name )
0 commit comments