@@ -188,6 +188,7 @@ abstract class ItemNode extends Locatable {
188188 crateDefEdge ( this , name , result , kind )
189189 or
190190 crateDependencyEdge ( this , name , result ) and
191+ not declaresDirectly ( this , TTypeNamespace ( ) , name ) and
191192 kind .isInternal ( )
192193 or
193194 externCrateEdge ( this , name , result ) and
@@ -1153,6 +1154,11 @@ private class BuiltinSourceFile extends SourceFileItemNode {
11531154pragma [ nomagic]
11541155private predicate crateDependencyEdge ( SourceFileItemNode file , string name , CrateItemNode dep ) {
11551156 exists ( CrateItemNode c | dep = c .( Crate ) .getDependency ( name ) | file = c .getASourceFile ( ) )
1157+ or
1158+ // All files _should_ belong to a crate, but for those where we cannot identify the crate,
1159+ // we give access to all crates as a fallback.
1160+ not file = any ( Crate c ) .getASourceFile ( ) and
1161+ name = dep .getName ( )
11561162}
11571163
11581164private predicate useTreeDeclares ( UseTree tree , string name ) {
@@ -1174,15 +1180,24 @@ private predicate useTreeDeclares(UseTree tree, string name) {
11741180
11751181/**
11761182 * Holds if `item` explicitly declares a sub item named `name` in the
1177- * namespace `ns`. This includes items declared by `use` statements,
1178- * except for glob imports.
1183+ * namespace `ns`. This excludes items declared by `use` statements.
11791184 */
11801185pragma [ nomagic]
1181- private predicate declares ( ItemNode item , Namespace ns , string name ) {
1186+ private predicate declaresDirectly ( ItemNode item , Namespace ns , string name ) {
11821187 exists ( ItemNode child , SuccessorKind kind | child = getAChildSuccessor ( item , name , kind ) |
11831188 child .getNamespace ( ) = ns and
11841189 kind .isInternalOrBoth ( )
11851190 )
1191+ }
1192+
1193+ /**
1194+ * Holds if `item` explicitly declares a sub item named `name` in the
1195+ * namespace `ns`. This includes items declared by `use` statements,
1196+ * except for glob imports.
1197+ */
1198+ pragma [ nomagic]
1199+ private predicate declares ( ItemNode item , Namespace ns , string name ) {
1200+ declaresDirectly ( item , ns , name )
11861201 or
11871202 exists ( ItemNode child |
11881203 child .getImmediateParent ( ) = item and
@@ -1482,20 +1497,13 @@ private predicate externCrateEdge(ExternCrateItemNode ec, string name, CrateItem
14821497
14831498pragma [ nomagic]
14841499private predicate preludeItem ( string name , ItemNode i ) {
1485- exists ( Crate stdOrCore , string stdOrCoreName |
1486- stdOrCore .getName ( ) = stdOrCoreName and
1487- stdOrCoreName = [ "std" , "core" ]
1488- |
1489- name = stdOrCoreName and
1490- i = stdOrCore
1491- or
1492- exists ( ModuleLikeNode mod , ModuleItemNode prelude , ModuleItemNode rust |
1493- mod = stdOrCore .getSourceFile ( ) and
1494- prelude = mod .getASuccessor ( "prelude" ) and
1495- rust = prelude .getASuccessor ( [ "rust_2015" , "rust_2018" , "rust_2021" , "rust_2024" ] ) and
1496- i = rust .getASuccessor ( name ) and
1497- not name = [ "super" , "self" ]
1498- )
1500+ exists ( Crate stdOrCore , ModuleLikeNode mod , ModuleItemNode prelude , ModuleItemNode rust |
1501+ stdOrCore .getName ( ) = [ "std" , "core" ] and
1502+ mod = stdOrCore .getSourceFile ( ) and
1503+ prelude = mod .getASuccessor ( "prelude" ) and
1504+ rust = prelude .getASuccessor ( [ "rust_2015" , "rust_2018" , "rust_2021" , "rust_2024" ] ) and
1505+ i = rust .getASuccessor ( name ) and
1506+ not name = [ "super" , "self" ]
14991507 )
15001508}
15011509
@@ -1512,7 +1520,7 @@ private predicate preludeItem(string name, ItemNode i) {
15121520pragma [ nomagic]
15131521private predicate preludeEdge ( SourceFile f , string name , ItemNode i ) {
15141522 preludeItem ( name , i ) and
1515- not declares ( f , _ , name )
1523+ not declares ( f , i . getNamespace ( ) , name )
15161524}
15171525
15181526pragma [ nomagic]
0 commit comments