@@ -1457,6 +1457,27 @@ private predicate crateDependencyEdge(SourceFileItemNode file, string name, Crat
14571457 not hasDeclOrDep ( file , name )
14581458}
14591459
1460+ /**
1461+ * Gets a `UseTree` that is nested under `tree`, and which needs to be resolved
1462+ * relative to the path of `tree`.
1463+ *
1464+ * `tree` either has a path or is a direct child of some `use` statement.
1465+ */
1466+ private UseTree getAUseTreeUseTree ( UseTree tree ) {
1467+ result = tree .getUseTreeList ( ) .getAUseTree ( ) and
1468+ (
1469+ tree .hasPath ( )
1470+ or
1471+ tree = any ( Use u ) .getUseTree ( )
1472+ )
1473+ or
1474+ exists ( UseTree mid |
1475+ mid = getAUseTreeUseTree ( tree ) and
1476+ not mid .hasPath ( ) and
1477+ result = mid .getUseTreeList ( ) .getAUseTree ( )
1478+ )
1479+ }
1480+
14601481private predicate useTreeDeclares ( UseTree tree , string name ) {
14611482 not tree .isGlob ( ) and
14621483 not exists ( tree .getUseTreeList ( ) ) and
@@ -1470,7 +1491,7 @@ private predicate useTreeDeclares(UseTree tree, string name) {
14701491 or
14711492 exists ( UseTree mid |
14721493 useTreeDeclares ( mid , name ) and
1473- mid = tree . getUseTreeList ( ) . getAUseTree ( )
1494+ mid = getAUseTreeUseTree ( tree )
14741495 )
14751496}
14761497
@@ -1511,7 +1532,10 @@ class RelevantPath extends Path {
15111532 pragma [ nomagic]
15121533 predicate isUnqualified ( string name ) {
15131534 not exists ( this .getQualifier ( ) ) and
1514- not this = any ( UseTreeList list ) .getAUseTree ( ) .getPath ( ) .getQualifier * ( ) and
1535+ not exists ( UseTree tree |
1536+ tree .hasPath ( ) and
1537+ this = getAUseTreeUseTree ( tree ) .getPath ( ) .getQualifier * ( )
1538+ ) and
15151539 name = this .getText ( )
15161540 }
15171541
@@ -1990,7 +2014,7 @@ private ItemNode resolveUseTreeListItem(Use use, UseTree tree, RelevantPath path
19902014 exists ( UseOption useOpt | checkQualifiedVisibility ( use , result , kind , useOpt ) |
19912015 exists ( UseTree midTree , ItemNode mid , string name |
19922016 mid = resolveUseTreeListItem ( use , midTree ) and
1993- tree = midTree . getUseTreeList ( ) . getAUseTree ( ) and
2017+ tree = getAUseTreeUseTree ( midTree ) and
19942018 isUseTreeSubPathUnqualified ( tree , path , pragma [ only_bind_into ] ( name ) ) and
19952019 result = mid .getASuccessor ( pragma [ only_bind_into ] ( name ) , kind , useOpt )
19962020 )
@@ -2010,14 +2034,31 @@ private ItemNode resolveUseTreeListItemQualifier(
20102034 name = path .getText ( )
20112035}
20122036
2037+ private UseTree getAUseUseTree ( Use use ) {
2038+ result = use .getUseTree ( )
2039+ or
2040+ exists ( UseTree root |
2041+ root = use .getUseTree ( ) and
2042+ not root .hasPath ( ) and
2043+ result = getAUseTreeUseTree ( root )
2044+ )
2045+ }
2046+
20132047pragma [ nomagic]
20142048private ItemNode resolveUseTreeListItem ( Use use , UseTree tree ) {
20152049 exists ( Path path | path = tree .getPath ( ) |
2016- tree = use . getUseTree ( ) and
2050+ tree = getAUseUseTree ( use ) and
20172051 result = resolvePathCand ( path )
20182052 or
20192053 result = resolveUseTreeListItem ( use , tree , path , _)
20202054 )
2055+ or
2056+ exists ( UseTree midTree |
2057+ result = resolveUseTreeListItem ( use , midTree ) and
2058+ tree = getAUseTreeUseTree ( midTree ) and
2059+ tree .isGlob ( ) and
2060+ not tree .hasPath ( )
2061+ )
20212062}
20222063
20232064/** Holds if `use` imports `item` as `name`. */
@@ -2159,6 +2200,16 @@ private module Debug {
21592200 result = resolvePath ( path )
21602201 }
21612202
2203+ ItemNode debugResolveUseTreeListItem ( Use use , UseTree tree , RelevantPath path , SuccessorKind kind ) {
2204+ use = getRelevantLocatable ( ) and
2205+ result = resolveUseTreeListItem ( use , tree , path , kind )
2206+ }
2207+
2208+ ItemNode debugResolveUseTreeListItem ( Use use , UseTree tree ) {
2209+ use = getRelevantLocatable ( ) and
2210+ result = resolveUseTreeListItem ( use , tree )
2211+ }
2212+
21622213 predicate debugUseImportEdge ( Use use , string name , ItemNode item , SuccessorKind kind ) {
21632214 use = getRelevantLocatable ( ) and
21642215 useImportEdge ( use , name , item , kind )
0 commit comments