diff --git a/rust/extractor/src/crate_graph.rs b/rust/extractor/src/crate_graph.rs index cc33982c13d..04e0ffd7680 100644 --- a/rust/extractor/src/crate_graph.rs +++ b/rust/extractor/src/crate_graph.rs @@ -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 = 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); diff --git a/rust/extractor/src/generated/.generated.list b/rust/extractor/src/generated/.generated.list index 641f5c67fce..2560f1333e6 100644 --- a/rust/extractor/src/generated/.generated.list +++ b/rust/extractor/src/generated/.generated.list @@ -1,2 +1,2 @@ mod.rs 4bcb9def847469aae9d8649461546b7c21ec97cf6e63d3cf394e339915ce65d7 4bcb9def847469aae9d8649461546b7c21ec97cf6e63d3cf394e339915ce65d7 -top.rs 413fd08f7bc22169688be065bd89fa80f924fcbf88ce41e6a9db6872b2a6a84e 413fd08f7bc22169688be065bd89fa80f924fcbf88ce41e6a9db6872b2a6a84e +top.rs 3db0fd908579f949394294727474f5ba2e3d483f87d5b5737b7e81f36a457c7d 3db0fd908579f949394294727474f5ba2e3d483f87d5b5737b7e81f36a457c7d diff --git a/rust/extractor/src/generated/top.rs b/rust/extractor/src/generated/top.rs index 0cdc1886420..35bdc38ed32 100644 --- a/rust/extractor/src/generated/top.rs +++ b/rust/extractor/src/generated/top.rs @@ -74,6 +74,39 @@ impl From> for trap::Label { } } +#[derive(Debug)] +pub struct NamedCrate { + pub id: trap::TrapId, + pub name: Option, + pub crate_: trap::Label, +} + +impl trap::TrapEntry for NamedCrate { + fn extract_id(&mut self) -> trap::TrapId { + std::mem::replace(&mut self.id, trap::TrapId::Star) + } + + fn emit(self, id: trap::Label, 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> for trap::Label { + fn from(value: trap::Label) -> 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, pub module: Option>, pub cfg_options: Vec, - pub dependencies: Vec>, + pub named_dependencies: Vec>, } 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()]); } } } diff --git a/rust/ql/.generated.list b/rust/ql/.generated.list index dc100f244cf..2eb3b2ef338 100644 --- a/rust/ql/.generated.list +++ b/rust/ql/.generated.list @@ -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 diff --git a/rust/ql/.gitattributes b/rust/ql/.gitattributes index 333beeb3d2b..22958cdcb05 100644 --- a/rust/ql/.gitattributes +++ b/rust/ql/.gitattributes @@ -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 diff --git a/rust/ql/lib/codeql/rust/elements/Crate.qll b/rust/ql/lib/codeql/rust/elements/Crate.qll index 79c39648f98..a092591a470 100644 --- a/rust/ql/lib/codeql/rust/elements/Crate.qll +++ b/rust/ql/lib/codeql/rust/elements/Crate.qll @@ -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; diff --git a/rust/ql/lib/codeql/rust/elements/internal/CrateImpl.qll b/rust/ql/lib/codeql/rust/elements/internal/CrateImpl.qll index f3a14daa790..77fc4b8ff50 100644 --- a/rust/ql/lib/codeql/rust/elements/internal/CrateImpl.qll +++ b/rust/ql/lib/codeql/rust/elements/internal/CrateImpl.qll @@ -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() } } } diff --git a/rust/ql/lib/codeql/rust/elements/internal/NamedCrate.qll b/rust/ql/lib/codeql/rust/elements/internal/NamedCrate.qll new file mode 100644 index 00000000000..32adc63490e --- /dev/null +++ b/rust/ql/lib/codeql/rust/elements/internal/NamedCrate.qll @@ -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; diff --git a/rust/ql/lib/codeql/rust/elements/internal/NamedCrateConstructor.qll b/rust/ql/lib/codeql/rust/elements/internal/NamedCrateConstructor.qll new file mode 100644 index 00000000000..94dce9f1862 --- /dev/null +++ b/rust/ql/lib/codeql/rust/elements/internal/NamedCrateConstructor.qll @@ -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() } diff --git a/rust/ql/lib/codeql/rust/elements/internal/NamedCrateImpl.qll b/rust/ql/lib/codeql/rust/elements/internal/NamedCrateImpl.qll new file mode 100644 index 00000000000..2dafd18c22b --- /dev/null +++ b/rust/ql/lib/codeql/rust/elements/internal/NamedCrateImpl.qll @@ -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 { } +} diff --git a/rust/ql/lib/codeql/rust/elements/internal/generated/Crate.qll b/rust/ql/lib/codeql/rust/elements/internal/generated/Crate.qll index 5024893eb64..f3eac4f7766 100644 --- a/rust/ql/lib/codeql/rust/elements/internal/generated/Crate.qll +++ b/rust/ql/lib/codeql/rust/elements/internal/generated/Crate.qll @@ -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))) + } } } diff --git a/rust/ql/lib/codeql/rust/elements/internal/generated/NamedCrate.qll b/rust/ql/lib/codeql/rust/elements/internal/generated/NamedCrate.qll new file mode 100644 index 00000000000..041cd04c649 --- /dev/null +++ b/rust/ql/lib/codeql/rust/elements/internal/generated/NamedCrate.qll @@ -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()) + } + } +} diff --git a/rust/ql/lib/codeql/rust/elements/internal/generated/ParentChild.qll b/rust/ql/lib/codeql/rust/elements/internal/generated/ParentChild.qll index da81c697388..7de4ea30a3d 100644 --- a/rust/ql/lib/codeql/rust/elements/internal/generated/ParentChild.qll +++ b/rust/ql/lib/codeql/rust/elements/internal/generated/ParentChild.qll @@ -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) diff --git a/rust/ql/lib/codeql/rust/elements/internal/generated/Raw.qll b/rust/ql/lib/codeql/rust/elements/internal/generated/Raw.qll index dc4f3f7c273..85705f59916 100644 --- a/rust/ql/lib/codeql/rust/elements/internal/generated/Raw.qll +++ b/rust/ql/lib/codeql/rust/elements/internal/generated/Raw.qll @@ -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) } } /** diff --git a/rust/ql/lib/codeql/rust/elements/internal/generated/Synth.qll b/rust/ql/lib/codeql/rust/elements/internal/generated/Synth.qll index 275344e1369..63ba55d8c67 100644 --- a/rust/ql/lib/codeql/rust/elements/internal/generated/Synth.qll +++ b/rust/ql/lib/codeql/rust/elements/internal/generated/Synth.qll @@ -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) } diff --git a/rust/ql/lib/codeql/rust/elements/internal/generated/SynthConstructors.qll b/rust/ql/lib/codeql/rust/elements/internal/generated/SynthConstructors.qll index 1cd8fac638c..7203939ec8c 100644 --- a/rust/ql/lib/codeql/rust/elements/internal/generated/SynthConstructors.qll +++ b/rust/ql/lib/codeql/rust/elements/internal/generated/SynthConstructors.qll @@ -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 diff --git a/rust/ql/lib/rust.dbscheme b/rust/ql/lib/rust.dbscheme index f3f8ee936b1..2a978397c80 100644 --- a/rust/ql/lib/rust.dbscheme +++ b/rust/ql/lib/rust.dbscheme @@ -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( diff --git a/rust/ql/src/queries/summary/SummaryStats.ql b/rust/ql/src/queries/summary/SummaryStats.ql index 7e84371384a..69ab796c869 100644 --- a/rust/ql/src/queries/summary/SummaryStats.ql +++ b/rust/ql/src/queries/summary/SummaryStats.ql @@ -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() } } diff --git a/rust/ql/test/TestUtils.qll b/rust/ql/test/TestUtils.qll index dfd0d95141e..ce494ff5a60 100644 --- a/rust/ql/test/TestUtils.qll +++ b/rust/ql/test/TestUtils.qll @@ -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*() } } diff --git a/rust/ql/test/extractor-tests/crate_graph/crates.expected b/rust/ql/test/extractor-tests/crate_graph/crates.expected index 9948f6405e3..acc8aa3dec8 100644 --- a/rust/ql/test/extractor-tests/crate_graph/crates.expected +++ b/rust/ql/test/extractor-tests/crate_graph/crates.expected @@ -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) diff --git a/rust/ql/test/extractor-tests/crate_graph/crates.ql b/rust/ql/test/extractor-tests/crate_graph/crates.ql index c843a1af0a8..90da5ee70ef 100644 --- a/rust/ql/test/extractor-tests/crate_graph/crates.ql +++ b/rust/ql/test/extractor-tests/crate_graph/crates.ql @@ -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" +} diff --git a/rust/ql/test/extractor-tests/crate_graph/options.yml b/rust/ql/test/extractor-tests/crate_graph/options.yml new file mode 100644 index 00000000000..6c3602337be --- /dev/null +++ b/rust/ql/test/extractor-tests/crate_graph/options.yml @@ -0,0 +1,3 @@ +qltest_dependencies: + - md-5 = { version = "0.10.6" } + - md5_alt = { package = "md5", version = "0.7.0" } diff --git a/rust/schema/prelude.py b/rust/schema/prelude.py index c2579d57781..3196074a573 100644 --- a/rust/schema/prelude.py +++ b/rust/schema/prelude.py @@ -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"