Rust: Take depdency renaming into account when extracting the crate graph

This commit is contained in:
Tom Hvitved
2025-03-18 21:32:49 +01:00
parent 2750d1d889
commit 0bf2bfa2f1
23 changed files with 474 additions and 136 deletions

View File

@@ -88,6 +88,17 @@ pub fn extract_crate_graph(trap_provider: &trap::TrapFileProvider, db: &RootData
let file_label = trap.emit_file(root_module_file);
trap.emit_file_only_location(file_label, root_module);
let crate_dependencies: Vec<generated::NamedCrate> = krate
.dependencies
.iter()
.flat_map(|x| crate_id_map.get(&x.crate_id).map(|y| (&x.name, y)))
.map(|(name, (module, hash))| generated::NamedCrate {
id: trap::TrapId::Star,
name: name.to_string().into(),
crate_: trap.label(format!("{}:{hash}", module.display()).into()),
})
.collect();
let element = generated::Crate {
id: trap::TrapId::Key(format!("{}:{hash}", root_module_file.display())),
name: krate
@@ -102,11 +113,9 @@ pub fn extract_crate_graph(trap_provider: &trap::TrapFileProvider, db: &RootData
.into_iter()
.map(|x| format!("{x}"))
.collect(),
dependencies: krate
.dependencies
.iter()
.flat_map(|x| crate_id_map.get(&x.crate_id))
.map(|(module, hash)| trap.label(format!("{}:{hash}", module.display()).into()))
named_dependencies: crate_dependencies
.into_iter()
.map(|dep| trap.emit(dep))
.collect(),
};
trap.emit(element);

View File

@@ -1,2 +1,2 @@
mod.rs 4bcb9def847469aae9d8649461546b7c21ec97cf6e63d3cf394e339915ce65d7 4bcb9def847469aae9d8649461546b7c21ec97cf6e63d3cf394e339915ce65d7
top.rs 413fd08f7bc22169688be065bd89fa80f924fcbf88ce41e6a9db6872b2a6a84e 413fd08f7bc22169688be065bd89fa80f924fcbf88ce41e6a9db6872b2a6a84e
top.rs 3db0fd908579f949394294727474f5ba2e3d483f87d5b5737b7e81f36a457c7d 3db0fd908579f949394294727474f5ba2e3d483f87d5b5737b7e81f36a457c7d

View File

@@ -74,6 +74,39 @@ impl From<trap::Label<Locatable>> for trap::Label<Element> {
}
}
#[derive(Debug)]
pub struct NamedCrate {
pub id: trap::TrapId<NamedCrate>,
pub name: Option<String>,
pub crate_: trap::Label<Crate>,
}
impl trap::TrapEntry for NamedCrate {
fn extract_id(&mut self) -> trap::TrapId<Self> {
std::mem::replace(&mut self.id, trap::TrapId::Star)
}
fn emit(self, id: trap::Label<Self>, out: &mut trap::Writer) {
out.add_tuple("named_crates", vec![id.into(), self.crate_.into()]);
if let Some(v) = self.name {
out.add_tuple("named_crate_names", vec![id.into(), v.into()]);
}
}
}
impl trap::TrapClass for NamedCrate {
fn class_name() -> &'static str { "NamedCrate" }
}
impl From<trap::Label<NamedCrate>> for trap::Label<Element> {
fn from(value: trap::Label<NamedCrate>) -> Self {
// SAFETY: this is safe because in the dbscheme NamedCrate is a subclass of Element
unsafe {
Self::from_untyped(value.as_untyped())
}
}
}
#[derive(Debug)]
pub struct Unextracted {
_unused: ()
@@ -126,7 +159,7 @@ pub struct Crate {
pub version: Option<String>,
pub module: Option<trap::Label<Module>>,
pub cfg_options: Vec<String>,
pub dependencies: Vec<trap::Label<Crate>>,
pub named_dependencies: Vec<trap::Label<NamedCrate>>,
}
impl trap::TrapEntry for Crate {
@@ -148,8 +181,8 @@ impl trap::TrapEntry for Crate {
for (i, v) in self.cfg_options.into_iter().enumerate() {
out.add_tuple("crate_cfg_options", vec![id.into(), i.into(), v.into()]);
}
for (i, v) in self.dependencies.into_iter().enumerate() {
out.add_tuple("crate_dependencies", vec![id.into(), i.into(), v.into()]);
for (i, v) in self.named_dependencies.into_iter().enumerate() {
out.add_tuple("crate_named_dependencies", vec![id.into(), i.into(), v.into()]);
}
}
}

View File

@@ -43,7 +43,7 @@ lib/codeql/rust/elements/ConstArg.qll f37b34417503bbd2f3ce09b3211d8fa71f6a954970
lib/codeql/rust/elements/ConstBlockPat.qll a25f42b84dbeb33e10955735ef53b8bb7e3258522d6d1a9068f19adaf1af89d9 eeb816d2b54db77a1e7bb70e90b68d040a0cd44e9d44455a223311c3615c5e6e
lib/codeql/rust/elements/ConstParam.qll 248db1e3abef6943326c42478a15f148f8cdaa25649ef5578064b15924c53351 28babba3aea28a65c3fe3b3db6cb9c86f70d7391e9d6ef9188eb2e4513072f9f
lib/codeql/rust/elements/ContinueExpr.qll 9f27c5d5c819ad0ebc5bd10967ba8d33a9dc95b9aae278fcfb1fcf9216bda79c 0dc061445a6b89854fdce92aaf022fdc76b724511a50bb777496ce75c9ecb262
lib/codeql/rust/elements/Crate.qll 5e3fb55fee69b98253f7293306384011fd4a6121e10a59c1c945b34c28db5973 69459c56308f8b0fcf92cfba09a3bd238af6cf51f5c06208316a956833098e5f
lib/codeql/rust/elements/Crate.qll 37e8d0daa7bef38cee51008499ee3fd6c19800c48f23983a82b7b36bae250813 95eb88b896fe01d57627c1766daf0fe859f086aed6ca1184e1e16b10c9cdaf37
lib/codeql/rust/elements/DynTraitTypeRepr.qll 5953263ec1e77613170c13b5259b22a71c206a7e08841d2fa1a0b373b4014483 d4380c6cc460687dcd8598df27cad954ef4f508f1117a82460d15d295a7b64ab
lib/codeql/rust/elements/Element.qll 0b62d139fef54ed2cf2e2334806aa9bfbc036c9c2085d558f15a42cc3fa84c48 24b999b93df79383ef27ede46e38da752868c88a07fe35fcff5d526684ba7294
lib/codeql/rust/elements/Enum.qll 2f122b042519d55e221fceac72fce24b30d4caf1947b25e9b68ee4a2095deb11 83a47445145e4fda8c3631db602a42dbb7a431f259eddf5c09dccd86f6abdd0e
@@ -338,6 +338,9 @@ lib/codeql/rust/elements/internal/MissingImpl.qll e81caa383797dfe837cf101fb78d23
lib/codeql/rust/elements/internal/ModuleConstructor.qll 31cc83c9d8f25ac07375d19e568f05c068e1f5aa205ff3d9ac31c2510e6f8468 8a70f3f1c18ff87f17e6baf2f05ccaed55c70469288192fc39ef0bb5531b8c0e
lib/codeql/rust/elements/internal/NameConstructor.qll a760134c6d4fc785746e1a5dc042a6bf25b8adaa3947a6897c31e50fd91dd5fd 1359f903d57112bcc1f62a609febb288301bfa810e569aa12e1045fd48b5b5c9
lib/codeql/rust/elements/internal/NameRefConstructor.qll 5ff6eacc614fd41f98b54cbb4960a07a1471cf4ea291758d33e54a48fd5d1bc4 c538d65414a24dfdbeb49cfd997588227559ba038f0b55d14bb5d89ed1a016f2
lib/codeql/rust/elements/internal/NamedCrate.qll 6c697076387b5af00422e227540d100ff7c03d3001f6a4c5b61433191d022490 2276f85411db199598fc6a5d8d6ec5762e42b1b45c98e398eeb75e69c697b57f
lib/codeql/rust/elements/internal/NamedCrateConstructor.qll 72e07ece16f787dfd993982848689dc2e11845aa5634e9ee5ad8865b95cb59dc ea6555ae33cabe408935649b5e8c6218158036a3b7c4e1abc8bd7cd51c05a912
lib/codeql/rust/elements/internal/NamedCrateImpl.qll ba1f775ca6177a5bdb2ef1891a3fd505642e2fec63910f958f380039499f45bf f66b503b3574d3be75b79870b754015740f58195c4924b71c21ba4e673efd8c4
lib/codeql/rust/elements/internal/NeverTypeReprConstructor.qll 2e0a9c75e389e9ef41a18dd9b5d6c29ffe1d1d633e51ef1de90ec553236d201a 61ea87802fd1c3a68e864ccd76657253a228b06471e4c55bcf94ca2be554f866
lib/codeql/rust/elements/internal/OffsetOfExprConstructor.qll 616e146562adb3ac0fba4d6f55dd6ce60518ed377c0856f1f09ba49593e7bfab 80518ce90fc6d08011d6f5fc2a543958067739e1b0a6a5f2ed90fc9b1db078f0
lib/codeql/rust/elements/internal/OffsetOfExprImpl.qll e52d4596068cc54719438121f7d5afcaab04e0c70168ac5e4df1a3a0969817a6 6ab37e659d79e02fb2685d6802ae124157bf14b6f790b31688f437c87f40f52c
@@ -502,7 +505,7 @@ lib/codeql/rust/elements/internal/generated/ConstArg.qll e2451cac6ee464f5b64883d
lib/codeql/rust/elements/internal/generated/ConstBlockPat.qll 7526d83ee9565d74776f42db58b1a2efff6fb324cfc7137f51f2206fee815d79 0ab3c22908ff790e7092e576a5df3837db33c32a7922a513a0f5e495729c1ac5
lib/codeql/rust/elements/internal/generated/ConstParam.qll 310342603959a4d521418caec45b585b97e3a5bf79368769c7150f52596a7266 a5dd92f0b24d7dbdaea2daedba3c8d5f700ec7d3ace81ca368600da2ad610082
lib/codeql/rust/elements/internal/generated/ContinueExpr.qll e2010feb14fb6edeb83a991d9357e50edb770172ddfde2e8670b0d3e68169f28 48d09d661e1443002f6d22b8710e22c9c36d9daa9cde09c6366a61e960d717cb
lib/codeql/rust/elements/internal/generated/Crate.qll 2d7124b095738cb13dca8e1c402986ae575062f19104c331a6928dd86f8f01e6 8cd20d12e3a5f9202a12c81479fb9d2741109eb0b74c1541c6aa4258501b0478
lib/codeql/rust/elements/internal/generated/Crate.qll d245f24e9da4f180c526a6d092f554a9577bae7225c81c36a391947c0865eeb3 c95dbb32b2ce4d9664be56c95b19fcd01c2d3244385e55151f9b06b07f04ce9b
lib/codeql/rust/elements/internal/generated/DynTraitTypeRepr.qll a9d540717af1f00dbea1c683fd6b846cddfb2968c7f3e021863276f123337787 1972efb9bca7aae9a9708ca6dcf398e5e8c6d2416a07d525dba1649b80fbe4d1
lib/codeql/rust/elements/internal/generated/Element.qll 69ce882811f2bef7e0a93c0a24494dd16120a108ba4180d455344e29144a98c4 7781bc5c69b5b08775902fcb97cb23f85359ef2303545afe9d44301b19024b3a
lib/codeql/rust/elements/internal/generated/Enum.qll 4f4cbc9cd758c20d476bc767b916c62ba434d1750067d0ffb63e0821bb95ec86 3da735d54022add50cec0217bbf8ec4cf29b47f4851ee327628bcdd6454989d0
@@ -567,6 +570,7 @@ lib/codeql/rust/elements/internal/generated/Missing.qll 16735d91df04a4e1ae52fae2
lib/codeql/rust/elements/internal/generated/Module.qll ebae5d8963c9fd569c0fbad1d7770abd3fd2479437f236cbce0505ba9f9af52c fa3c382115fed18a26f1a755d8749a201b9489f82c09448a88fb8e9e1435fe5f
lib/codeql/rust/elements/internal/generated/Name.qll 12aad57744b7d1b04454159536409244c47319aedd580acb58ee93ef9d7f837d 63fc67ccc085db22f82576a53489f15216a7c29d5b941b14a965eab481534e2e
lib/codeql/rust/elements/internal/generated/NameRef.qll beaeffed918b821bd797b0752453f6f35adcaa046b01e39f95a35dca93a5c257 5aee4e4e700f97af2035406c641f375bf0dcac6f3002ae9d4ffabe0da2ddd176
lib/codeql/rust/elements/internal/generated/NamedCrate.qll dfcc0533d355805e86d348335729f0a66070a023dbc6e9bb28eb38c778dd31f4 667f96a779a703cc541fca2a36efe6e88b05ffcf54474533dda7c85615a205c9
lib/codeql/rust/elements/internal/generated/NeverTypeRepr.qll c601b228a6359f809425ad43b46c1c444c9826652b07f8facc6f9729df268285 23b53bb1d826a8b54b68bd4f138ebaabeeb2f56392c882b32417eff388aa80cc
lib/codeql/rust/elements/internal/generated/OffsetOfExpr.qll c86eecd11345a807571542e220ced8ccc8bb78f81de61fff6fc6b23ff379cd12 76a692d3ad5e26751e574c7d9b13cf698d471e1783f53a312e808c0b21a110ab
lib/codeql/rust/elements/internal/generated/OrPat.qll 0dc6bd6ada8d11b7f708f71c8208fc2c28629e9c265c3df3c2dc9bea30de5afa 892119fc1de2e3315489203c56ee3ed3df8b9806e927ee58aa6083e5b2156dab
@@ -576,7 +580,7 @@ lib/codeql/rust/elements/internal/generated/ParamList.qll c808c9d84dd7800573832b
lib/codeql/rust/elements/internal/generated/ParenExpr.qll bc0731505bfe88516205ec360582a4222d2681d11342c93e15258590ddee82f2 d4bd6e0c80cf1d63746c88d4bcb3a01d4c75732e5da09e3ebd9437ced227fb60
lib/codeql/rust/elements/internal/generated/ParenPat.qll 4f168ef5d5bb87a903251cc31b2e44a759b099ec69c90af31783fbb15778c940 0e34f94a45a13396fd57d94c245dc64d1adde2ab0e22b56946f7e94c04e297fc
lib/codeql/rust/elements/internal/generated/ParenTypeRepr.qll 40ab5c592e7699c621787793743e33988de71ff42ca27599f5ab3ddb70e3f7d8 12c0a6eed2202ee3e892f61da3b3ce77ac3190854cdf3097e8d2be98aa3cb91d
lib/codeql/rust/elements/internal/generated/ParentChild.qll 17bad59de9a8b6d3845ad00ac55c5bcddac8d187f17764d9b164451d2221af3f 6fbd842f262bbcb105045aa90da7549ce51e0fb5599fc1e9ffae907108ba1f4a
lib/codeql/rust/elements/internal/generated/ParentChild.qll f3def94b776cb89394dfeac1fe5c4d7112821968874eaaf086b9179301edf6e7 c93fcd7714c9c6b63481820bb947ed1a07dbb9859ad32e61dea4007173a58145
lib/codeql/rust/elements/internal/generated/ParenthesizedArgList.qll c5fa328ea60d3a3333d7c7bb3480969c1873166c7ac8ebb9d0afad7a8099d1a8 2dbbb6200d96f7db7dea4a55bdeab8d67b14d39a43e0bd54ada019f7e466f163
lib/codeql/rust/elements/internal/generated/Pat.qll 3605ac062be2f294ee73336e9669027b8b655f4ad55660e1eab35266275154ee 7f9400db2884d336dd1d21df2a8093759c2a110be9bf6482ce8e80ae0fd74ed4
lib/codeql/rust/elements/internal/generated/Path.qll 8e47e91aff3f8c60f1ee8cb3887b8e4936c38e4665d052f2c92a939a969aac29 2c28beb89cabd7c7c91a5bc65c874f414cb96bbefde37b25811b61089a8a0053
@@ -591,7 +595,7 @@ lib/codeql/rust/elements/internal/generated/PtrTypeRepr.qll 51d1e9e683fc79dddbff
lib/codeql/rust/elements/internal/generated/PureSynthConstructors.qll e5b8e69519012bbaae29dcb82d53f7f7ecce368c0358ec27ef6180b228a0057f e5b8e69519012bbaae29dcb82d53f7f7ecce368c0358ec27ef6180b228a0057f
lib/codeql/rust/elements/internal/generated/RangeExpr.qll 23cca03bf43535f33b22a38894f70d669787be4e4f5b8fe5c8f7b964d30e9027 18624cef6c6b679eeace2a98737e472432e0ead354cca02192b4d45330f047c9
lib/codeql/rust/elements/internal/generated/RangePat.qll 80826a6a6868a803aa2372e31c52a03e1811a3f1f2abdb469f91ca0bfdd9ecb6 34ee1e208c1690cba505dff2c588837c0cd91e185e2a87d1fe673191962276a9
lib/codeql/rust/elements/internal/generated/Raw.qll 961cd311a08aa3a3de2761a8f87d422f2d75e9debea466543d5803e24b6b4315 ee699aa5d61fe3331a747de9b84c2edef6b8ee04644b84506544cb88f93902a3
lib/codeql/rust/elements/internal/generated/Raw.qll a543af27c060e6ebad13d38284708510bf7ea083f115d1c875a138ca9aed9b1b cd3aacd4e44fe7583a9aa8bef72306abbe7f3f566ee406f99ac451e08cda0ef8
lib/codeql/rust/elements/internal/generated/RecordExpr.qll 2131b2cb336caa76170082e69776011bf02576bbfdd34ba68ca84af24209250a 39a2e3ec32352b594c43cc1295e0e8b3f9808173322d3d73cb7d48ef969d5565
lib/codeql/rust/elements/internal/generated/RecordExprField.qll 7e9f8663d3b74ebbc9603b10c9912f082febba6bd73d344b100bbd3edf837802 fbe6b578e7fd5d5a6f21bbb8c388957ab7210a6a249ec71510a50fb35b319ea1
lib/codeql/rust/elements/internal/generated/RecordExprFieldList.qll 179a97211fe7aa6265085d4d54115cdbc0e1cd7c9b2135591e8f36d6432f13d3 dd44bbbc1e83a1ed3a587afb729d7debf7aeb7b63245de181726af13090e50c0
@@ -617,8 +621,8 @@ lib/codeql/rust/elements/internal/generated/Static.qll 0b336767104d2b852b9acd234
lib/codeql/rust/elements/internal/generated/Stmt.qll 8473ff532dd5cc9d7decaddcd174b94d610f6ca0aec8e473cc051dad9f3db917 6ef7d2b5237c2dbdcacbf7d8b39109d4dc100229f2b28b5c9e3e4fbf673ba72b
lib/codeql/rust/elements/internal/generated/StmtList.qll a667193e32341e17400867c6e359878c4e645ef9f5f4d97676afc0283a33a026 a320ed678ee359302e2fc1b70a9476705cd616fcfa44a499d32f0c7715627f73
lib/codeql/rust/elements/internal/generated/Struct.qll 4d57f0db12dc7ad3e31e750a24172ef1505406b4dab16386af0674bd18bf8f4b 1a73c83df926b996f629316f74c61ea775be04532ab61b56af904223354f033e
lib/codeql/rust/elements/internal/generated/Synth.qll b1428cbc752be287540c58a3931ebcc033f961e5d6883d6260189310901f1663 3001eb4a1b9a050d7b0abb875fea2e26b29522ecb8d2719ebf6b68f347fee5da
lib/codeql/rust/elements/internal/generated/SynthConstructors.qll f6321ef2a74bb3c869cb3d3fc7753ec90d03bf2c620597f7f1fea636309a3575 f6321ef2a74bb3c869cb3d3fc7753ec90d03bf2c620597f7f1fea636309a3575
lib/codeql/rust/elements/internal/generated/Synth.qll 42286213860a73257d5d4384fbf94e4926e1fac3fc3bfc848b9cd34227c7abb3 7d8c696db355f23140df0cf37135a25e8d7499793ffdbca7e78c9f39c3b3b7ea
lib/codeql/rust/elements/internal/generated/SynthConstructors.qll 432075c5403cfc1b466e6665c08a54ae314239fbeab0b01e3e6b59d8057d1821 432075c5403cfc1b466e6665c08a54ae314239fbeab0b01e3e6b59d8057d1821
lib/codeql/rust/elements/internal/generated/Token.qll 77a91a25ca5669703cf3a4353b591cef4d72caa6b0b9db07bb9e005d69c848d1 2fdffc4882ed3a6ca9ac6d1fb5f1ac5a471ca703e2ffdc642885fa558d6e373b
lib/codeql/rust/elements/internal/generated/TokenTree.qll 8577c2b097c1be2f0f7daa5acfcf146f78674a424d99563e08a84dd3e6d91b46 d2f30764e84dbfc0a6a5d3d8a5f935cd432413688cb32da9c94e420fbc10665c
lib/codeql/rust/elements/internal/generated/Trait.qll 8fa41b50fa0f68333534f2b66bb4ec8e103ff09ac8fa5c2cc64bc04beafec205 ce1c9aa6d0e2f05d28aab8e1165c3b9fb8e24681ade0cf6a9df2e8617abeae7e

4
rust/ql/.gitattributes generated vendored
View File

@@ -340,6 +340,9 @@
/lib/codeql/rust/elements/internal/ModuleConstructor.qll linguist-generated
/lib/codeql/rust/elements/internal/NameConstructor.qll linguist-generated
/lib/codeql/rust/elements/internal/NameRefConstructor.qll linguist-generated
/lib/codeql/rust/elements/internal/NamedCrate.qll linguist-generated
/lib/codeql/rust/elements/internal/NamedCrateConstructor.qll linguist-generated
/lib/codeql/rust/elements/internal/NamedCrateImpl.qll linguist-generated
/lib/codeql/rust/elements/internal/NeverTypeReprConstructor.qll linguist-generated
/lib/codeql/rust/elements/internal/OffsetOfExprConstructor.qll linguist-generated
/lib/codeql/rust/elements/internal/OffsetOfExprImpl.qll linguist-generated
@@ -569,6 +572,7 @@
/lib/codeql/rust/elements/internal/generated/Module.qll linguist-generated
/lib/codeql/rust/elements/internal/generated/Name.qll linguist-generated
/lib/codeql/rust/elements/internal/generated/NameRef.qll linguist-generated
/lib/codeql/rust/elements/internal/generated/NamedCrate.qll linguist-generated
/lib/codeql/rust/elements/internal/generated/NeverTypeRepr.qll linguist-generated
/lib/codeql/rust/elements/internal/generated/OffsetOfExpr.qll linguist-generated
/lib/codeql/rust/elements/internal/generated/OrPat.qll linguist-generated

View File

@@ -6,5 +6,6 @@
private import internal.CrateImpl
import codeql.rust.elements.Locatable
import codeql.rust.elements.Module
import codeql.rust.elements.internal.NamedCrate
final class Crate = Impl::Crate;

View File

@@ -12,6 +12,7 @@ private import codeql.rust.elements.internal.generated.Crate
*/
module Impl {
private import rust
private import codeql.rust.elements.internal.NamedCrate
class Crate extends Generated::Crate {
override string toStringImpl() {
@@ -30,6 +31,33 @@ module Impl {
i = 4 and result = ")"
}
/**
* Gets the dependency named `name`, if any.
*
* `name` may be different from the name of the crate, when the dependency has been
* renamed in the `Cargo.toml` file, for example in
*
* ```yml
* [dependencies]
* my_serde = {package = "serde", version = "1.0.217"}
* ```
*
* the name of the dependency is `my_serde`, but the name of the crate is `serde`.
*/
pragma[nomagic]
Crate getDependency(string name) {
exists(NamedCrate c |
c = this.getANamedDependency() and
result = c.getCrate() and
name = c.getName()
)
}
/**
* Gets any dependency of this crate.
*/
Crate getADependency() { result = this.getDependency(_) }
override Location getLocation() { result = this.getModule().getLocation() }
}
}

View File

@@ -0,0 +1,13 @@
// generated by codegen, do not edit
/**
* This module provides the class `NamedCrate`.
*/
private import NamedCrateImpl
import codeql.rust.elements.Crate
import codeql.rust.elements.Element
/**
* INTERNAL: Do not use.
*/
final class NamedCrate = Impl::NamedCrate;

View File

@@ -0,0 +1,14 @@
// generated by codegen, remove this comment if you wish to edit this file
/**
* This module defines the hook used internally to tweak the characteristic predicate of
* `NamedCrate` synthesized instances.
* INTERNAL: Do not use.
*/
private import codeql.rust.elements.internal.generated.Raw
/**
* The characteristic predicate of `NamedCrate` synthesized instances.
* INTERNAL: Do not use.
*/
predicate constructNamedCrate(Raw::NamedCrate id) { any() }

View File

@@ -0,0 +1,16 @@
// generated by codegen, remove this comment if you wish to edit this file
/**
* This module provides a hand-modifiable wrapper around the generated class `NamedCrate`.
*
* INTERNAL: Do not use.
*/
private import codeql.rust.elements.internal.generated.NamedCrate
/**
* INTERNAL: This module contains the customizable definition of `NamedCrate` and should not
* be referenced directly.
*/
module Impl {
class NamedCrate extends Generated::NamedCrate { }
}

View File

@@ -6,11 +6,9 @@
private import codeql.rust.elements.internal.generated.Synth
private import codeql.rust.elements.internal.generated.Raw
import codeql.rust.elements.Crate
import codeql.rust.elements.internal.LocatableImpl::Impl as LocatableImpl
import codeql.rust.elements.Module
private class CrateAlias = Crate;
import codeql.rust.elements.internal.NamedCrate
/**
* INTERNAL: This module contains the fully generated definition of `Crate` and should not
@@ -74,21 +72,29 @@ module Generated {
final int getNumberOfCfgOptions() { result = count(int i | exists(this.getCfgOption(i))) }
/**
* Gets the `index`th dependency of this crate (0-based).
* Gets the `index`th named dependency of this crate (0-based).
*
* INTERNAL: Do not use.
*/
CrateAlias getDependency(int index) {
NamedCrate getNamedDependency(int index) {
result =
Synth::convertCrateFromRaw(Synth::convertCrateToRaw(this).(Raw::Crate).getDependency(index))
Synth::convertNamedCrateFromRaw(Synth::convertCrateToRaw(this)
.(Raw::Crate)
.getNamedDependency(index))
}
/**
* Gets any of the dependencies of this crate.
* Gets any of the named dependencies of this crate.
* INTERNAL: Do not use.
*/
final CrateAlias getADependency() { result = this.getDependency(_) }
final NamedCrate getANamedDependency() { result = this.getNamedDependency(_) }
/**
* Gets the number of dependencies of this crate.
* Gets the number of named dependencies of this crate.
* INTERNAL: Do not use.
*/
final int getNumberOfDependencies() { result = count(int i | exists(this.getDependency(i))) }
final int getNumberOfNamedDependencies() {
result = count(int i | exists(this.getNamedDependency(i)))
}
}
}

View File

@@ -0,0 +1,42 @@
// generated by codegen, do not edit
/**
* This module provides the generated definition of `NamedCrate`.
* INTERNAL: Do not import directly.
*/
private import codeql.rust.elements.internal.generated.Synth
private import codeql.rust.elements.internal.generated.Raw
import codeql.rust.elements.Crate
import codeql.rust.elements.internal.ElementImpl::Impl as ElementImpl
/**
* INTERNAL: This module contains the fully generated definition of `NamedCrate` and should not
* be referenced directly.
*/
module Generated {
/**
* INTERNAL: Do not reference the `Generated::NamedCrate` class directly.
* Use the subclass `NamedCrate`, where the following predicates are available.
*/
class NamedCrate extends Synth::TNamedCrate, ElementImpl::Element {
override string getAPrimaryQlClass() { result = "NamedCrate" }
/**
* Gets the name of this named crate, if it exists.
*/
string getName() { result = Synth::convertNamedCrateToRaw(this).(Raw::NamedCrate).getName() }
/**
* Holds if `getName()` exists.
*/
final predicate hasName() { exists(this.getName()) }
/**
* Gets the crate of this named crate.
*/
Crate getCrate() {
result =
Synth::convertCrateFromRaw(Synth::convertNamedCrateToRaw(this).(Raw::NamedCrate).getCrate())
}
}
}

View File

@@ -6,6 +6,7 @@
import codeql.rust.elements
import codeql.rust.elements.internal.ArrayExprInternal
import codeql.rust.elements.internal.ExtractorStep
import codeql.rust.elements.internal.NamedCrate
private module Impl {
private Element getImmediateChildOfElement(Element e, int index, string partialPredicateCall) {
@@ -40,6 +41,19 @@ private module Impl {
)
}
private Element getImmediateChildOfNamedCrate(NamedCrate e, int index, string partialPredicateCall) {
exists(int b, int bElement, int n |
b = 0 and
bElement = b + 1 + max(int i | i = -1 or exists(getImmediateChildOfElement(e, i, _)) | i) and
n = bElement and
(
none()
or
result = getImmediateChildOfElement(e, index - b, partialPredicateCall)
)
)
}
private Element getImmediateChildOfUnextracted(
Unextracted e, int index, string partialPredicateCall
) {
@@ -4065,6 +4079,8 @@ private module Impl {
or
result = getImmediateChildOfExtractorStep(e, index, partialAccessor)
or
result = getImmediateChildOfNamedCrate(e, index, partialAccessor)
or
result = getImmediateChildOfCrate(e, index, partialAccessor)
or
result = getImmediateChildOfFormat(e, index, partialAccessor)

View File

@@ -39,6 +39,23 @@ module Raw {
*/
class Locatable extends @locatable, Element { }
/**
* INTERNAL: Do not use.
*/
class NamedCrate extends @named_crate, Element {
override string toString() { result = "NamedCrate" }
/**
* Gets the name of this named crate, if it exists.
*/
string getName() { named_crate_names(this, result) }
/**
* Gets the crate of this named crate.
*/
Crate getCrate() { named_crates(this, result) }
}
/**
* INTERNAL: Do not use.
* The base class marking everything that was not properly extracted for some reason, such as:
@@ -80,9 +97,9 @@ module Raw {
string getCfgOption(int index) { crate_cfg_options(this, index, result) }
/**
* Gets the `index`th dependency of this crate (0-based).
* Gets the `index`th named dependency of this crate (0-based).
*/
Crate getDependency(int index) { crate_dependencies(this, index, result) }
NamedCrate getNamedDependency(int index) { crate_named_dependencies(this, index, result) }
}
/**

View File

@@ -390,6 +390,10 @@ module Synth {
* INTERNAL: Do not use.
*/
TNameRef(Raw::NameRef id) { constructNameRef(id) } or
/**
* INTERNAL: Do not use.
*/
TNamedCrate(Raw::NamedCrate id) { constructNamedCrate(id) } or
/**
* INTERNAL: Do not use.
*/
@@ -1399,6 +1403,12 @@ module Synth {
*/
TNameRef convertNameRefFromRaw(Raw::Element e) { result = TNameRef(e) }
/**
* INTERNAL: Do not use.
* Converts a raw element to a synthesized `TNamedCrate`, if possible.
*/
TNamedCrate convertNamedCrateFromRaw(Raw::Element e) { result = TNamedCrate(e) }
/**
* INTERNAL: Do not use.
* Converts a raw element to a synthesized `TNeverTypeRepr`, if possible.
@@ -2064,6 +2074,8 @@ module Synth {
or
result = convertLocatableFromRaw(e)
or
result = convertNamedCrateFromRaw(e)
or
result = convertUnextractedFromRaw(e)
}
@@ -2977,6 +2989,12 @@ module Synth {
*/
Raw::Element convertNameRefToRaw(TNameRef e) { e = TNameRef(result) }
/**
* INTERNAL: Do not use.
* Converts a synthesized `TNamedCrate` to a raw DB element, if possible.
*/
Raw::Element convertNamedCrateToRaw(TNamedCrate e) { e = TNamedCrate(result) }
/**
* INTERNAL: Do not use.
* Converts a synthesized `TNeverTypeRepr` to a raw DB element, if possible.
@@ -3642,6 +3660,8 @@ module Synth {
or
result = convertLocatableToRaw(e)
or
result = convertNamedCrateToRaw(e)
or
result = convertUnextractedToRaw(e)
}

View File

@@ -95,6 +95,7 @@ import codeql.rust.elements.internal.MissingConstructor
import codeql.rust.elements.internal.ModuleConstructor
import codeql.rust.elements.internal.NameConstructor
import codeql.rust.elements.internal.NameRefConstructor
import codeql.rust.elements.internal.NamedCrateConstructor
import codeql.rust.elements.internal.NeverTypeReprConstructor
import codeql.rust.elements.internal.OffsetOfExprConstructor
import codeql.rust.elements.internal.OrPatConstructor

View File

@@ -122,6 +122,7 @@ locatable_locations(
@element =
@extractor_step
| @locatable
| @named_crate
| @unextracted
;
@@ -142,6 +143,17 @@ extractor_step_files(
| @crate
;
named_crates(
unique int id: @named_crate,
int crate: @crate ref
);
#keyset[id]
named_crate_names(
int id: @named_crate ref,
string name: string ref
);
@unextracted =
@missing
| @unimplemented
@@ -245,10 +257,10 @@ crate_cfg_options(
);
#keyset[id, index]
crate_dependencies(
crate_named_dependencies(
int id: @crate ref,
int index: int ref,
int dependency: @crate ref
int named_dependency: @named_crate ref
);
missings(

View File

@@ -17,6 +17,7 @@ import TaintReach
class CrateElement extends Element {
CrateElement() {
this instanceof Crate or
this instanceof NamedCrate or
this.(AstNode).getParentNode*() = any(Crate c).getModule()
}
}

View File

@@ -5,6 +5,7 @@ predicate toBeTested(Element e) { not e instanceof CrateElement }
class CrateElement extends Element {
CrateElement() {
this instanceof Crate or
this instanceof NamedCrate or
any(Crate c).getModule() = this.(AstNode).getParentNode*()
}
}

View File

@@ -1,119 +1,194 @@
#-----| Crate(alloc@0.0.0)
#-----| core -> Crate(core@0.0.0)
#-----| compiler_builtins -> Crate(compiler_builtins@0.1.140)
#-----| rand -> Crate(rand@0.8.5)
#-----| rand_xorshift -> Crate(rand_xorshift@0.3.0)
#-----| Crate(allocator_api2@0.2.21)
#-----| Crate(core@0.0.0)
#-----| -> Crate(rand@0.8.5)
#-----| -> Crate(rand_xorshift@0.3.0)
#-----| Crate(compiler_builtins@0.1.140)
#-----| -> Crate(core@0.0.0)
#-----| Crate(block_buffer@0.10.4)
#-----| proc_macro -> Crate(proc_macro@0.0.0)
#-----| alloc -> Crate(alloc@0.0.0)
#-----| core -> Crate(core@0.0.0)
#-----| std -> Crate(std@0.0.0)
#-----| test -> Crate(test@0.0.0)
#-----| generic_array -> Crate(generic_array@0.14.7)
#-----| Crate(cfg_if@1.0.0)
#-----| -> Crate(core@0.0.0)
#-----| -> Crate(compiler_builtins@0.1.140)
#-----| core -> Crate(core@0.0.0)
#-----| compiler_builtins -> Crate(compiler_builtins@0.1.140)
#-----| Crate(std@0.0.0)
#-----| -> Crate(core@0.0.0)
#-----| -> Crate(compiler_builtins@0.1.140)
#-----| -> Crate(cfg_if@1.0.0)
#-----| -> Crate(alloc@0.0.0)
#-----| -> Crate(hashbrown@0.15.2)
#-----| -> Crate(libc@0.2.169)
#-----| -> Crate(rand@0.8.5)
#-----| -> Crate(rand_xorshift@0.3.0)
#-----| -> Crate(rustc_demangle@0.1.24)
#-----| -> Crate(panic_abort@0.0.0)
#-----| -> Crate(unwind@0.0.0)
#-----| -> Crate(panic_unwind@0.0.0)
#-----| -> Crate(std_detect@0.1.5)
#-----| Crate(cfg_if@1.0.0)
#-----| proc_macro -> Crate(proc_macro@0.0.0)
#-----| alloc -> Crate(alloc@0.0.0)
#-----| core -> Crate(core@0.0.0)
#-----| std -> Crate(std@0.0.0)
#-----| test -> Crate(test@0.0.0)
#-----| Crate(unicode_width@0.1.14)
#-----| -> Crate(core@0.0.0)
#-----| -> Crate(compiler_builtins@0.1.140)
#-----| -> Crate(std@0.0.0)
#-----| Crate(compiler_builtins@0.1.140)
#-----| core -> Crate(core@0.0.0)
#-----| Crate(core@0.0.0)
#-----| rand -> Crate(rand@0.8.5)
#-----| rand_xorshift -> Crate(rand_xorshift@0.3.0)
#-----| Crate(crypto_common@0.1.6)
#-----| proc_macro -> Crate(proc_macro@0.0.0)
#-----| alloc -> Crate(alloc@0.0.0)
#-----| core -> Crate(core@0.0.0)
#-----| std -> Crate(std@0.0.0)
#-----| test -> Crate(test@0.0.0)
#-----| generic_array -> Crate(generic_array@0.14.7)
#-----| typenum -> Crate(typenum@1.18.0)
#-----| Crate(digest@0.10.7)
#-----| proc_macro -> Crate(proc_macro@0.0.0)
#-----| alloc -> Crate(alloc@0.0.0)
#-----| core -> Crate(core@0.0.0)
#-----| std -> Crate(std@0.0.0)
#-----| test -> Crate(test@0.0.0)
#-----| block_buffer -> Crate(block_buffer@0.10.4)
#-----| crypto_common -> Crate(crypto_common@0.1.6)
#-----| Crate(generic_array@0.14.7)
#-----| proc_macro -> Crate(proc_macro@0.0.0)
#-----| alloc -> Crate(alloc@0.0.0)
#-----| core -> Crate(core@0.0.0)
#-----| std -> Crate(std@0.0.0)
#-----| test -> Crate(test@0.0.0)
#-----| typenum -> Crate(typenum@1.18.0)
#-----| Crate(getopts@0.2.21)
#-----| -> Crate(core@0.0.0)
#-----| -> Crate(std@0.0.0)
#-----| -> Crate(unicode_width@0.1.14)
#-----| Crate(alloc@0.0.0)
#-----| -> Crate(core@0.0.0)
#-----| -> Crate(compiler_builtins@0.1.140)
#-----| -> Crate(rand@0.8.5)
#-----| -> Crate(rand_xorshift@0.3.0)
#-----| core -> Crate(core@0.0.0)
#-----| std -> Crate(std@0.0.0)
#-----| unicode_width -> Crate(unicode_width@0.1.14)
#-----| Crate(hashbrown@0.15.2)
#-----| -> Crate(allocator_api2@0.2.21)
#-----| -> Crate(core@0.0.0)
#-----| -> Crate(compiler_builtins@0.1.140)
#-----| -> Crate(alloc@0.0.0)
#-----| allocator_api2 -> Crate(allocator_api2@0.2.21)
#-----| alloc -> Crate(alloc@0.0.0)
#-----| core -> Crate(core@0.0.0)
#-----| compiler_builtins -> Crate(compiler_builtins@0.1.140)
#-----| Crate(libc@0.2.169)
#-----| -> Crate(core@0.0.0)
#-----| Crate(rand_core@0.6.4)
#-----| Crate(rand@0.8.5)
#-----| -> Crate(rand_core@0.6.4)
#-----| Crate(rand_xorshift@0.3.0)
#-----| -> Crate(rand_core@0.6.4)
#-----| Crate(rustc_demangle@0.1.24)
#-----| -> Crate(core@0.0.0)
#-----| -> Crate(compiler_builtins@0.1.140)
#-----| Crate(panic_abort@0.0.0)
#-----| -> Crate(core@0.0.0)
#-----| -> Crate(compiler_builtins@0.1.140)
#-----| -> Crate(cfg_if@1.0.0)
#-----| -> Crate(alloc@0.0.0)
#-----| -> Crate(libc@0.2.169)
#-----| Crate(unwind@0.0.0)
#-----| -> Crate(core@0.0.0)
#-----| -> Crate(compiler_builtins@0.1.140)
#-----| -> Crate(cfg_if@1.0.0)
#-----| -> Crate(libc@0.2.169)
#-----| Crate(panic_unwind@0.0.0)
#-----| -> Crate(core@0.0.0)
#-----| -> Crate(compiler_builtins@0.1.140)
#-----| -> Crate(cfg_if@1.0.0)
#-----| -> Crate(alloc@0.0.0)
#-----| -> Crate(libc@0.2.169)
#-----| -> Crate(unwind@0.0.0)
#-----| Crate(proc_macro@0.0.0)
#-----| -> Crate(core@0.0.0)
#-----| -> Crate(std@0.0.0)
#-----| Crate(std_detect@0.1.5)
#-----| -> Crate(core@0.0.0)
#-----| -> Crate(compiler_builtins@0.1.140)
#-----| -> Crate(cfg_if@1.0.0)
#-----| -> Crate(alloc@0.0.0)
#-----| -> Crate(libc@0.2.169)
#-----| Crate(test@0.0.0)
#-----| -> Crate(core@0.0.0)
#-----| -> Crate(std@0.0.0)
#-----| -> Crate(getopts@0.2.21)
#-----| -> Crate(libc@0.2.169)
lib.rs:
# 0| Crate(test@0.0.1)
#-----| -> Crate(core@0.0.0)
#-----| -> Crate(std@0.0.0)
#-----| -> Crate(alloc@0.0.0)
#-----| -> Crate(proc_macro@0.0.0)
#-----| -> Crate(test@0.0.0)
#-----| rustc_std_workspace_core -> Crate(core@0.0.0)
main.rs:
# 0| Crate(main@0.0.1)
#-----| -> Crate(core@0.0.0)
#-----| -> Crate(std@0.0.0)
#-----| -> Crate(alloc@0.0.0)
#-----| -> Crate(proc_macro@0.0.0)
#-----| -> Crate(test@0.0.0)
#-----| -> Crate(test@0.0.1)
#-----| proc_macro -> Crate(proc_macro@0.0.0)
#-----| alloc -> Crate(alloc@0.0.0)
#-----| core -> Crate(core@0.0.0)
#-----| std -> Crate(std@0.0.0)
#-----| test -> Crate(test@0.0.0)
#-----| md5 -> Crate(md5@0.10.6)
#-----| md5_alt -> Crate(md5@0.7.0)
#-----| test -> Crate(test@0.0.1)
#-----| Crate(md5@0.10.6)
#-----| proc_macro -> Crate(proc_macro@0.0.0)
#-----| alloc -> Crate(alloc@0.0.0)
#-----| core -> Crate(core@0.0.0)
#-----| std -> Crate(std@0.0.0)
#-----| test -> Crate(test@0.0.0)
#-----| cfg_if -> Crate(cfg_if@1.0.0)
#-----| digest -> Crate(digest@0.10.7)
#-----| Crate(md5@0.7.0)
#-----| proc_macro -> Crate(proc_macro@0.0.0)
#-----| alloc -> Crate(alloc@0.0.0)
#-----| core -> Crate(core@0.0.0)
#-----| std -> Crate(std@0.0.0)
#-----| test -> Crate(test@0.0.0)
#-----| Crate(panic_abort@0.0.0)
#-----| alloc -> Crate(alloc@0.0.0)
#-----| core -> Crate(core@0.0.0)
#-----| compiler_builtins -> Crate(compiler_builtins@0.1.140)
#-----| cfg_if -> Crate(cfg_if@1.0.0)
#-----| libc -> Crate(libc@0.2.169)
#-----| Crate(panic_unwind@0.0.0)
#-----| alloc -> Crate(alloc@0.0.0)
#-----| core -> Crate(core@0.0.0)
#-----| compiler_builtins -> Crate(compiler_builtins@0.1.140)
#-----| cfg_if -> Crate(cfg_if@1.0.0)
#-----| libc -> Crate(libc@0.2.169)
#-----| unwind -> Crate(unwind@0.0.0)
#-----| Crate(proc_macro@0.0.0)
#-----| core -> Crate(core@0.0.0)
#-----| std -> Crate(std@0.0.0)
#-----| Crate(rand@0.8.5)
#-----| rand_core -> Crate(rand_core@0.6.4)
#-----| Crate(rand_core@0.6.4)
#-----| Crate(rand_xorshift@0.3.0)
#-----| rand_core -> Crate(rand_core@0.6.4)
#-----| Crate(rustc_demangle@0.1.24)
#-----| core -> Crate(core@0.0.0)
#-----| compiler_builtins -> Crate(compiler_builtins@0.1.140)
#-----| Crate(std@0.0.0)
#-----| alloc -> Crate(alloc@0.0.0)
#-----| core -> Crate(core@0.0.0)
#-----| compiler_builtins -> Crate(compiler_builtins@0.1.140)
#-----| cfg_if -> Crate(cfg_if@1.0.0)
#-----| hashbrown -> Crate(hashbrown@0.15.2)
#-----| libc -> Crate(libc@0.2.169)
#-----| rand -> Crate(rand@0.8.5)
#-----| rand_xorshift -> Crate(rand_xorshift@0.3.0)
#-----| rustc_demangle -> Crate(rustc_demangle@0.1.24)
#-----| panic_abort -> Crate(panic_abort@0.0.0)
#-----| unwind -> Crate(unwind@0.0.0)
#-----| panic_unwind -> Crate(panic_unwind@0.0.0)
#-----| std_detect -> Crate(std_detect@0.1.5)
#-----| Crate(std_detect@0.1.5)
#-----| alloc -> Crate(alloc@0.0.0)
#-----| core -> Crate(core@0.0.0)
#-----| compiler_builtins -> Crate(compiler_builtins@0.1.140)
#-----| cfg_if -> Crate(cfg_if@1.0.0)
#-----| libc -> Crate(libc@0.2.169)
#-----| Crate(test@0.0.0)
#-----| core -> Crate(core@0.0.0)
#-----| std -> Crate(std@0.0.0)
#-----| getopts -> Crate(getopts@0.2.21)
#-----| libc -> Crate(libc@0.2.169)
lib.rs:
# 0| Crate(test@0.0.1)
#-----| proc_macro -> Crate(proc_macro@0.0.0)
#-----| alloc -> Crate(alloc@0.0.0)
#-----| core -> Crate(core@0.0.0)
#-----| std -> Crate(std@0.0.0)
#-----| test -> Crate(test@0.0.0)
#-----| md5 -> Crate(md5@0.10.6)
#-----| md5_alt -> Crate(md5@0.7.0)
#-----| Crate(typenum@1.18.0)
#-----| proc_macro -> Crate(proc_macro@0.0.0)
#-----| alloc -> Crate(alloc@0.0.0)
#-----| core -> Crate(core@0.0.0)
#-----| std -> Crate(std@0.0.0)
#-----| test -> Crate(test@0.0.0)
#-----| Crate(unicode_width@0.1.14)
#-----| core -> Crate(core@0.0.0)
#-----| std -> Crate(std@0.0.0)
#-----| compiler_builtins -> Crate(compiler_builtins@0.1.140)
#-----| Crate(unwind@0.0.0)
#-----| core -> Crate(core@0.0.0)
#-----| compiler_builtins -> Crate(compiler_builtins@0.1.140)
#-----| cfg_if -> Crate(cfg_if@1.0.0)
#-----| libc -> Crate(libc@0.2.169)
#-----| Crate(version_check@0.9.5)
#-----| proc_macro -> Crate(proc_macro@0.0.0)
#-----| alloc -> Crate(alloc@0.0.0)
#-----| core -> Crate(core@0.0.0)
#-----| std -> Crate(std@0.0.0)
#-----| test -> Crate(test@0.0.0)

View File

@@ -11,6 +11,21 @@ class MyCrate extends Crate {
Location getLocation() { result = super.getLocation() and this.fromSource() }
}
query predicate nodes(MyCrate c) { any() }
private int getOrder(MyCrate c) {
c =
rank[result](MyCrate c0, string name, string version |
name = c0.getName() and
version = c0.getVersion()
|
c0 order by name, version
)
}
query predicate edges(MyCrate c1, MyCrate c2) { c1.getADependency() = c2 }
query predicate nodes(MyCrate c, string key, string value) {
key = "semmle.order" and value = getOrder(c).toString()
}
query predicate edges(MyCrate c1, MyCrate c2, string key, string value) {
c1.getDependency(value) = c2 and
key = "semmle.label"
}

View File

@@ -0,0 +1,3 @@
qltest_dependencies:
- md-5 = { version = "0.10.6" }
- md5_alt = { package = "md5", version = "0.7.0" }

View File

@@ -118,4 +118,11 @@ class Crate(Locatable):
version: optional[string]
module: optional["Module"]
cfg_options: list[string]
dependencies: list["Crate"]
named_dependencies: list["NamedCrate"] | ql.internal
@qltest.skip
@ql.internal
class NamedCrate(Element):
name: optional[string]
crate: "Crate"