Rust: Handle super in use statements

This commit is contained in:
Tom Hvitved
2025-03-19 13:51:56 +01:00
parent 57dfbf4faa
commit b2fc7e771f
3 changed files with 25 additions and 6 deletions

View File

@@ -109,7 +109,11 @@ abstract class ItemNode extends Locatable {
/** Gets the immediately enclosing module (or source file) of this item. */
pragma[nomagic]
ModuleLikeNode getImmediateParentModule() { this = result.getAnItemInScope() }
ModuleLikeNode getImmediateParentModule() {
this = result.getAnItemInScope()
or
result = this.(SourceFileItemNode).getSuper()
}
pragma[nomagic]
private ItemNode getASuccessorRec(string name) {
@@ -172,7 +176,7 @@ abstract class ItemNode extends Locatable {
result = this.getASuccessorRec(name)
or
name = "super" and
if this instanceof Module
if this instanceof Module or this instanceof SourceFile
then result = this.getImmediateParentModule()
else result = this.getImmediateParentModule().getImmediateParentModule()
or
@@ -206,6 +210,14 @@ abstract private class ModuleLikeNode extends ItemNode {
}
private class SourceFileItemNode extends ModuleLikeNode, SourceFile {
pragma[nomagic]
ModuleLikeNode getSuper() {
exists(ModuleItemNode mod |
fileImport(mod, this) and
result = mod.getASuccessor("super")
)
}
override string getName() { result = "(source file)" }
override Namespace getNamespace() {

View File

@@ -1,8 +1,8 @@
pub fn f() {
println!("my2/my3/mod.rs::f");
g(); // $ MISSING: item=I9
h(); // $ MISSING: item=I25
g(); // $ item=I9
h(); // $ item=I25
} // I200
use super::super::h; // $ MISSING: item=I25
use super::g; // $ MISSING: item=I9
use super::super::h; // $ item=I25
use super::g; // $ item=I9

View File

@@ -270,6 +270,13 @@ resolvePath
| my2/mod.rs:10:9:10:24 | ...::nested7 | my2/nested2.rs:21:1:27:1 | mod nested7 |
| my2/mod.rs:10:9:10:33 | ...::nested8 | my2/nested2.rs:22:5:26:5 | mod nested8 |
| my2/mod.rs:10:37:10:40 | self | my2/nested2.rs:22:5:26:5 | mod nested8 |
| my2/my3/mod.rs:3:5:3:5 | g | my2/mod.rs:3:1:6:1 | fn g |
| my2/my3/mod.rs:4:5:4:5 | h | main.rs:50:1:69:1 | fn h |
| my2/my3/mod.rs:7:5:7:9 | super | my2/mod.rs:1:1:12:13 | SourceFile |
| my2/my3/mod.rs:7:5:7:16 | ...::super | main.rs:1:1:501:2 | SourceFile |
| my2/my3/mod.rs:7:5:7:19 | ...::h | main.rs:50:1:69:1 | fn h |
| my2/my3/mod.rs:8:5:8:9 | super | my2/mod.rs:1:1:12:13 | SourceFile |
| my2/my3/mod.rs:8:5:8:12 | ...::g | my2/mod.rs:3:1:6:1 | fn g |
| my.rs:3:5:3:10 | nested | my.rs:1:1:1:15 | mod nested |
| my.rs:3:5:3:13 | ...::g | my/nested.rs:19:1:22:1 | fn g |
| my.rs:11:5:11:5 | g | my/nested.rs:19:1:22:1 | fn g |