Skip to content

Commit dc4a355

Browse files
committed
Rust: Handle super in use statements
1 parent d621a84 commit dc4a355

3 files changed

Lines changed: 25 additions & 5 deletions

File tree

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

Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -186,7 +186,12 @@ abstract class ItemNode extends Locatable {
186186
name = "super" and
187187
if this instanceof Module
188188
then result = this.getImmediateParentModule()
189-
else result = this.getImmediateParentModule().getImmediateParentModule()
189+
else
190+
result =
191+
[
192+
this.getImmediateParentModule().getImmediateParentModule(),
193+
this.(SourceFileItemNode).getSuper()
194+
]
190195
or
191196
name = "self" and
192197
if this instanceof Module then result = this else result = this.getImmediateParentModule()
@@ -221,6 +226,14 @@ abstract private class ModuleLikeNode extends ItemNode {
221226
}
222227

223228
private class SourceFileItemNode extends ModuleLikeNode, SourceFile {
229+
pragma[nomagic]
230+
ModuleLikeNode getSuper() {
231+
exists(ModuleItemNode mod |
232+
fileImport(mod, this) and
233+
result = mod.getASuccessor("super")
234+
)
235+
}
236+
224237
override string getName() { result = "(source file)" }
225238

226239
override Namespace getNamespace() {
Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
11
pub fn f() {
22
println!("my2/my3/mod.rs::f");
3-
g(); // $ MISSING: item=I9
4-
h(); // $ MISSING: item=I25
3+
g(); // $ item=I9
4+
h(); // $ item=I25
55
} // I200
66

7-
use super::super::h; // $ MISSING: item=I25
8-
use super::g; // $ MISSING: item=I9
7+
use super::super::h; // $ item=I25
8+
use super::g; // $ item=I9

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

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -270,6 +270,13 @@ resolvePath
270270
| my2/mod.rs:10:9:10:24 | ...::nested7 | my2/nested2.rs:21:1:27:1 | mod nested7 |
271271
| my2/mod.rs:10:9:10:33 | ...::nested8 | my2/nested2.rs:22:5:26:5 | mod nested8 |
272272
| my2/mod.rs:10:37:10:40 | self | my2/nested2.rs:22:5:26:5 | mod nested8 |
273+
| my2/my3/mod.rs:3:5:3:5 | g | my2/mod.rs:3:1:6:1 | fn g |
274+
| my2/my3/mod.rs:4:5:4:5 | h | main.rs:50:1:69:1 | fn h |
275+
| 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 |
277+
| my2/my3/mod.rs:7:5:7:19 | ...::h | main.rs:50:1:69:1 | fn h |
278+
| my2/my3/mod.rs:8:5:8:9 | super | my2/mod.rs:1:1:12:13 | SourceFile |
279+
| my2/my3/mod.rs:8:5:8:12 | ...::g | my2/mod.rs:3:1:6:1 | fn g |
273280
| my.rs:3:5:3:10 | nested | my.rs:1:1:1:15 | mod nested |
274281
| my.rs:3:5:3:13 | ...::g | my/nested.rs:19:1:22:1 | fn g |
275282
| my.rs:11:5:11:5 | g | my/nested.rs:19:1:22:1 | fn g |

0 commit comments

Comments
 (0)