Skip to content

Commit 9b58da7

Browse files
authored
Merge pull request #19057 from hvitved/rust/dependency-renaming
Rust: Take dependency renaming into account when extracting the crate graph
2 parents d362c03 + cbb9987 commit 9b58da7

23 files changed

+447
-122
lines changed

rust/extractor/src/crate_graph.rs

Lines changed: 14 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -88,6 +88,17 @@ pub fn extract_crate_graph(trap_provider: &trap::TrapFileProvider, db: &RootData
8888
let file_label = trap.emit_file(root_module_file);
8989
trap.emit_file_only_location(file_label, root_module);
9090

91+
let crate_dependencies: Vec<generated::NamedCrate> = krate
92+
.dependencies
93+
.iter()
94+
.flat_map(|x| crate_id_map.get(&x.crate_id).map(|y| (&x.name, y)))
95+
.map(|(name, (module, hash))| generated::NamedCrate {
96+
id: trap::TrapId::Star,
97+
name: name.to_string(),
98+
crate_: trap.label(format!("{}:{hash}", module.display()).into()),
99+
})
100+
.collect();
101+
91102
let element = generated::Crate {
92103
id: trap::TrapId::Key(format!("{}:{hash}", root_module_file.display())),
93104
name: krate
@@ -102,11 +113,9 @@ pub fn extract_crate_graph(trap_provider: &trap::TrapFileProvider, db: &RootData
102113
.into_iter()
103114
.map(|x| format!("{x}"))
104115
.collect(),
105-
dependencies: krate
106-
.dependencies
107-
.iter()
108-
.flat_map(|x| crate_id_map.get(&x.crate_id))
109-
.map(|(module, hash)| trap.label(format!("{}:{hash}", module.display()).into()))
116+
named_dependencies: crate_dependencies
117+
.into_iter()
118+
.map(|dep| trap.emit(dep))
110119
.collect(),
111120
};
112121
trap.emit(element);

rust/extractor/src/generated/.generated.list

Lines changed: 1 addition & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

rust/extractor/src/generated/top.rs

Lines changed: 33 additions & 3 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

rust/ql/.generated.list

Lines changed: 10 additions & 6 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

rust/ql/.gitattributes

Lines changed: 4 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

rust/ql/lib/codeql/rust/elements/Crate.qll

Lines changed: 1 addition & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

rust/ql/lib/codeql/rust/elements/internal/CrateImpl.qll

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ private import codeql.rust.elements.internal.generated.Crate
1212
*/
1313
module Impl {
1414
private import rust
15+
private import codeql.rust.elements.internal.NamedCrate
1516

1617
class Crate extends Generated::Crate {
1718
override string toStringImpl() {
@@ -30,6 +31,33 @@ module Impl {
3031
i = 4 and result = ")"
3132
}
3233

34+
/**
35+
* Gets the dependency named `name`, if any.
36+
*
37+
* `name` may be different from the name of the crate, when the dependency has been
38+
* renamed in the `Cargo.toml` file, for example in
39+
*
40+
* ```yml
41+
* [dependencies]
42+
* my_serde = {package = "serde", version = "1.0.217"}
43+
* ```
44+
*
45+
* the name of the dependency is `my_serde`, but the name of the crate is `serde`.
46+
*/
47+
pragma[nomagic]
48+
Crate getDependency(string name) {
49+
exists(NamedCrate c |
50+
c = this.getANamedDependency() and
51+
result = c.getCrate() and
52+
name = c.getName()
53+
)
54+
}
55+
56+
/**
57+
* Gets any dependency of this crate.
58+
*/
59+
Crate getADependency() { result = this.getDependency(_) }
60+
3361
override Location getLocation() { result = this.getModule().getLocation() }
3462
}
3563
}

rust/ql/lib/codeql/rust/elements/internal/NamedCrate.qll

Lines changed: 13 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

rust/ql/lib/codeql/rust/elements/internal/NamedCrateConstructor.qll

Lines changed: 14 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

rust/ql/lib/codeql/rust/elements/internal/NamedCrateImpl.qll

Lines changed: 16 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

0 commit comments

Comments
 (0)