Skip to content

Commit f54d832

Browse files
authored
Merge pull request #19133 from hvitved/rust/more-path-resolution
Rust: More path resolution improvements
2 parents 3652d6f + 605cf35 commit f54d832

File tree

5 files changed

+183
-75
lines changed

5 files changed

+183
-75
lines changed

rust/ql/lib/codeql/rust/internal/PathResolution.qll

Lines changed: 80 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -116,7 +116,7 @@ abstract class ItemNode extends Locatable {
116116
}
117117

118118
pragma[nomagic]
119-
private ItemNode getASuccessorRec(string name) {
119+
ItemNode getASuccessorRec(string name) {
120120
sourceFileEdge(this, name, result)
121121
or
122122
this = result.getImmediateParent() and
@@ -618,11 +618,11 @@ private predicate fileModule(SourceFile f, string name, Folder folder) {
618618
}
619619

620620
/**
621-
* Holds if `m` is a `mod name;` module declaration happening in a file named
622-
* `fileName.rs`, inside the folder `parent`.
621+
* Holds if `m` is a `mod name;` module declaration, where the corresponding
622+
* module file needs to be looked up in `lookup` or one of its descandants.
623623
*/
624-
private predicate modImport(Module m, string fileName, string name, Folder parent) {
625-
exists(File f |
624+
private predicate modImport0(Module m, string name, Folder lookup) {
625+
exists(File f, Folder parent, string fileName |
626626
f = m.getFile() and
627627
not m.hasItemList() and
628628
// TODO: handle
@@ -634,17 +634,63 @@ private predicate modImport(Module m, string fileName, string name, Folder paren
634634
name = m.getName().getText() and
635635
parent = f.getParentContainer() and
636636
fileName = f.getStem()
637+
|
638+
// sibling import
639+
lookup = parent and
640+
(
641+
m.getFile() = any(CrateItemNode c).getModuleNode().(SourceFileItemNode).getFile()
642+
or
643+
m.getFile().getBaseName() = "mod.rs"
644+
)
645+
or
646+
// child import
647+
lookup = parent.getFolder(fileName)
648+
)
649+
}
650+
651+
/**
652+
* Holds if `m` is a `mod name;` module declaration, which happens inside a
653+
* nested module, and `pred -> succ` is a module edge leading to `m`.
654+
*/
655+
private predicate modImportNested(ModuleItemNode m, ModuleItemNode pred, ModuleItemNode succ) {
656+
pred.getAnItemInScope() = succ and
657+
(
658+
modImport0(m, _, _) and
659+
succ = m
660+
or
661+
modImportNested(m, succ, _)
662+
)
663+
}
664+
665+
/**
666+
* Holds if `m` is a `mod name;` module declaration, which happens inside a
667+
* nested module, where `ancestor` is a reflexive transitive ancestor module
668+
* of `m` with corresponding lookup folder `lookup`.
669+
*/
670+
private predicate modImportNestedLookup(Module m, ModuleItemNode ancestor, Folder lookup) {
671+
modImport0(m, _, lookup) and
672+
modImportNested(m, ancestor, _) and
673+
not modImportNested(m, _, ancestor)
674+
or
675+
exists(ModuleItemNode m1, Folder mid |
676+
modImportNestedLookup(m, m1, mid) and
677+
modImportNested(m, m1, ancestor) and
678+
lookup = mid.getFolder(m1.getName())
637679
)
638680
}
639681

640682
/** Holds if `m` is a `mod name;` item importing file `f`. */
641683
private predicate fileImport(Module m, SourceFile f) {
642-
exists(string fileName, string name, Folder parent | modImport(m, fileName, name, parent) |
643-
// sibling import
684+
exists(string name, Folder parent |
685+
modImport0(m, name, _) and
644686
fileModule(f, name, parent)
687+
|
688+
// `m` is not inside a nested module
689+
modImport0(m, name, parent) and
690+
not modImportNested(m, _, _)
645691
or
646-
// child import
647-
fileModule(f, name, parent.getFolder(fileName))
692+
// `m` is inside a nested module
693+
modImportNestedLookup(m, m, parent)
648694
)
649695
}
650696

@@ -656,7 +702,7 @@ pragma[nomagic]
656702
private predicate fileImportEdge(Module mod, string name, ItemNode item) {
657703
exists(SourceFileItemNode f |
658704
fileImport(mod, f) and
659-
item = f.getASuccessor(name)
705+
item = f.getASuccessorRec(name)
660706
)
661707
}
662708

@@ -665,7 +711,7 @@ private predicate fileImportEdge(Module mod, string name, ItemNode item) {
665711
*/
666712
pragma[nomagic]
667713
private predicate crateDefEdge(CrateItemNode c, string name, ItemNode i) {
668-
i = c.getModuleNode().getASuccessor(name) and
714+
i = c.getModuleNode().getASuccessorRec(name) and
669715
not i instanceof Crate
670716
}
671717

@@ -747,7 +793,16 @@ private predicate unqualifiedPathLookup(RelevantPath p, string name, Namespace n
747793
// lookup in an outer scope, but only if the item is not declared in inner scope
748794
exists(ItemNode mid |
749795
unqualifiedPathLookup(p, name, ns, mid) and
750-
not declares(mid, ns, name)
796+
not declares(mid, ns, name) and
797+
not name = ["super", "self"] and
798+
not (
799+
name = "Self" and
800+
mid = any(ImplOrTraitItemNode i).getAnItemInSelfScope()
801+
) and
802+
not (
803+
name = "crate" and
804+
mid = any(CrateItemNode i).getASourceFile()
805+
)
751806
|
752807
// nested modules do not have unqualified access to items from outer modules,
753808
// except for items declared at top-level in the source file
@@ -948,15 +1003,19 @@ private predicate useImportEdge(Use use, string name, ItemNode item) {
9481003
encl.getADescendant() = use and
9491004
item = getASuccessor(used, name, ns) and
9501005
// glob imports can be shadowed
951-
not declares(encl, ns, name)
1006+
not declares(encl, ns, name) and
1007+
not name = ["super", "self", "Self", "crate"]
9521008
)
953-
else item = used
954-
|
955-
not tree.hasRename() and
956-
name = item.getName()
957-
or
958-
name = tree.getRename().getName().getText() and
959-
name != "_"
1009+
else (
1010+
item = used and
1011+
(
1012+
not tree.hasRename() and
1013+
name = item.getName()
1014+
or
1015+
name = tree.getRename().getName().getText() and
1016+
name != "_"
1017+
)
1018+
)
9601019
)
9611020
}
9621021

@@ -966,7 +1025,7 @@ private module Debug {
9661025
exists(string filepath, int startline, int startcolumn, int endline, int endcolumn |
9671026
result.getLocation().hasLocationInfo(filepath, startline, startcolumn, endline, endcolumn) and
9681027
filepath.matches("%/main.rs") and
969-
startline = 1
1028+
startline = [1, 3]
9701029
)
9711030
}
9721031

rust/ql/test/library-tests/path-resolution/main.rs

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -473,6 +473,26 @@ mod m17 {
473473
} // I99
474474
}
475475

476+
mod m18 {
477+
fn f() {
478+
println!("m18::f");
479+
} // I101
480+
481+
pub mod m19 {
482+
fn f() {
483+
println!("m18::m19::f");
484+
} // I102
485+
486+
pub mod m20 {
487+
pub fn g() {
488+
println!("m18::m19::m20::g");
489+
super::f(); // $ item=I102
490+
super::super::f(); // $ item=I101
491+
} // I103
492+
}
493+
}
494+
}
495+
476496
fn main() {
477497
my::nested::nested1::nested2::f(); // $ item=I4
478498
my::f(); // $ item=I38
@@ -498,4 +518,6 @@ fn main() {
498518
nested6::f(); // $ item=I116
499519
nested8::f(); // $ item=I119
500520
my3::f(); // $ item=I200
521+
nested_f(); // $ item=I201
522+
m18::m19::m20::g(); // $ item=I103
501523
}

rust/ql/test/library-tests/path-resolution/my.rs

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,3 +10,9 @@ pub fn h() {
1010
println!("my.rs::h");
1111
g(); // $ item=I7
1212
} // I39
13+
14+
mod my4 {
15+
pub mod my5;
16+
}
17+
18+
pub use my4::my5::f as nested_f; // $ item=I201
Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
pub fn f() {
2+
println!("my/my4/my5/mod.rs::f");
3+
} // I201

rust/ql/test/library-tests/path-resolution/path-resolution.expected

Lines changed: 72 additions & 54 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,9 @@ mod
2121
| main.rs:294:1:348:1 | mod m15 |
2222
| main.rs:350:1:442:1 | mod m16 |
2323
| main.rs:444:1:474:1 | mod m17 |
24+
| main.rs:476:1:494:1 | mod m18 |
25+
| main.rs:481:5:493:5 | mod m19 |
26+
| main.rs:486:9:492:9 | mod m20 |
2427
| my2/mod.rs:1:1:1:16 | mod nested2 |
2528
| my2/mod.rs:12:1:12:12 | mod my3 |
2629
| my2/nested2.rs:1:1:11:1 | mod nested3 |
@@ -30,6 +33,8 @@ mod
3033
| my2/nested2.rs:21:1:27:1 | mod nested7 |
3134
| my2/nested2.rs:22:5:26:5 | mod nested8 |
3235
| my.rs:1:1:1:15 | mod nested |
36+
| my.rs:14:1:16:1 | mod my4 |
37+
| my.rs:15:5:15:16 | mod my5 |
3338
| my/nested.rs:1:1:17:1 | mod nested1 |
3439
| my/nested.rs:2:5:11:5 | mod nested2 |
3540
resolvePath
@@ -51,7 +56,7 @@ resolvePath
5156
| main.rs:30:17:30:21 | super | main.rs:18:5:36:5 | mod m2 |
5257
| main.rs:30:17:30:24 | ...::f | main.rs:19:9:21:9 | fn f |
5358
| main.rs:33:17:33:17 | f | main.rs:19:9:21:9 | fn f |
54-
| main.rs:40:9:40:13 | super | main.rs:1:1:501:2 | SourceFile |
59+
| main.rs:40:9:40:13 | super | main.rs:1:1:523:2 | SourceFile |
5560
| main.rs:40:9:40:17 | ...::m1 | main.rs:13:1:37:1 | mod m1 |
5661
| main.rs:40:9:40:21 | ...::m2 | main.rs:18:5:36:5 | mod m2 |
5762
| main.rs:40:9:40:24 | ...::g | main.rs:23:9:27:9 | fn g |
@@ -63,7 +68,7 @@ resolvePath
6368
| main.rs:61:17:61:19 | Foo | main.rs:59:9:59:21 | struct Foo |
6469
| main.rs:64:13:64:15 | Foo | main.rs:53:5:53:17 | struct Foo |
6570
| main.rs:66:5:66:5 | f | main.rs:55:5:62:5 | fn f |
66-
| main.rs:68:5:68:8 | self | main.rs:1:1:501:2 | SourceFile |
71+
| main.rs:68:5:68:8 | self | main.rs:1:1:523:2 | SourceFile |
6772
| main.rs:68:5:68:11 | ...::i | main.rs:71:1:83:1 | fn i |
6873
| main.rs:74:13:74:15 | Foo | main.rs:48:1:48:13 | struct Foo |
6974
| main.rs:81:17:81:19 | Foo | main.rs:77:9:79:9 | struct Foo |
@@ -77,7 +82,7 @@ resolvePath
7782
| main.rs:87:57:87:66 | ...::g | my2/nested2.rs:7:9:9:9 | fn g |
7883
| main.rs:87:80:87:86 | nested4 | my2/nested2.rs:2:5:10:5 | mod nested4 |
7984
| main.rs:100:5:100:22 | f_defined_in_macro | main.rs:99:18:99:42 | fn f_defined_in_macro |
80-
| main.rs:117:13:117:17 | super | main.rs:1:1:501:2 | SourceFile |
85+
| main.rs:117:13:117:17 | super | main.rs:1:1:523:2 | SourceFile |
8186
| main.rs:117:13:117:21 | ...::m5 | main.rs:103:1:107:1 | mod m5 |
8287
| main.rs:118:9:118:9 | f | main.rs:104:5:106:5 | fn f |
8388
| main.rs:118:9:118:9 | f | main.rs:110:5:112:5 | fn f |
@@ -210,56 +215,66 @@ resolvePath
210215
| main.rs:465:9:465:18 | ...::f | main.rs:446:9:446:20 | fn f |
211216
| main.rs:470:9:470:9 | g | main.rs:459:5:466:5 | fn g |
212217
| main.rs:471:11:471:11 | S | main.rs:449:5:449:13 | struct S |
213-
| main.rs:477:5:477:6 | my | main.rs:1:1:1:7 | mod my |
214-
| main.rs:477:5:477:14 | ...::nested | my.rs:1:1:1:15 | mod nested |
215-
| main.rs:477:5:477:23 | ...::nested1 | my/nested.rs:1:1:17:1 | mod nested1 |
216-
| main.rs:477:5:477:32 | ...::nested2 | my/nested.rs:2:5:11:5 | mod nested2 |
217-
| main.rs:477:5:477:35 | ...::f | my/nested.rs:3:9:5:9 | fn f |
218-
| main.rs:478:5:478:6 | my | main.rs:1:1:1:7 | mod my |
219-
| main.rs:478:5:478:9 | ...::f | my.rs:5:1:7:1 | fn f |
220-
| main.rs:479:5:479:11 | nested2 | my2/mod.rs:1:1:1:16 | mod nested2 |
221-
| main.rs:479:5:479:20 | ...::nested3 | my2/nested2.rs:1:1:11:1 | mod nested3 |
222-
| main.rs:479:5:479:29 | ...::nested4 | my2/nested2.rs:2:5:10:5 | mod nested4 |
223-
| main.rs:479:5:479:32 | ...::f | my2/nested2.rs:3:9:5:9 | fn f |
224-
| main.rs:480:5:480:5 | f | my2/nested2.rs:3:9:5:9 | fn f |
225-
| main.rs:481:5:481:5 | g | my2/nested2.rs:7:9:9:9 | fn g |
226-
| main.rs:482:5:482:9 | crate | main.rs:0:0:0:0 | Crate([email protected]) |
227-
| main.rs:482:5:482:12 | ...::h | main.rs:50:1:69:1 | fn h |
228-
| main.rs:483:5:483:6 | m1 | main.rs:13:1:37:1 | mod m1 |
229-
| main.rs:483:5:483:10 | ...::m2 | main.rs:18:5:36:5 | mod m2 |
230-
| main.rs:483:5:483:13 | ...::g | main.rs:23:9:27:9 | fn g |
231-
| main.rs:484:5:484:6 | m1 | main.rs:13:1:37:1 | mod m1 |
232-
| main.rs:484:5:484:10 | ...::m2 | main.rs:18:5:36:5 | mod m2 |
233-
| main.rs:484:5:484:14 | ...::m3 | main.rs:29:9:35:9 | mod m3 |
234-
| main.rs:484:5:484:17 | ...::h | main.rs:30:27:34:13 | fn h |
235-
| main.rs:485:5:485:6 | m4 | main.rs:39:1:46:1 | mod m4 |
236-
| main.rs:485:5:485:9 | ...::i | main.rs:42:5:45:5 | fn i |
237-
| main.rs:486:5:486:5 | h | main.rs:50:1:69:1 | fn h |
238-
| main.rs:487:5:487:11 | f_alias | my2/nested2.rs:3:9:5:9 | fn f |
239-
| main.rs:488:5:488:11 | g_alias | my2/nested2.rs:7:9:9:9 | fn g |
240-
| main.rs:489:5:489:5 | j | main.rs:97:1:101:1 | fn j |
241-
| main.rs:490:5:490:6 | m6 | main.rs:109:1:120:1 | mod m6 |
242-
| main.rs:490:5:490:9 | ...::g | main.rs:114:5:119:5 | fn g |
243-
| main.rs:491:5:491:6 | m7 | main.rs:122:1:137:1 | mod m7 |
244-
| main.rs:491:5:491:9 | ...::f | main.rs:129:5:136:5 | fn f |
245-
| main.rs:492:5:492:6 | m8 | main.rs:139:1:193:1 | mod m8 |
246-
| main.rs:492:5:492:9 | ...::g | main.rs:177:5:192:5 | fn g |
247-
| main.rs:493:5:493:6 | m9 | main.rs:195:1:203:1 | mod m9 |
248-
| main.rs:493:5:493:9 | ...::f | main.rs:198:5:202:5 | fn f |
249-
| main.rs:494:5:494:7 | m11 | main.rs:226:1:263:1 | mod m11 |
250-
| main.rs:494:5:494:10 | ...::f | main.rs:231:5:234:5 | fn f |
251-
| main.rs:495:5:495:7 | m15 | main.rs:294:1:348:1 | mod m15 |
252-
| main.rs:495:5:495:10 | ...::f | main.rs:335:5:347:5 | fn f |
253-
| main.rs:496:5:496:7 | m16 | main.rs:350:1:442:1 | mod m16 |
254-
| main.rs:496:5:496:10 | ...::f | main.rs:417:5:441:5 | fn f |
255-
| main.rs:497:5:497:7 | m17 | main.rs:444:1:474:1 | mod m17 |
256-
| main.rs:497:5:497:10 | ...::f | main.rs:468:5:473:5 | fn f |
257-
| main.rs:498:5:498:11 | nested6 | my2/nested2.rs:14:5:18:5 | mod nested6 |
258-
| main.rs:498:5:498:14 | ...::f | my2/nested2.rs:15:9:17:9 | fn f |
259-
| main.rs:499:5:499:11 | nested8 | my2/nested2.rs:22:5:26:5 | mod nested8 |
260-
| main.rs:499:5:499:14 | ...::f | my2/nested2.rs:23:9:25:9 | fn f |
261-
| main.rs:500:5:500:7 | my3 | my2/mod.rs:12:1:12:12 | mod my3 |
262-
| main.rs:500:5:500:10 | ...::f | my2/my3/mod.rs:1:1:5:1 | fn f |
218+
| main.rs:489:17:489:21 | super | main.rs:481:5:493:5 | mod m19 |
219+
| main.rs:489:17:489:24 | ...::f | main.rs:482:9:484:9 | fn f |
220+
| main.rs:490:17:490:21 | super | main.rs:481:5:493:5 | mod m19 |
221+
| main.rs:490:17:490:28 | ...::super | main.rs:476:1:494:1 | mod m18 |
222+
| main.rs:490:17:490:31 | ...::f | main.rs:477:5:479:5 | fn f |
223+
| main.rs:497:5:497:6 | my | main.rs:1:1:1:7 | mod my |
224+
| main.rs:497:5:497:14 | ...::nested | my.rs:1:1:1:15 | mod nested |
225+
| main.rs:497:5:497:23 | ...::nested1 | my/nested.rs:1:1:17:1 | mod nested1 |
226+
| main.rs:497:5:497:32 | ...::nested2 | my/nested.rs:2:5:11:5 | mod nested2 |
227+
| main.rs:497:5:497:35 | ...::f | my/nested.rs:3:9:5:9 | fn f |
228+
| main.rs:498:5:498:6 | my | main.rs:1:1:1:7 | mod my |
229+
| main.rs:498:5:498:9 | ...::f | my.rs:5:1:7:1 | fn f |
230+
| main.rs:499:5:499:11 | nested2 | my2/mod.rs:1:1:1:16 | mod nested2 |
231+
| main.rs:499:5:499:20 | ...::nested3 | my2/nested2.rs:1:1:11:1 | mod nested3 |
232+
| main.rs:499:5:499:29 | ...::nested4 | my2/nested2.rs:2:5:10:5 | mod nested4 |
233+
| main.rs:499:5:499:32 | ...::f | my2/nested2.rs:3:9:5:9 | fn f |
234+
| main.rs:500:5:500:5 | f | my2/nested2.rs:3:9:5:9 | fn f |
235+
| main.rs:501:5:501:5 | g | my2/nested2.rs:7:9:9:9 | fn g |
236+
| main.rs:502:5:502:9 | crate | main.rs:0:0:0:0 | Crate([email protected]) |
237+
| main.rs:502:5:502:12 | ...::h | main.rs:50:1:69:1 | fn h |
238+
| main.rs:503:5:503:6 | m1 | main.rs:13:1:37:1 | mod m1 |
239+
| main.rs:503:5:503:10 | ...::m2 | main.rs:18:5:36:5 | mod m2 |
240+
| main.rs:503:5:503:13 | ...::g | main.rs:23:9:27:9 | fn g |
241+
| main.rs:504:5:504:6 | m1 | main.rs:13:1:37:1 | mod m1 |
242+
| main.rs:504:5:504:10 | ...::m2 | main.rs:18:5:36:5 | mod m2 |
243+
| main.rs:504:5:504:14 | ...::m3 | main.rs:29:9:35:9 | mod m3 |
244+
| main.rs:504:5:504:17 | ...::h | main.rs:30:27:34:13 | fn h |
245+
| main.rs:505:5:505:6 | m4 | main.rs:39:1:46:1 | mod m4 |
246+
| main.rs:505:5:505:9 | ...::i | main.rs:42:5:45:5 | fn i |
247+
| main.rs:506:5:506:5 | h | main.rs:50:1:69:1 | fn h |
248+
| main.rs:507:5:507:11 | f_alias | my2/nested2.rs:3:9:5:9 | fn f |
249+
| main.rs:508:5:508:11 | g_alias | my2/nested2.rs:7:9:9:9 | fn g |
250+
| main.rs:509:5:509:5 | j | main.rs:97:1:101:1 | fn j |
251+
| main.rs:510:5:510:6 | m6 | main.rs:109:1:120:1 | mod m6 |
252+
| main.rs:510:5:510:9 | ...::g | main.rs:114:5:119:5 | fn g |
253+
| main.rs:511:5:511:6 | m7 | main.rs:122:1:137:1 | mod m7 |
254+
| main.rs:511:5:511:9 | ...::f | main.rs:129:5:136:5 | fn f |
255+
| main.rs:512:5:512:6 | m8 | main.rs:139:1:193:1 | mod m8 |
256+
| main.rs:512:5:512:9 | ...::g | main.rs:177:5:192:5 | fn g |
257+
| main.rs:513:5:513:6 | m9 | main.rs:195:1:203:1 | mod m9 |
258+
| main.rs:513:5:513:9 | ...::f | main.rs:198:5:202:5 | fn f |
259+
| main.rs:514:5:514:7 | m11 | main.rs:226:1:263:1 | mod m11 |
260+
| main.rs:514:5:514:10 | ...::f | main.rs:231:5:234:5 | fn f |
261+
| main.rs:515:5:515:7 | m15 | main.rs:294:1:348:1 | mod m15 |
262+
| main.rs:515:5:515:10 | ...::f | main.rs:335:5:347:5 | fn f |
263+
| main.rs:516:5:516:7 | m16 | main.rs:350:1:442:1 | mod m16 |
264+
| main.rs:516:5:516:10 | ...::f | main.rs:417:5:441:5 | fn f |
265+
| main.rs:517:5:517:7 | m17 | main.rs:444:1:474:1 | mod m17 |
266+
| main.rs:517:5:517:10 | ...::f | main.rs:468:5:473:5 | fn f |
267+
| main.rs:518:5:518:11 | nested6 | my2/nested2.rs:14:5:18:5 | mod nested6 |
268+
| main.rs:518:5:518:14 | ...::f | my2/nested2.rs:15:9:17:9 | fn f |
269+
| main.rs:519:5:519:11 | nested8 | my2/nested2.rs:22:5:26:5 | mod nested8 |
270+
| main.rs:519:5:519:14 | ...::f | my2/nested2.rs:23:9:25:9 | fn f |
271+
| main.rs:520:5:520:7 | my3 | my2/mod.rs:12:1:12:12 | mod my3 |
272+
| main.rs:520:5:520:10 | ...::f | my2/my3/mod.rs:1:1:5:1 | fn f |
273+
| main.rs:521:5:521:12 | nested_f | my/my4/my5/mod.rs:1:1:3:1 | fn f |
274+
| main.rs:522:5:522:7 | m18 | main.rs:476:1:494:1 | mod m18 |
275+
| main.rs:522:5:522:12 | ...::m19 | main.rs:481:5:493:5 | mod m19 |
276+
| main.rs:522:5:522:17 | ...::m20 | main.rs:486:9:492:9 | mod m20 |
277+
| main.rs:522:5:522:20 | ...::g | main.rs:487:13:491:13 | fn g |
263278
| my2/mod.rs:5:5:5:11 | nested2 | my2/mod.rs:1:1:1:16 | mod nested2 |
264279
| my2/mod.rs:5:5:5:20 | ...::nested3 | my2/nested2.rs:1:1:11:1 | mod nested3 |
265280
| my2/mod.rs:5:5:5:29 | ...::nested4 | my2/nested2.rs:2:5:10:5 | mod nested4 |
@@ -273,13 +288,16 @@ resolvePath
273288
| my2/my3/mod.rs:3:5:3:5 | g | my2/mod.rs:3:1:6:1 | fn g |
274289
| my2/my3/mod.rs:4:5:4:5 | h | main.rs:50:1:69:1 | fn h |
275290
| my2/my3/mod.rs:7:5:7:9 | super | my2/mod.rs:1:1:12:13 | SourceFile |
276-
| my2/my3/mod.rs:7:5:7:16 | ...::super | main.rs:1:1:501:2 | SourceFile |
291+
| my2/my3/mod.rs:7:5:7:16 | ...::super | main.rs:1:1:523:2 | SourceFile |
277292
| my2/my3/mod.rs:7:5:7:19 | ...::h | main.rs:50:1:69:1 | fn h |
278293
| my2/my3/mod.rs:8:5:8:9 | super | my2/mod.rs:1:1:12:13 | SourceFile |
279294
| my2/my3/mod.rs:8:5:8:12 | ...::g | my2/mod.rs:3:1:6:1 | fn g |
280295
| my.rs:3:5:3:10 | nested | my.rs:1:1:1:15 | mod nested |
281296
| my.rs:3:5:3:13 | ...::g | my/nested.rs:19:1:22:1 | fn g |
282297
| my.rs:11:5:11:5 | g | my/nested.rs:19:1:22:1 | fn g |
298+
| my.rs:18:9:18:11 | my4 | my.rs:14:1:16:1 | mod my4 |
299+
| my.rs:18:9:18:16 | ...::my5 | my.rs:15:5:15:16 | mod my5 |
300+
| my.rs:18:9:18:19 | ...::f | my/my4/my5/mod.rs:1:1:3:1 | fn f |
283301
| my/nested.rs:9:13:9:13 | f | my/nested.rs:3:9:5:9 | fn f |
284302
| my/nested.rs:15:9:15:15 | nested2 | my/nested.rs:2:5:11:5 | mod nested2 |
285303
| my/nested.rs:15:9:15:18 | ...::f | my/nested.rs:3:9:5:9 | fn f |

0 commit comments

Comments
 (0)