Skip to content

Commit 3542955

Browse files
committed
Rust: Handle super in use statements
1 parent a4d43c7 commit 3542955

File tree

3 files changed

+25
-6
lines changed

3 files changed

+25
-6
lines changed

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

Lines changed: 14 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -121,7 +121,11 @@ abstract class ItemNode extends Locatable {
121121

122122
/** Gets the immediately enclosing module (or source file) of this item. */
123123
pragma[nomagic]
124-
ModuleLikeNode getImmediateParentModule() { this = result.getAnItemInScope() }
124+
ModuleLikeNode getImmediateParentModule() {
125+
this = result.getAnItemInScope()
126+
or
127+
result = this.(SourceFileItemNode).getSuper()
128+
}
125129

126130
pragma[nomagic]
127131
private ItemNode getASuccessorRec(string name) {
@@ -184,7 +188,7 @@ abstract class ItemNode extends Locatable {
184188
result = this.getASuccessorRec(name)
185189
or
186190
name = "super" and
187-
if this instanceof Module
191+
if this instanceof Module or this instanceof SourceFile
188192
then result = this.getImmediateParentModule()
189193
else result = this.getImmediateParentModule().getImmediateParentModule()
190194
or
@@ -221,6 +225,14 @@ abstract private class ModuleLikeNode extends ItemNode {
221225
}
222226

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

226238
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)