Skip to content

Commit b2fc7e7

Browse files
committed
Rust: Handle super in use statements
1 parent 57dfbf4 commit b2fc7e7

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
@@ -109,7 +109,11 @@ abstract class ItemNode extends Locatable {
109109

110110
/** Gets the immediately enclosing module (or source file) of this item. */
111111
pragma[nomagic]
112-
ModuleLikeNode getImmediateParentModule() { this = result.getAnItemInScope() }
112+
ModuleLikeNode getImmediateParentModule() {
113+
this = result.getAnItemInScope()
114+
or
115+
result = this.(SourceFileItemNode).getSuper()
116+
}
113117

114118
pragma[nomagic]
115119
private ItemNode getASuccessorRec(string name) {
@@ -172,7 +176,7 @@ abstract class ItemNode extends Locatable {
172176
result = this.getASuccessorRec(name)
173177
or
174178
name = "super" and
175-
if this instanceof Module
179+
if this instanceof Module or this instanceof SourceFile
176180
then result = this.getImmediateParentModule()
177181
else result = this.getImmediateParentModule().getImmediateParentModule()
178182
or
@@ -206,6 +210,14 @@ abstract private class ModuleLikeNode extends ItemNode {
206210
}
207211

208212
private class SourceFileItemNode extends ModuleLikeNode, SourceFile {
213+
pragma[nomagic]
214+
ModuleLikeNode getSuper() {
215+
exists(ModuleItemNode mod |
216+
fileImport(mod, this) and
217+
result = mod.getASuccessor("super")
218+
)
219+
}
220+
209221
override string getName() { result = "(source file)" }
210222

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