From 06cdaa43780a3da0e391466df1b54b202827c4cd Mon Sep 17 00:00:00 2001 From: Arthur Baars Date: Tue, 28 Jan 2025 14:52:29 +0100 Subject: [PATCH] Rust: add UseTree::is_star --- rust/ast-generator/src/main.rs | 6 ++++++ rust/extractor/src/generated/.generated.list | 2 +- rust/extractor/src/generated/top.rs | 4 ++++ rust/extractor/src/translate/generated.rs | 2 ++ rust/ql/.generated.list | 8 ++++---- .../lib/codeql/rust/elements/internal/generated/Raw.qll | 5 +++++ .../codeql/rust/elements/internal/generated/UseTree.qll | 5 +++++ rust/ql/lib/rust.dbscheme | 5 +++++ rust/ql/test/extractor-tests/generated/UseTree/UseTree.ql | 6 ++++-- rust/schema/ast.py | 1 + 10 files changed, 37 insertions(+), 7 deletions(-) diff --git a/rust/ast-generator/src/main.rs b/rust/ast-generator/src/main.rs index 55d98f8b3b2f..3706270fb4a9 100644 --- a/rust/ast-generator/src/main.rs +++ b/rust/ast-generator/src/main.rs @@ -363,6 +363,12 @@ fn get_fields(node: &AstNodeSrc) -> Vec { ty: FieldType::Predicate, }); } + "UseTree" => { + result.push(FieldInfo { + name: "is_star".to_string(), + ty: FieldType::Predicate, + }); + } _ => {} } diff --git a/rust/extractor/src/generated/.generated.list b/rust/extractor/src/generated/.generated.list index ed3819821738..eb990b9b57ea 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 97b9c3c5485196cc7949ec1b67c5844b7ff7af67bc2339276adbdafb03789ac0 97b9c3c5485196cc7949ec1b67c5844b7ff7af67bc2339276adbdafb03789ac0 +top.rs 20a8a650ba484cbeed744fd8161880eaebbb26a5c618e9b519b59072f9703104 20a8a650ba484cbeed744fd8161880eaebbb26a5c618e9b519b59072f9703104 diff --git a/rust/extractor/src/generated/top.rs b/rust/extractor/src/generated/top.rs index 5e962ad77ea6..6ca980b080f3 100644 --- a/rust/extractor/src/generated/top.rs +++ b/rust/extractor/src/generated/top.rs @@ -3074,6 +3074,7 @@ impl From> for trap::Label { #[derive(Debug)] pub struct UseTree { pub id: trap::TrapId, + pub is_star: bool, pub path: Option>, pub rename: Option>, pub use_tree_list: Option>, @@ -3086,6 +3087,9 @@ impl trap::TrapEntry for UseTree { fn emit(self, id: trap::Label, out: &mut trap::Writer) { out.add_tuple("use_trees", vec![id.into()]); + if self.is_star { + out.add_tuple("use_tree_is_star", vec![id.into()]); + } if let Some(v) = self.path { out.add_tuple("use_tree_paths", vec![id.into(), v.into()]); } diff --git a/rust/extractor/src/translate/generated.rs b/rust/extractor/src/translate/generated.rs index 136bcfe71e8c..332df0e180c7 100644 --- a/rust/extractor/src/translate/generated.rs +++ b/rust/extractor/src/translate/generated.rs @@ -2483,11 +2483,13 @@ impl Translator<'_> { } pub(crate) fn emit_use_tree(&mut self, node: ast::UseTree) -> Option> { + let is_star = node.star_token().is_some(); let path = node.path().and_then(|x| self.emit_path(x)); let rename = node.rename().and_then(|x| self.emit_rename(x)); let use_tree_list = node.use_tree_list().and_then(|x| self.emit_use_tree_list(x)); let label = self.trap.emit(generated::UseTree { id: TrapId::Star, + is_star, path, rename, use_tree_list, diff --git a/rust/ql/.generated.list b/rust/ql/.generated.list index 8d1f4d244d56..6582b6f47bf8 100644 --- a/rust/ql/.generated.list +++ b/rust/ql/.generated.list @@ -579,7 +579,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 738612c1ec404fe8c090e0d234bdac4ce207bd0d4cad699a2981e6b6cb8947a9 df002e5540bfe5de4e6849879f334b09c2ffb4893ff8364146c6c505f4b2d090 +lib/codeql/rust/elements/internal/generated/ParentChild.qll a180b0d0c8c33503dc4c013c3f568eaa628d24204bfc36a7484c56a701a79f95 df002e5540bfe5de4e6849879f334b09c2ffb4893ff8364146c6c505f4b2d090 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 bf6a86e7fcb7164624cc070dcce86d2bda50a2516b95115b87d0ebb5596e50a1 fd7a9ad4034cdebe8dfe495619c46f464630d38195313072e0bd904061b0fb00 @@ -594,7 +594,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 c75c7811d041897c2d6aae1e0e55b46af6182565e1d0dd624062c5ca499e9325 79e6ded808f14dd622076b75d8e4985c7b90f2d5e964d0750519b510463b47ba +lib/codeql/rust/elements/internal/generated/Raw.qll 1dbdec6cc7c8b209cef96c7ba6ab7c186c91ff9a9a246d05664d9275560c4893 ade8d7b67561caa551112a9a54195d4a9148d45fefa2eac45dda6ce93e4487f1 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 @@ -646,7 +646,7 @@ lib/codeql/rust/elements/internal/generated/Union.qll 06a602aa7c7097e72fff6ea33d lib/codeql/rust/elements/internal/generated/Use.qll d42ccf3516a9f79ae8766f93ad5f09d3cdcd7b96844d4c9de64189b56018a7b4 70a9553a8f71f6cbfdd0f59a4b42292d13177613ceb0542436436e0ac2e1f8ee lib/codeql/rust/elements/internal/generated/UseBoundGenericArg.qll 69162794e871291545ea04f61259b2d000671a96f7ca129f7dd9ed6e984067c4 31de9ebc0634b38e2347e0608b4ea888892f1f2732a2892464078cd8a07b4ee8 lib/codeql/rust/elements/internal/generated/UseBoundGenericArgs.qll 05dca015d922935887856f3a0d577dbcf5b8f82bc384bdc9c8c2d0106419716d fcee14ed4f7a639b1ba721bd390fc0cdbfdc7c759e3092aa462d466fe390de45 -lib/codeql/rust/elements/internal/generated/UseTree.qll b39cbc96e473802372726d580febbfa7d73668ba476095aa4a61fae914865913 40ce6515b7df068fa8c0a7e5ae8984f50b71f6f96d625d631b28d525e3e868b7 +lib/codeql/rust/elements/internal/generated/UseTree.qll 9fbf4bb8e8719482605b1a35f200711f356f7c38636b6685fdb2ebf6b1fc5c0e b2ec743a2ced5ead2fa9136e72afaeef35bb63b4b82951abf5d496956ca76931 lib/codeql/rust/elements/internal/generated/UseTreeList.qll 829441cf309f008a6a9d2e784aa414ab4c11880a658f8ee71aa4df385cd2b6a8 ced82df94fea7a191f414f7e6496d13791d2f535046844b6f712a390663ac3d0 lib/codeql/rust/elements/internal/generated/Variant.qll e40dbb23e07c5b70adc577efdf7a064e773207f216cad8fe8905882b1da9f4a9 13f7be36d043afcfc156d2c01bb828de882df69aa732f284aa76c5f00b063544 lib/codeql/rust/elements/internal/generated/VariantList.qll 4eb923ca341033c256ca9b8a8a5b4e14c7eac9d015be187fd97eeb25dfb1e18e e7865e975c35db49cd72cb8f9864797d3cfed16c3a675b5032b867ced2bbb405 @@ -1189,7 +1189,7 @@ test/extractor-tests/generated/Use/Use_getExtendedCanonicalPath.ql ccfde95c861cf test/extractor-tests/generated/Use/Use_getUseTree.ql 1dfe6bb40b29fbf823d67fecfc36ba928b43f17c38227b8eedf19fa252edf3af aacdcc4cf418ef1eec267287d2af905fe73f5bcfb080ef5373d08da31c608720 test/extractor-tests/generated/Use/Use_getVisibility.ql 587f80acdd780042c48aeb347004be5e9fd9df063d263e6e4f2b660c48c53a8f 0c2c04f95838bca93dfe93fa208e1df7677797efc62b4e8052a4f9c5d20831dd test/extractor-tests/generated/UseBoundGenericArgs/MISSING_SOURCE.txt b6cf5771fdbbe981aeb3f443ec7a40517b6e99ffc9817fd8872c2e344240dae1 b6cf5771fdbbe981aeb3f443ec7a40517b6e99ffc9817fd8872c2e344240dae1 -test/extractor-tests/generated/UseTree/UseTree.ql cb9f63051ae08cf8557b86b69b02cefe1732fc1e2daec34bcb891e271829cd86 eb46496aab9252b21eb0ccdd75792a97264885259c23d7e17e3013d943783947 +test/extractor-tests/generated/UseTree/UseTree.ql d86f29e1ad14d4b37e66997169783a1b8c801f327cf950c3ee4a66b82fa0d794 c4431564ef139eca569b9181540f53051d83a0d107edd6fad7a4350b02280e28 test/extractor-tests/generated/UseTree/UseTree_getPath.ql 80384a99674bdda85315a36681cb22ad2ad094005a5543b63d930fc7e030dd5b 2cd92b5de8b4214527f8a58d641430f6804d9bd40927e1da0c7efda2f86f6544 test/extractor-tests/generated/UseTree/UseTree_getRename.ql ec3917501f3c89ac4974fab3f812d00b159ae6f2402dd20e5b4b3f8e8426391d db9ed981ce5f822aee349e5841d3126af7878d90e64140756ab4519552defe72 test/extractor-tests/generated/UseTree/UseTree_getUseTreeList.ql c265a88347e813840969ae934dfd2904bc06f502de77709bc0b1c7255e46382a 52a239c8ea5fd8fbfbd606559d70ecadc769887437a9bcab6fb3e774208ad868 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 a1655224a17f..35ae147ae71c 100644 --- a/rust/ql/lib/codeql/rust/elements/internal/generated/Raw.qll +++ b/rust/ql/lib/codeql/rust/elements/internal/generated/Raw.qll @@ -1096,6 +1096,11 @@ module Raw { class UseTree extends @use_tree, AstNode { override string toString() { result = "UseTree" } + /** + * Holds if this use tree is star. + */ + predicate isStar() { use_tree_is_star(this) } + /** * Gets the path of this use tree, if it exists. */ diff --git a/rust/ql/lib/codeql/rust/elements/internal/generated/UseTree.qll b/rust/ql/lib/codeql/rust/elements/internal/generated/UseTree.qll index 38696c378ad8..b0abf71de131 100644 --- a/rust/ql/lib/codeql/rust/elements/internal/generated/UseTree.qll +++ b/rust/ql/lib/codeql/rust/elements/internal/generated/UseTree.qll @@ -27,6 +27,11 @@ module Generated { class UseTree extends Synth::TUseTree, AstNodeImpl::AstNode { override string getAPrimaryQlClass() { result = "UseTree" } + /** + * Holds if this use tree is star. + */ + predicate isStar() { Synth::convertUseTreeToRaw(this).(Raw::UseTree).isStar() } + /** * Gets the path of this use tree, if it exists. */ diff --git a/rust/ql/lib/rust.dbscheme b/rust/ql/lib/rust.dbscheme index 6cd197193bee..badbc6dd9a7e 100644 --- a/rust/ql/lib/rust.dbscheme +++ b/rust/ql/lib/rust.dbscheme @@ -1094,6 +1094,11 @@ use_trees( unique int id: @use_tree ); +#keyset[id] +use_tree_is_star( + int id: @use_tree ref +); + #keyset[id] use_tree_paths( int id: @use_tree ref, diff --git a/rust/ql/test/extractor-tests/generated/UseTree/UseTree.ql b/rust/ql/test/extractor-tests/generated/UseTree/UseTree.ql index e536bed9de03..50f1138525b4 100644 --- a/rust/ql/test/extractor-tests/generated/UseTree/UseTree.ql +++ b/rust/ql/test/extractor-tests/generated/UseTree/UseTree.ql @@ -2,11 +2,13 @@ import codeql.rust.elements import TestUtils -from UseTree x, string hasPath, string hasRename, string hasUseTreeList +from UseTree x, string isStar, string hasPath, string hasRename, string hasUseTreeList where toBeTested(x) and not x.isUnknown() and + (if x.isStar() then isStar = "yes" else isStar = "no") and (if x.hasPath() then hasPath = "yes" else hasPath = "no") and (if x.hasRename() then hasRename = "yes" else hasRename = "no") and if x.hasUseTreeList() then hasUseTreeList = "yes" else hasUseTreeList = "no" -select x, "hasPath:", hasPath, "hasRename:", hasRename, "hasUseTreeList:", hasUseTreeList +select x, "isStar:", isStar, "hasPath:", hasPath, "hasRename:", hasRename, "hasUseTreeList:", + hasUseTreeList diff --git a/rust/schema/ast.py b/rust/schema/ast.py index fea7a1384fb9..928904dd9295 100644 --- a/rust/schema/ast.py +++ b/rust/schema/ast.py @@ -727,6 +727,7 @@ class UseBoundGenericArgs(AstNode, ): use_bound_generic_args: list["UseBoundGenericArg"] | child class UseTree(AstNode, ): + is_star: predicate path: optional["Path"] | child rename: optional["Rename"] | child use_tree_list: optional["UseTreeList"] | child