diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index ced5d5021ca9..b2eb8e4f2ff6 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -9,7 +9,7 @@ repos: - id: trailing-whitespace exclude: /test/.*$(? Vec { let name = field.method_name(); match (node.name.as_str(), name.as_str()) { ("ArrayExpr", "expr") // The ArrayExpr type also has an 'exprs' field - | ("PathSegment", "ty" | "path_type") // these are broken, handling them manually + | ("PathSegment", "type_anchor") // we flatten TypeAnchor into PathSegment in the extractor | ("Param", "pat") | ("MacroCall", "token_tree") // handled manually to use `body` => continue, _ => {} @@ -487,6 +487,9 @@ fn main() -> anyhow::Result<()> { grammar.enums.retain(|x| x.name != "Adt"); + // we flatten TypeAnchor into PathSegment in the extractor + grammar.nodes.retain(|x| x.name != "TypeAnchor"); + let mut super_types: BTreeMap> = BTreeMap::new(); for node in &grammar.enums { for variant in &node.variants { diff --git a/rust/extractor/Cargo.toml b/rust/extractor/Cargo.toml index fa3f6171bf86..88a3e203a278 100644 --- a/rust/extractor/Cargo.toml +++ b/rust/extractor/Cargo.toml @@ -6,39 +6,39 @@ license = "MIT" # When updating these dependencies, run `rust/update_cargo_deps.sh` [dependencies] -anyhow = "1.0.97" -clap = { version = "4.5.35", features = ["derive"] } +anyhow = "1.0.98" +clap = { version = "4.5.40", features = ["derive"] } figment = { version = "0.10.19", features = ["env", "yaml"] } num-traits = "0.2.19" -ra_ap_base_db = "0.0.273" -ra_ap_hir = "0.0.273" -ra_ap_hir_def = "0.0.273" -ra_ap_ide_db = "0.0.273" -ra_ap_hir_ty = "0.0.273" -ra_ap_hir_expand = "0.0.273" -ra_ap_load-cargo = "0.0.273" -ra_ap_paths = "0.0.273" -ra_ap_project_model = "0.0.273" -ra_ap_syntax = "0.0.273" -ra_ap_vfs = "0.0.273" -ra_ap_parser = "0.0.273" -ra_ap_span = "0.0.273" -ra_ap_cfg = "0.0.273" -ra_ap_intern = "0.0.273" +ra_ap_base_db = "0.0.288" +ra_ap_hir = "0.0.288" +ra_ap_hir_def = "0.0.288" +ra_ap_ide_db = "0.0.288" +ra_ap_hir_ty = "0.0.288" +ra_ap_hir_expand = "0.0.288" +ra_ap_load-cargo = "0.0.288" +ra_ap_paths = "0.0.288" +ra_ap_project_model = "0.0.288" +ra_ap_syntax = "0.0.288" +ra_ap_vfs = "0.0.288" +ra_ap_parser = "0.0.288" +ra_ap_span = "0.0.288" +ra_ap_cfg = "0.0.288" +ra_ap_intern = "0.0.288" serde = "1.0.219" -serde_with = "3.12.0" +serde_with = "3.13.0" triomphe = "0.1.14" argfile = "0.2.1" codeql-extractor = { path = "../../shared/tree-sitter-extractor" } rust-extractor-macros = { path = "macros" } itertools = "0.14.0" glob = "0.3.2" -chrono = { version = "0.4.40", features = ["serde"] } +chrono = { version = "0.4.41", features = ["serde"] } serde_json = "1.0.140" dunce = "1.0.5" -toml = "0.8.20" +toml = "0.8.23" tracing = "0.1.41" tracing-flame = "0.2.0" tracing-subscriber = "0.3.19" -chalk-ir = "0.100.0" +chalk-ir = "0.103.0" mustache = "0.9.0" diff --git a/rust/extractor/macros/Cargo.toml b/rust/extractor/macros/Cargo.toml index c088e98ea76c..3444aa98758e 100644 --- a/rust/extractor/macros/Cargo.toml +++ b/rust/extractor/macros/Cargo.toml @@ -10,4 +10,4 @@ proc-macro = true # When updating these dependencies, run `rust/update_cargo_deps.sh` [dependencies] quote = "1.0.40" -syn = { version = "2.0.100", features = ["full"] } +syn = { version = "2.0.103", features = ["full"] } diff --git a/rust/extractor/src/config.rs b/rust/extractor/src/config.rs index 8108dec032fb..303089b15742 100644 --- a/rust/extractor/src/config.rs +++ b/rust/extractor/src/config.rs @@ -52,7 +52,7 @@ pub struct Config { pub cargo_target: Option, pub cargo_features: Vec, pub cargo_cfg_overrides: Vec, - pub cargo_extra_env: FxHashMap, + pub cargo_extra_env: FxHashMap>, pub cargo_extra_args: Vec, pub cargo_all_targets: bool, pub logging_flamegraph: Option, diff --git a/rust/extractor/src/config/deserialize.rs b/rust/extractor/src/config/deserialize.rs index 4f3d96897909..6e1b9b398b63 100644 --- a/rust/extractor/src/config/deserialize.rs +++ b/rust/extractor/src/config/deserialize.rs @@ -1,5 +1,5 @@ use serde::Deserializer; -use serde::de::{Error, Unexpected, Visitor}; +use serde::de::Visitor; use std::collections::HashMap; use std::fmt::Formatter; use std::hash::BuildHasher; @@ -36,23 +36,22 @@ impl<'de, T: From> Visitor<'de> for VectorVisitor { } impl<'de, S: BuildHasher + Default> Visitor<'de> for MapVisitor { - type Value = HashMap; + type Value = HashMap, S>; fn expecting(&self, formatter: &mut Formatter) -> std::fmt::Result { formatter.write_str( - "either a sequence, or a comma or newline separated string of key=value entries", + "either a sequence, or a comma or newline separated string of key[=value] entries", ) } fn visit_str(self, value: &str) -> Result { - value + Ok(value .split(['\n', ',']) - .map(|s| { - s.split_once('=') - .ok_or_else(|| E::custom(format!("key=value expected, found {s}"))) - .map(|(key, value)| (key.to_owned(), value.to_owned())) + .map(|s| match s.split_once('=') { + Some((key, value)) => (key.to_owned(), Some(value.to_owned())), + None => (s.to_owned(), None), }) - .collect() + .collect()) } fn visit_seq(self, mut seq: A) -> Result @@ -61,10 +60,14 @@ impl<'de, S: BuildHasher + Default> Visitor<'de> for MapVisitor { { let mut ret = HashMap::with_hasher(Default::default()); while let Some(el) = seq.next_element::()? { - let (key, value) = el - .split_once('=') - .ok_or_else(|| A::Error::invalid_value(Unexpected::Str(&el), &self))?; - ret.insert(key.to_owned(), value.to_owned()); + match el.split_once('=') { + None => { + ret.insert(el.to_owned(), None); + } + Some((key, value)) => { + ret.insert(key.to_owned(), Some(value.to_owned())); + } + } } Ok(ret) } @@ -83,7 +86,7 @@ pub(crate) fn deserialize_newline_or_comma_separated_vec< deserializer.deserialize_seq(VectorVisitor(PhantomData)) } -/// deserialize into a map of `String`s to `String`s either of: +/// deserialize into a map of `String`s to `Option`s either of: /// * a sequence of elements serializable into `String`s, or /// * a single element serializable into `String`, then split on `,` and `\n` pub(crate) fn deserialize_newline_or_comma_separated_map< @@ -92,6 +95,6 @@ pub(crate) fn deserialize_newline_or_comma_separated_map< S: BuildHasher + Default, >( deserializer: D, -) -> Result, D::Error> { +) -> Result, S>, D::Error> { deserializer.deserialize_map(MapVisitor(PhantomData)) } diff --git a/rust/extractor/src/generated/.generated.list b/rust/extractor/src/generated/.generated.list index 121c5b5a7aae..9a49da125cfb 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 69c1fcaf0efea87feb898f32fdb7bcb842a22119b69ecedd61c2d946eb7e67de 69c1fcaf0efea87feb898f32fdb7bcb842a22119b69ecedd61c2d946eb7e67de +top.rs 5f63b6fe293fe0b939eed4c38daf938ac312632555acbe3591887140d94477e6 5f63b6fe293fe0b939eed4c38daf938ac312632555acbe3591887140d94477e6 diff --git a/rust/extractor/src/generated/top.rs b/rust/extractor/src/generated/top.rs index fd9b0ca6b91e..58d02787a806 100644 --- a/rust/extractor/src/generated/top.rs +++ b/rust/extractor/src/generated/top.rs @@ -9046,11 +9046,13 @@ pub struct Const { pub id: trap::TrapId, pub attrs: Vec>, pub body: Option>, + pub generic_param_list: Option>, pub is_const: bool, pub is_default: bool, pub name: Option>, pub type_repr: Option>, pub visibility: Option>, + pub where_clause: Option>, } impl trap::TrapEntry for Const { @@ -9066,6 +9068,9 @@ impl trap::TrapEntry for Const { if let Some(v) = self.body { out.add_tuple("const_bodies", vec![id.into(), v.into()]); } + if let Some(v) = self.generic_param_list { + out.add_tuple("const_generic_param_lists", vec![id.into(), v.into()]); + } if self.is_const { out.add_tuple("const_is_const", vec![id.into()]); } @@ -9081,6 +9086,9 @@ impl trap::TrapEntry for Const { if let Some(v) = self.visibility { out.add_tuple("const_visibilities", vec![id.into(), v.into()]); } + if let Some(v) = self.where_clause { + out.add_tuple("const_where_clauses", vec![id.into(), v.into()]); + } } } diff --git a/rust/extractor/src/rust_analyzer.rs b/rust/extractor/src/rust_analyzer.rs index ef4c638efbe6..bed6e66c9b7f 100644 --- a/rust/extractor/src/rust_analyzer.rs +++ b/rust/extractor/src/rust_analyzer.rs @@ -77,11 +77,7 @@ impl<'a> RustAnalyzer<'a> { let editioned_file_id = semantics .attach_first_edition(file_id) .ok_or("failed to determine rust edition")?; - Ok(( - semantics, - EditionedFileId::new(semantics.db, editioned_file_id), - input, - )) + Ok((semantics, editioned_file_id, input)) } } } diff --git a/rust/extractor/src/translate/base.rs b/rust/extractor/src/translate/base.rs index 3ceef6de28a9..e462c1f283ba 100644 --- a/rust/extractor/src/translate/base.rs +++ b/rust/extractor/src/translate/base.rs @@ -216,7 +216,7 @@ impl<'a> Translator<'a> { if let Some(semantics) = self.semantics.as_ref() { let file_range = semantics.original_range(node.syntax()); let file_id = self.file_id?; - if file_id.file_id(semantics.db) == file_range.file_id { + if file_id == file_range.file_id { Some(file_range.range) } else { None @@ -370,20 +370,18 @@ impl<'a> Translator<'a> { if let Some(value) = semantics .hir_file_for(expanded) .macro_file() - .and_then(|macro_file| { - semantics - .db - .parse_macro_expansion_error(macro_file.macro_call_id) - }) + .and_then(|macro_call_id| semantics.db.parse_macro_expansion_error(macro_call_id)) { if let Some(err) = &value.err { let error = err.render_to_string(semantics.db); - - if err.span().anchor.file_id == semantics.hir_file_for(node.syntax()) { + let hir_file_id = semantics.hir_file_for(node.syntax()); + if Some(err.span().anchor.file_id.file_id()) + == hir_file_id.file_id().map(|f| f.file_id(semantics.db)) + { let location = err.span().range + semantics .db - .ast_id_map(err.span().anchor.file_id.into()) + .ast_id_map(hir_file_id) .get_erased(err.span().anchor.ast_id) .text_range() .start(); @@ -435,10 +433,10 @@ impl<'a> Translator<'a> { .as_ref() .and_then(|s| s.expand_macro_call(mcall)) { - self.emit_macro_expansion_parse_errors(mcall, &expanded); + self.emit_macro_expansion_parse_errors(mcall, &expanded.value); let expand_to = ra_ap_hir_expand::ExpandTo::from_call_site(mcall); let kind = expanded.kind(); - if let Some(value) = self.emit_expanded_as(expand_to, expanded) { + if let Some(value) = self.emit_expanded_as(expand_to, expanded.value) { generated::MacroCall::emit_macro_call_expansion( label, value, @@ -741,11 +739,11 @@ impl<'a> Translator<'a> { ) { // work around a bug in rust-analyzer AST generation machinery // this code was inspired by rust-analyzer's own workaround for this: - // https://github.com/rust-lang/rust-analyzer/blob/1f86729f29ea50e8491a1516422df4fd3d1277b0/crates/syntax/src/ast/node_ext.rs#L268-L277 - if item.l_angle_token().is_some() { + // https://github.com/rust-lang/rust-analyzer/blob/a642aa8023be11d6bc027fc6a68c71c2f3fc7f72/crates/syntax/src/ast/node_ext.rs#L290-L297 + if let Some(anchor) = item.type_anchor() { // or // T is any TypeRef, Trait has to be a PathType - let mut type_refs = item + let mut type_refs = anchor .syntax() .children() .filter(|node| ast::Type::can_cast(node.kind())); @@ -763,6 +761,13 @@ impl<'a> Translator<'a> { { generated::PathSegment::emit_trait_type_repr(label, t, &mut self.trap.writer) } + // moreover as we're skipping emission of TypeAnchor, we need to attach its comments to + // this path segment + self.emit_tokens( + &anchor, + label.into(), + anchor.syntax().children_with_tokens(), + ); } } @@ -821,8 +826,8 @@ impl<'a> Translator<'a> { let ExpandResult { value: expanded, .. } = self.semantics.and_then(|s| s.expand_attr_macro(node))?; - self.emit_macro_expansion_parse_errors(node, &expanded); - let macro_items = ast::MacroItems::cast(expanded).or_else(|| { + self.emit_macro_expansion_parse_errors(node, &expanded.value); + let macro_items = ast::MacroItems::cast(expanded.value).or_else(|| { let message = "attribute macro expansion cannot be cast to MacroItems".to_owned(); let location = self.location_for_node(node); self.emit_diagnostic( diff --git a/rust/extractor/src/translate/generated.rs b/rust/extractor/src/translate/generated.rs index be8f23f9cfbe..39efe763a3bb 100644 --- a/rust/extractor/src/translate/generated.rs +++ b/rust/extractor/src/translate/generated.rs @@ -828,20 +828,26 @@ impl Translator<'_> { } else { node.body().and_then(|x| self.emit_expr(&x)) }; + let generic_param_list = node + .generic_param_list() + .and_then(|x| self.emit_generic_param_list(&x)); let is_const = node.const_token().is_some(); let is_default = node.default_token().is_some(); let name = node.name().and_then(|x| self.emit_name(&x)); let type_repr = node.ty().and_then(|x| self.emit_type(&x)); let visibility = node.visibility().and_then(|x| self.emit_visibility(&x)); + let where_clause = node.where_clause().and_then(|x| self.emit_where_clause(&x)); let label = self.trap.emit(generated::Const { id: TrapId::Star, attrs, body, + generic_param_list, is_const, is_default, name, type_repr, visibility, + where_clause, }); self.emit_location(label, node); post_emit!(Const, self, node, label); diff --git a/rust/ql/.generated.list b/rust/ql/.generated.list index 7c60da3abb77..7e2e2dbd5c36 100644 --- a/rust/ql/.generated.list +++ b/rust/ql/.generated.list @@ -38,7 +38,7 @@ lib/codeql/rust/elements/CastExpr.qll 2fe1f36ba31fa29de309baf0a665cfcae67b61c733 lib/codeql/rust/elements/ClosureBinder.qll 02c8e83bf07deaf7bf0233b76623ec7f1837be8b77fe7e1c23544edc7d85e3c4 2b114d9a6dede694324aebe3dac80a802d139cfacd39beb0f12b5b0a46ee6390 lib/codeql/rust/elements/ClosureExpr.qll 67e2a106e9154c90367b129987e574d2a9ecf5b297536627e43706675d35eaed d6a381132ddd589c5a7ce174f50f9620041ddf690e15a65ebfb05ff7e7c02de7 lib/codeql/rust/elements/Comment.qll fedad50575125e9a64a8a8776a8c1dbf1e76df990f01849d9f0955f9d74cb2a6 8eb1afad1e1007a4f0090fdac65d81726b23eda6517d067fd0185f70f17635ab -lib/codeql/rust/elements/Const.qll 8b9c66b59d9469a78b2c696b6e37d915a25f9dd215c0b79b113dc7d34adca9e3 7b8213bf21403a1f8b78ea6a20b716f312b26fee5526111602482a2e985e8ac5 +lib/codeql/rust/elements/Const.qll fd2959d036f47fabcbde9a21c3e173b105168f4944c3cea7c3e8ba4c1f5d6052 c3bde2a8ce4425bd2e20a8a9f96ecf049747935b99a10d35b29ba942e8e44e63 lib/codeql/rust/elements/ConstArg.qll 01865b3be4790c627a062c59ea608462931abcb2f94a132cf265318664fd1251 a2c6bbf63dbfa999e511b6941143a51c9392477d8ccd25e081f85475936ff558 lib/codeql/rust/elements/ConstBlockPat.qll a25f42b84dbeb33e10955735ef53b8bb7e3258522d6d1a9068f19adaf1af89d9 eeb816d2b54db77a1e7bb70e90b68d040a0cd44e9d44455a223311c3615c5e6e lib/codeql/rust/elements/ConstParam.qll 87776586f7ff562ff3c71373f45cf70486f9a832613a0aaac943311c451cc057 67a31616688106d5130951f2162e5229bff0fde08ff647943663cac427d7048b @@ -497,7 +497,7 @@ lib/codeql/rust/elements/internal/generated/CastExpr.qll ddc20054b0b339ad4d40298 lib/codeql/rust/elements/internal/generated/ClosureBinder.qll ab199df96f525a083a0762fd654cd098802033c79700a593bb204a9a0c69ec01 86b33543e0886715830cfcdaca43b555a242a4f12a4caa18b88732d5afb584bd lib/codeql/rust/elements/internal/generated/ClosureExpr.qll 34149bf82f107591e65738221e1407ec1dc9cc0dfb10ae7f761116fda45162de fd2fbc9a87fc0773c940db64013cf784d5e4137515cc1020e2076da329f5a952 lib/codeql/rust/elements/internal/generated/Comment.qll cd1ef861e3803618f9f78a4ac00516d50ecfecdca1c1d14304dc5327cbe07a3b 8b67345aeb15beb5895212228761ea3496297846c93fd2127b417406ae87c201 -lib/codeql/rust/elements/internal/generated/Const.qll 6300d7150d03f6bc2f0b29bb7d4a7bc1381c377644b0c61860733be685bac646 f5299a799a33fa28ca5b6d198f43a80696556144236df39124784211a1ad8285 +lib/codeql/rust/elements/internal/generated/Const.qll e923b540d1dc26cc59766ecd938b8e18f3c73097a73eeaeed3513c8fca7ac3a8 2261a0c46f4252124c40600e7fb2e5743f0e66d58cedc5768fe57393191a9504 lib/codeql/rust/elements/internal/generated/ConstArg.qll c52bf746f2dc89b8d71b8419736707bfcbb09cca424c3ba76e888e2add415bf6 89309a9df4fde23cfd3d8492908ccec4d90cc8457d35c507ef81371a369941b4 lib/codeql/rust/elements/internal/generated/ConstBlockPat.qll 7526d83ee9565d74776f42db58b1a2efff6fb324cfc7137f51f2206fee815d79 0ab3c22908ff790e7092e576a5df3837db33c32a7922a513a0f5e495729c1ac5 lib/codeql/rust/elements/internal/generated/ConstParam.qll 2e24198f636e4932c79f28c324f395ae5f61f713795ed4543e920913898e2815 5abe6d3df395c679c28a7720479bad455c53bc5ade9133f1ff113ea54dc66c11 @@ -577,7 +577,7 @@ lib/codeql/rust/elements/internal/generated/ParamList.qll eaa0cd4402d3665013d47e lib/codeql/rust/elements/internal/generated/ParenExpr.qll 812d2ff65079277f39f15c084657a955a960a7c1c0e96dd60472a58d56b945eb eb8c607f43e1fcbb41f37a10de203a1db806690e10ff4f04d48ed874189cb0eb lib/codeql/rust/elements/internal/generated/ParenPat.qll 24f9dc7fce75827d6fddb856cd48f80168143151b27295c0bab6db5a06567a09 ebadbc6f5498e9ed754b39893ce0763840409a0721036a25b56e1ead7dcc09aa lib/codeql/rust/elements/internal/generated/ParenTypeRepr.qll 03f5c5b96a37adeb845352d7fcea3e098da9050e534972d14ac0f70d60a2d776 ed3d6e5d02086523087adebce4e89e35461eb95f2a66d1d4100fe23fc691b126 -lib/codeql/rust/elements/internal/generated/ParentChild.qll 5278b74de04d54708f078fd813d83ae5f934fa12d420b188c1334e3a7c3b8324 61cf70eb649f241e2fcd5e0ba34df63f3a14f07032811b9ae151721783a0fd20 +lib/codeql/rust/elements/internal/generated/ParentChild.qll 5ebb01358afcbee39cfed2a01a31b1f6d427f70e59e296a458dbe57460bf40b7 fa9ed16272ace82d08ddb8aac7ea3305a868b0f63cf60df6f2125a7dc9f4f870 lib/codeql/rust/elements/internal/generated/ParenthesizedArgList.qll d901fdc8142a5b8847cc98fc2afcfd16428b8ace4fbffb457e761b5fd3901a77 5dbb0aea5a13f937da666ccb042494af8f11e776ade1459d16b70a4dd193f9fb lib/codeql/rust/elements/internal/generated/Pat.qll 3605ac062be2f294ee73336e9669027b8b655f4ad55660e1eab35266275154ee 7f9400db2884d336dd1d21df2a8093759c2a110be9bf6482ce8e80ae0fd74ed4 lib/codeql/rust/elements/internal/generated/Path.qll 9b12afb46fc5a9ad3a811b05472621bbecccb900c47504feb7f29d96b28421ca bcacbffc36fb3e0c9b26523b5963af0ffa9fd6b19f00a2a31bdb2316071546bd @@ -592,7 +592,7 @@ lib/codeql/rust/elements/internal/generated/PtrTypeRepr.qll 8d0ea4f6c7f8203340bf 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 b6e439cc24f8c02fe73301cd2bc16d59dfd28e2a8a201388d8318c43937309e2 62139c3df2f6c4dca1c897b1384233ff0151b7e5fb1c41a178c5e8e41b5e7f05 +lib/codeql/rust/elements/internal/generated/Raw.qll 92c1f49f719ebee9fddb5cd5dded28f768127ffc1e8bb487ece8887bc6608ae6 4c1ad14de73a9998416f121304ef5b58c8e917a980b3f2d795e1d6475f470b0c lib/codeql/rust/elements/internal/generated/RefExpr.qll 7d995884e3dc1c25fc719f5d7253179344d63650e217e9ff6530285fe7a57f64 f2c3c12551deea4964b66553fb9b6423ee16fec53bd63db4796191aa60dc6c66 lib/codeql/rust/elements/internal/generated/RefPat.qll 456ede39837463ee22a630ec7ab6c8630d3664a8ea206fcc6e4f199e92fa564c 5622062765f32930465ba6b170e986706f159f6070f48adee3c20e24e8df4e05 lib/codeql/rust/elements/internal/generated/RefTypeRepr.qll 5b0663a6d234572fb3e467e276d019415caa95ef006438cc59b7af4e1783161e 0e27c8a8f0e323c0e4d6db01fca821bf07c0864d293cdf96fa891b10820c1e4b @@ -748,15 +748,17 @@ test/extractor-tests/generated/ClosureExpr/ClosureExpr_getParam.ql c87b61e80dd62 test/extractor-tests/generated/ClosureExpr/ClosureExpr_getParamList.ql 68ce501516094512dd5bfed42a785474583a91312f704087cba801b02ba7b834 eacbf89d63159e7decfd84c2a1dc5c067dfce56a8157fbb52bc133e9702d266d test/extractor-tests/generated/ClosureExpr/ClosureExpr_getRetType.ql c95bc7306b2d77aa05a6501b6321e6f1e7a48b7ad422ba082635ab20014288ae fe72d44c9819b42fff49b9092a9fb2bfafde6d3b9e4967547fb5298822f30bc3 test/extractor-tests/generated/Comment/Comment.ql 5428b8417a737f88f0d55d87de45c4693d81f03686f03da11dc5369e163d977b 8948c1860cde198d49cff7c74741f554a9e89f8af97bb94de80f3c62e1e29244 -test/extractor-tests/generated/Const/Const.ql 7f9c9ce5b04391ff8f0d419a62972292b1d9811a978cceb129ef5a0f68a02fab c6c1dfa688248310cadd2d6d71d1a70a2b48f5b29ea2078f4dd51db59a0021c0 +test/extractor-tests/generated/Const/Const.ql 8cae77fe63a0a64b2ff2f5e642711aa79ad29fb8705d877e195852ed148af67d 6178c888516d9d24aca14a8fdf1e94043e2a7f85332700c13f368b1e22f2bccb test/extractor-tests/generated/Const/Const_getAttr.ql bd6296dab00065db39663db8d09fe62146838875206ff9d8595d06d6439f5043 34cb55ca6d1f44e27d82a8b624f16f9408bae2485c85da94cc76327eed168577 test/extractor-tests/generated/Const/Const_getAttributeMacroExpansion.ql 82e86399d5cd72621dc8d9cd9f310d3dc7f2ecf208149dab0d202047ccbbd2f8 33df8c5b5044f49ec244e183c61c3b81fabd987f590ba6da4e18e08231343dc8 test/extractor-tests/generated/Const/Const_getBody.ql f50f79b7f42bb1043b79ec96f999fa4740c8014e6969a25812d5d023d7a5a5d8 90e5060ba9757f1021429ed4ec4913bc78747f3fc415456ef7e7fc284b8a0026 test/extractor-tests/generated/Const/Const_getCrateOrigin.ql f042bf15f9bde6c62d129601806c79951a2a131b6388e8df24b1dc5d17fe89f7 7c6decb624f087fda178f87f6609510907d2ed3877b0f36e605e2422b4b13f57 test/extractor-tests/generated/Const/Const_getExtendedCanonicalPath.ql 3300b902e1d1f9928cfe918203b87043e13460cfa5348a8c93712d2e26d61ced 71e7b80d3290f17b1c235adaca2c48ae90eb8b2cb24d4c9e6dc66559daf3824c +test/extractor-tests/generated/Const/Const_getGenericParamList.ql 8bef3c83401a0a203d1e19a4dc652d2285870760cc2032a1b5745fae9fc3f29b 95b2f730daf19eb87b17a3f602ea3a71a1056c8f2a2328d7b46189cc82b29e4c test/extractor-tests/generated/Const/Const_getName.ql b876a1964bbb857fbe8852fb05f589fba947a494f343e8c96a1171e791aa2b5e 83655b1fbc67a4a1704439726c1138bb6784553e35b6ac16250b807e6cd0f40c test/extractor-tests/generated/Const/Const_getTypeRepr.ql 87c5deaa31014c40a035deaf149d76b3aca15c4560c93dd6f4b1ee5f76714baa f3e6b31e4877849792778d4535bd0389f3afd482a6a02f9ceb7e792e46fca83e test/extractor-tests/generated/Const/Const_getVisibility.ql de6b2e9d887316e279b45fab7887980ca7d93fd32c2259f3a06de2b6e2957c12 2f135cdbbb84b43d282131edb7eb4df6caba61bf7421881a49d4679f0f44f661 +test/extractor-tests/generated/Const/Const_getWhereClause.ql 9458b25fd2567c92d1230afb844d81f1f9a9a7b4d164cbdf8b86455ef0d02251 8792f1a5cccaf77f6b1673dd5acd067acfb79f9a8a34a0769e0eb69ab89c9f16 test/extractor-tests/generated/ConstArg/ConstArg.ql f1422b216eb45819ff41f0c19e0f88aa184ddd3fa2984ba22ec46df398147fc3 d2e4f367848c2bc4f6aef51c1dd8180035c39919430082c83f18a3f324228df3 test/extractor-tests/generated/ConstArg/ConstArg_getExpr.ql 317fd83ad51acc3ff3dfab71ebb1385b67d49404c1d7b3804a8ca3c099b84e99 91ecf5ebbfc1aab286dce708680f0be97417f9755676db7479fa6836e50be845 test/extractor-tests/generated/ConstBlockPat/ConstBlockPat.ql ee17b4deba9c503130e3ce565102bc8e181770efcb1309be9c822f0a7ba6fc17 638ed17b5c009e71b31f580c4060ba763bd4208c3984b6c032183ab46a4dd43d diff --git a/rust/ql/.gitattributes b/rust/ql/.gitattributes index 65c3aae0e9e1..e2c5da808143 100644 --- a/rust/ql/.gitattributes +++ b/rust/ql/.gitattributes @@ -756,9 +756,11 @@ /test/extractor-tests/generated/Const/Const_getBody.ql linguist-generated /test/extractor-tests/generated/Const/Const_getCrateOrigin.ql linguist-generated /test/extractor-tests/generated/Const/Const_getExtendedCanonicalPath.ql linguist-generated +/test/extractor-tests/generated/Const/Const_getGenericParamList.ql linguist-generated /test/extractor-tests/generated/Const/Const_getName.ql linguist-generated /test/extractor-tests/generated/Const/Const_getTypeRepr.ql linguist-generated /test/extractor-tests/generated/Const/Const_getVisibility.ql linguist-generated +/test/extractor-tests/generated/Const/Const_getWhereClause.ql linguist-generated /test/extractor-tests/generated/ConstArg/ConstArg.ql linguist-generated /test/extractor-tests/generated/ConstArg/ConstArg_getExpr.ql linguist-generated /test/extractor-tests/generated/ConstBlockPat/ConstBlockPat.ql linguist-generated diff --git a/rust/ql/lib/codeql/rust/elements/Const.qll b/rust/ql/lib/codeql/rust/elements/Const.qll index b4c652076082..cf02e36a43aa 100644 --- a/rust/ql/lib/codeql/rust/elements/Const.qll +++ b/rust/ql/lib/codeql/rust/elements/Const.qll @@ -7,10 +7,12 @@ private import internal.ConstImpl import codeql.rust.elements.AssocItem import codeql.rust.elements.Attr import codeql.rust.elements.Expr +import codeql.rust.elements.GenericParamList import codeql.rust.elements.Item import codeql.rust.elements.Name import codeql.rust.elements.TypeRepr import codeql.rust.elements.Visibility +import codeql.rust.elements.WhereClause /** * A constant item declaration. diff --git a/rust/ql/lib/codeql/rust/elements/internal/generated/Const.qll b/rust/ql/lib/codeql/rust/elements/internal/generated/Const.qll index 29bda01a6fef..5478491492d9 100644 --- a/rust/ql/lib/codeql/rust/elements/internal/generated/Const.qll +++ b/rust/ql/lib/codeql/rust/elements/internal/generated/Const.qll @@ -9,10 +9,12 @@ private import codeql.rust.elements.internal.generated.Raw import codeql.rust.elements.internal.AssocItemImpl::Impl as AssocItemImpl import codeql.rust.elements.Attr import codeql.rust.elements.Expr +import codeql.rust.elements.GenericParamList import codeql.rust.elements.internal.ItemImpl::Impl as ItemImpl import codeql.rust.elements.Name import codeql.rust.elements.TypeRepr import codeql.rust.elements.Visibility +import codeql.rust.elements.WhereClause /** * INTERNAL: This module contains the fully generated definition of `Const` and should not @@ -61,6 +63,21 @@ module Generated { */ final predicate hasBody() { exists(this.getBody()) } + /** + * Gets the generic parameter list of this const, if it exists. + */ + GenericParamList getGenericParamList() { + result = + Synth::convertGenericParamListFromRaw(Synth::convertConstToRaw(this) + .(Raw::Const) + .getGenericParamList()) + } + + /** + * Holds if `getGenericParamList()` exists. + */ + final predicate hasGenericParamList() { exists(this.getGenericParamList()) } + /** * Holds if this const is const. */ @@ -109,6 +126,21 @@ module Generated { */ final predicate hasVisibility() { exists(this.getVisibility()) } + /** + * Gets the where clause of this const, if it exists. + */ + WhereClause getWhereClause() { + result = + Synth::convertWhereClauseFromRaw(Synth::convertConstToRaw(this) + .(Raw::Const) + .getWhereClause()) + } + + /** + * Holds if `getWhereClause()` exists. + */ + final predicate hasWhereClause() { exists(this.getWhereClause()) } + /** * Holds if this constant has an implementation. * 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 5c8e5f868204..3af02bc3897f 100644 --- a/rust/ql/lib/codeql/rust/elements/internal/generated/ParentChild.qll +++ b/rust/ql/lib/codeql/rust/elements/internal/generated/ParentChild.qll @@ -3242,8 +3242,8 @@ private module Impl { private Element getImmediateChildOfConst(Const e, int index, string partialPredicateCall) { exists( - int b, int bAssocItem, int bItem, int n, int nAttr, int nBody, int nName, int nTypeRepr, - int nVisibility + int b, int bAssocItem, int bItem, int n, int nAttr, int nBody, int nGenericParamList, + int nName, int nTypeRepr, int nVisibility, int nWhereClause | b = 0 and bAssocItem = b + 1 + max(int i | i = -1 or exists(getImmediateChildOfAssocItem(e, i, _)) | i) and @@ -3251,9 +3251,11 @@ private module Impl { n = bItem and nAttr = n + 1 + max(int i | i = -1 or exists(e.getAttr(i)) | i) and nBody = nAttr + 1 and - nName = nBody + 1 and + nGenericParamList = nBody + 1 and + nName = nGenericParamList + 1 and nTypeRepr = nName + 1 and nVisibility = nTypeRepr + 1 and + nWhereClause = nVisibility + 1 and ( none() or @@ -3266,11 +3268,19 @@ private module Impl { or index = nAttr and result = e.getBody() and partialPredicateCall = "Body()" or - index = nBody and result = e.getName() and partialPredicateCall = "Name()" + index = nBody and + result = e.getGenericParamList() and + partialPredicateCall = "GenericParamList()" + or + index = nGenericParamList and result = e.getName() and partialPredicateCall = "Name()" or index = nName and result = e.getTypeRepr() and partialPredicateCall = "TypeRepr()" or index = nTypeRepr and result = e.getVisibility() and partialPredicateCall = "Visibility()" + or + index = nVisibility and + result = e.getWhereClause() and + partialPredicateCall = "WhereClause()" ) ) } 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 503691bb83be..e456f2419433 100644 --- a/rust/ql/lib/codeql/rust/elements/internal/generated/Raw.qll +++ b/rust/ql/lib/codeql/rust/elements/internal/generated/Raw.qll @@ -3710,6 +3710,11 @@ module Raw { */ Expr getBody() { const_bodies(this, result) } + /** + * Gets the generic parameter list of this const, if it exists. + */ + GenericParamList getGenericParamList() { const_generic_param_lists(this, result) } + /** * Holds if this const is const. */ @@ -3735,6 +3740,11 @@ module Raw { */ Visibility getVisibility() { const_visibilities(this, result) } + /** + * Gets the where clause of this const, if it exists. + */ + WhereClause getWhereClause() { const_where_clauses(this, result) } + /** * Holds if this constant has an implementation. * diff --git a/rust/ql/lib/rust.dbscheme b/rust/ql/lib/rust.dbscheme index aa9a0bda17c7..1135c62403da 100644 --- a/rust/ql/lib/rust.dbscheme +++ b/rust/ql/lib/rust.dbscheme @@ -2788,6 +2788,12 @@ const_bodies( int body: @expr ref ); +#keyset[id] +const_generic_param_lists( + int id: @const ref, + int generic_param_list: @generic_param_list ref +); + #keyset[id] const_is_const( int id: @const ref @@ -2816,6 +2822,12 @@ const_visibilities( int visibility: @visibility ref ); +#keyset[id] +const_where_clauses( + int id: @const ref, + int where_clause: @where_clause ref +); + #keyset[id] const_has_implementation( int id: @const ref diff --git a/rust/ql/test/extractor-tests/crate_graph/crates.expected b/rust/ql/test/extractor-tests/crate_graph/crates.expected index f934618db9c5..21c662bb425d 100644 --- a/rust/ql/test/extractor-tests/crate_graph/crates.expected +++ b/rust/ql/test/extractor-tests/crate_graph/crates.expected @@ -1,8 +1,8 @@ #-----| 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) +#-----| compiler_builtins -> Crate(compiler_builtins@0.1.146) +#-----| rand -> Crate(rand@0.9.0) +#-----| rand_xorshift -> Crate(rand_xorshift@0.4.0) #-----| Crate(allocator_api2@0.2.21) @@ -16,7 +16,7 @@ #-----| Crate(cfg_if@1.0.0) #-----| core -> Crate(core@0.0.0) -#-----| compiler_builtins -> Crate(compiler_builtins@0.1.140) +#-----| compiler_builtins -> Crate(compiler_builtins@0.1.146) #-----| Crate(cfg_if@1.0.1) #-----| proc_macro -> Crate(proc_macro@0.0.0) @@ -25,12 +25,10 @@ #-----| std -> Crate(std@0.0.0) #-----| test -> Crate(test@0.0.0) -#-----| Crate(compiler_builtins@0.1.140) +#-----| Crate(compiler_builtins@0.1.146) #-----| 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) @@ -67,7 +65,7 @@ #-----| 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) +#-----| compiler_builtins -> Crate(compiler_builtins@0.1.146) #-----| Crate(libc@0.2.169) #-----| rustc_std_workspace_core -> Crate(core@0.0.0) @@ -102,14 +100,14 @@ main.rs: #-----| 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) +#-----| compiler_builtins -> Crate(compiler_builtins@0.1.146) #-----| 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) +#-----| compiler_builtins -> Crate(compiler_builtins@0.1.146) #-----| cfg_if -> Crate(cfg_if@1.0.0) #-----| libc -> Crate(libc@0.2.169) #-----| unwind -> Crate(unwind@0.0.0) @@ -118,27 +116,29 @@ main.rs: #-----| 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@0.9.0) +#-----| zerocopy -> Crate(zerocopy@0.8.17) +#-----| rand_core -> Crate(rand_core@0.9.0) -#-----| Crate(rand_core@0.6.4) +#-----| Crate(rand_core@0.9.0) +#-----| zerocopy -> Crate(zerocopy@0.8.17) -#-----| Crate(rand_xorshift@0.3.0) -#-----| rand_core -> Crate(rand_core@0.6.4) +#-----| Crate(rand_xorshift@0.4.0) +#-----| rand_core -> Crate(rand_core@0.9.0) #-----| Crate(rustc_demangle@0.1.24) #-----| core -> Crate(core@0.0.0) -#-----| compiler_builtins -> Crate(compiler_builtins@0.1.140) +#-----| compiler_builtins -> Crate(compiler_builtins@0.1.146) #-----| 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) +#-----| compiler_builtins -> Crate(compiler_builtins@0.1.146) #-----| 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) +#-----| rand -> Crate(rand@0.9.0) +#-----| rand_xorshift -> Crate(rand_xorshift@0.4.0) #-----| rustc_demangle -> Crate(rustc_demangle@0.1.24) #-----| panic_abort -> Crate(panic_abort@0.0.0) #-----| unwind -> Crate(unwind@0.0.0) @@ -148,7 +148,7 @@ main.rs: #-----| 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) +#-----| compiler_builtins -> Crate(compiler_builtins@0.1.146) #-----| cfg_if -> Crate(cfg_if@1.0.0) #-----| libc -> Crate(libc@0.2.169) @@ -178,11 +178,11 @@ lib.rs: #-----| 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) +#-----| compiler_builtins -> Crate(compiler_builtins@0.1.146) #-----| Crate(unwind@0.0.0) #-----| core -> Crate(core@0.0.0) -#-----| compiler_builtins -> Crate(compiler_builtins@0.1.140) +#-----| compiler_builtins -> Crate(compiler_builtins@0.1.146) #-----| cfg_if -> Crate(cfg_if@1.0.0) #-----| libc -> Crate(libc@0.2.169) @@ -192,3 +192,5 @@ lib.rs: #-----| core -> Crate(core@0.0.0) #-----| std -> Crate(std@0.0.0) #-----| test -> Crate(test@0.0.0) + +#-----| Crate(zerocopy@0.8.17) diff --git a/rust/ql/test/extractor-tests/generated/AsmLabel/AsmLabel.expected b/rust/ql/test/extractor-tests/generated/AsmLabel/AsmLabel.expected index e69de29bb2d1..e77dfa46a42f 100644 --- a/rust/ql/test/extractor-tests/generated/AsmLabel/AsmLabel.expected +++ b/rust/ql/test/extractor-tests/generated/AsmLabel/AsmLabel.expected @@ -0,0 +1 @@ +| gen_asm_label.rs:10:9:10:47 | AsmLabel | hasBlockExpr: | yes | diff --git a/rust/ql/test/extractor-tests/generated/AsmLabel/AsmLabel_getBlockExpr.expected b/rust/ql/test/extractor-tests/generated/AsmLabel/AsmLabel_getBlockExpr.expected index e69de29bb2d1..8f99b753a284 100644 --- a/rust/ql/test/extractor-tests/generated/AsmLabel/AsmLabel_getBlockExpr.expected +++ b/rust/ql/test/extractor-tests/generated/AsmLabel/AsmLabel_getBlockExpr.expected @@ -0,0 +1 @@ +| gen_asm_label.rs:10:9:10:47 | AsmLabel | gen_asm_label.rs:10:15:10:47 | { ... } | diff --git a/rust/ql/test/extractor-tests/generated/ClosureBinder/ClosureBinder.expected b/rust/ql/test/extractor-tests/generated/ClosureBinder/ClosureBinder.expected index e69de29bb2d1..66e669e9e9f8 100644 --- a/rust/ql/test/extractor-tests/generated/ClosureBinder/ClosureBinder.expected +++ b/rust/ql/test/extractor-tests/generated/ClosureBinder/ClosureBinder.expected @@ -0,0 +1 @@ +| gen_closure_binder.rs:7:21:7:43 | ClosureBinder | hasGenericParamList: | yes | diff --git a/rust/ql/test/extractor-tests/generated/ClosureBinder/ClosureBinder_getGenericParamList.expected b/rust/ql/test/extractor-tests/generated/ClosureBinder/ClosureBinder_getGenericParamList.expected index e69de29bb2d1..f3d94f1b8fa5 100644 --- a/rust/ql/test/extractor-tests/generated/ClosureBinder/ClosureBinder_getGenericParamList.expected +++ b/rust/ql/test/extractor-tests/generated/ClosureBinder/ClosureBinder_getGenericParamList.expected @@ -0,0 +1 @@ +| gen_closure_binder.rs:7:21:7:43 | ClosureBinder | gen_closure_binder.rs:7:24:7:43 | <...> | diff --git a/rust/ql/test/extractor-tests/generated/Const/Const.expected b/rust/ql/test/extractor-tests/generated/Const/Const.expected index ceb8669ac838..09c791ffe4f6 100644 --- a/rust/ql/test/extractor-tests/generated/Const/Const.expected +++ b/rust/ql/test/extractor-tests/generated/Const/Const.expected @@ -1 +1 @@ -| gen_const.rs:4:5:7:22 | Const | hasExtendedCanonicalPath: | no | hasCrateOrigin: | no | hasAttributeMacroExpansion: | no | getNumberOfAttrs: | 0 | hasBody: | yes | isConst: | yes | isDefault: | no | hasName: | yes | hasTypeRepr: | yes | hasVisibility: | no | hasImplementation: | yes | +| gen_const.rs:4:5:7:22 | Const | hasExtendedCanonicalPath: | no | hasCrateOrigin: | no | hasAttributeMacroExpansion: | no | getNumberOfAttrs: | 0 | hasBody: | yes | hasGenericParamList: | no | isConst: | yes | isDefault: | no | hasName: | yes | hasTypeRepr: | yes | hasVisibility: | no | hasWhereClause: | no | hasImplementation: | yes | diff --git a/rust/ql/test/extractor-tests/generated/Const/Const.ql b/rust/ql/test/extractor-tests/generated/Const/Const.ql index 0bd52702c245..348f7bec1a6d 100644 --- a/rust/ql/test/extractor-tests/generated/Const/Const.ql +++ b/rust/ql/test/extractor-tests/generated/Const/Const.ql @@ -4,9 +4,9 @@ import TestUtils from Const x, string hasExtendedCanonicalPath, string hasCrateOrigin, - string hasAttributeMacroExpansion, int getNumberOfAttrs, string hasBody, string isConst, - string isDefault, string hasName, string hasTypeRepr, string hasVisibility, - string hasImplementation + string hasAttributeMacroExpansion, int getNumberOfAttrs, string hasBody, + string hasGenericParamList, string isConst, string isDefault, string hasName, string hasTypeRepr, + string hasVisibility, string hasWhereClause, string hasImplementation where toBeTested(x) and not x.isUnknown() and @@ -23,14 +23,16 @@ where ) and getNumberOfAttrs = x.getNumberOfAttrs() and (if x.hasBody() then hasBody = "yes" else hasBody = "no") and + (if x.hasGenericParamList() then hasGenericParamList = "yes" else hasGenericParamList = "no") and (if x.isConst() then isConst = "yes" else isConst = "no") and (if x.isDefault() then isDefault = "yes" else isDefault = "no") and (if x.hasName() then hasName = "yes" else hasName = "no") and (if x.hasTypeRepr() then hasTypeRepr = "yes" else hasTypeRepr = "no") and (if x.hasVisibility() then hasVisibility = "yes" else hasVisibility = "no") and + (if x.hasWhereClause() then hasWhereClause = "yes" else hasWhereClause = "no") and if x.hasImplementation() then hasImplementation = "yes" else hasImplementation = "no" select x, "hasExtendedCanonicalPath:", hasExtendedCanonicalPath, "hasCrateOrigin:", hasCrateOrigin, "hasAttributeMacroExpansion:", hasAttributeMacroExpansion, "getNumberOfAttrs:", getNumberOfAttrs, - "hasBody:", hasBody, "isConst:", isConst, "isDefault:", isDefault, "hasName:", hasName, - "hasTypeRepr:", hasTypeRepr, "hasVisibility:", hasVisibility, "hasImplementation:", - hasImplementation + "hasBody:", hasBody, "hasGenericParamList:", hasGenericParamList, "isConst:", isConst, + "isDefault:", isDefault, "hasName:", hasName, "hasTypeRepr:", hasTypeRepr, "hasVisibility:", + hasVisibility, "hasWhereClause:", hasWhereClause, "hasImplementation:", hasImplementation diff --git a/rust/ql/test/extractor-tests/generated/Const/Const_getGenericParamList.expected b/rust/ql/test/extractor-tests/generated/Const/Const_getGenericParamList.expected new file mode 100644 index 000000000000..e69de29bb2d1 diff --git a/rust/ql/test/extractor-tests/generated/Const/Const_getGenericParamList.ql b/rust/ql/test/extractor-tests/generated/Const/Const_getGenericParamList.ql new file mode 100644 index 000000000000..6c62c3eac408 --- /dev/null +++ b/rust/ql/test/extractor-tests/generated/Const/Const_getGenericParamList.ql @@ -0,0 +1,7 @@ +// generated by codegen, do not edit +import codeql.rust.elements +import TestUtils + +from Const x +where toBeTested(x) and not x.isUnknown() +select x, x.getGenericParamList() diff --git a/rust/ql/test/extractor-tests/generated/Const/Const_getWhereClause.expected b/rust/ql/test/extractor-tests/generated/Const/Const_getWhereClause.expected new file mode 100644 index 000000000000..e69de29bb2d1 diff --git a/rust/ql/test/extractor-tests/generated/Const/Const_getWhereClause.ql b/rust/ql/test/extractor-tests/generated/Const/Const_getWhereClause.ql new file mode 100644 index 000000000000..a6667b9b8d29 --- /dev/null +++ b/rust/ql/test/extractor-tests/generated/Const/Const_getWhereClause.ql @@ -0,0 +1,7 @@ +// generated by codegen, do not edit +import codeql.rust.elements +import TestUtils + +from Const x +where toBeTested(x) and not x.isUnknown() +select x, x.getWhereClause() diff --git a/rust/ql/test/extractor-tests/macro-expansion/CONSISTENCY/ExtractionConsistency.expected b/rust/ql/test/extractor-tests/macro-expansion/CONSISTENCY/ExtractionConsistency.expected new file mode 100644 index 000000000000..82614fc092a9 --- /dev/null +++ b/rust/ql/test/extractor-tests/macro-expansion/CONSISTENCY/ExtractionConsistency.expected @@ -0,0 +1,4 @@ +extractionWarning +| included/included.rs:2:9:2:39 | macro expansion failed: could not resolve macro 'concat' | +| macro_expansion.rs:56:9:56:31 | macro expansion failed: could not resolve macro 'concat' | +| macro_expansion.rs:63:9:63:32 | macro expansion failed: could not resolve macro 'include_str' | diff --git a/rust/ql/test/extractor-tests/macro-expansion/PrintAst.expected b/rust/ql/test/extractor-tests/macro-expansion/PrintAst.expected index a89072531ccc..e92036b352b3 100644 --- a/rust/ql/test/extractor-tests/macro-expansion/PrintAst.expected +++ b/rust/ql/test/extractor-tests/macro-expansion/PrintAst.expected @@ -140,7 +140,6 @@ included/included.rs: # 2| getSegment(): [PathSegment] concat # 2| getIdentifier(): [NameRef] concat # 2| getTokenTree(): [TokenTree] TokenTree -# 2| getMacroCallExpansion(): [StringLiteralExpr] "Hello world!" # 1| getName(): [Name] included # 2| [Comment] //... lib.rs: @@ -655,7 +654,6 @@ macro_expansion.rs: # 56| getSegment(): [PathSegment] concat # 56| getIdentifier(): [NameRef] concat # 56| getTokenTree(): [TokenTree] TokenTree -# 56| getMacroCallExpansion(): [StringLiteralExpr] "<{}>" # 55| getFunction(): [PathExpr] ...::format # 55| getPath(): [Path] ...::format # 55| getQualifier(): [Path] ...::fmt @@ -714,7 +712,6 @@ macro_expansion.rs: # 63| getSegment(): [PathSegment] include_str # 63| getIdentifier(): [NameRef] include_str # 63| getTokenTree(): [TokenTree] TokenTree -# 63| getMacroCallExpansion(): [StringLiteralExpr] "" # 63| getPath(): [Path] doc # 63| getSegment(): [PathSegment] doc # 63| getIdentifier(): [NameRef] doc diff --git a/rust/ql/test/extractor-tests/macro-expansion/test.expected b/rust/ql/test/extractor-tests/macro-expansion/test.expected index 5940c63da2b4..1cfb74870bcf 100644 --- a/rust/ql/test/extractor-tests/macro-expansion/test.expected +++ b/rust/ql/test/extractor-tests/macro-expansion/test.expected @@ -15,7 +15,6 @@ attribute_macros | macro_expansion.rs:31:5:34:5 | fn bzz | 1 | macro_expansion.rs:32:5:33:17 | fn bzz_1 | | macro_expansion.rs:31:5:34:5 | fn bzz | 2 | macro_expansion.rs:32:5:33:17 | fn bzz_2 | macro_calls -| included/included.rs:2:9:2:39 | concat!... | included/included.rs:2:17:2:38 | "Hello world!" | | macro_expansion.rs:5:9:5:34 | concat!... | macro_expansion.rs:5:17:5:34 | "Hello world!" | | macro_expansion.rs:5:9:5:34 | concat!... | macro_expansion.rs:5:17:5:34 | "Hello world!" | | macro_expansion.rs:31:5:31:16 | ...::format_args_nl!... | macro_expansion.rs:31:5:31:16 | FormatArgsExpr | @@ -30,18 +29,22 @@ macro_calls | macro_expansion.rs:44:5:44:13 | def_x!... | macro_expansion.rs:44:5:44:13 | MacroItems | | macro_expansion.rs:53:9:53:25 | concat!... | macro_expansion.rs:53:17:53:24 | "xy" | | macro_expansion.rs:55:9:58:5 | my_macro!... | macro_expansion.rs:56:9:57:13 | MacroExpr | -| macro_expansion.rs:56:9:56:31 | concat!... | macro_expansion.rs:56:17:56:30 | "<{}>" | | macro_expansion.rs:56:9:57:13 | ...::format_args!... | macro_expansion.rs:56:9:57:13 | FormatArgsExpr | | macro_expansion.rs:56:9:57:13 | format!... | macro_expansion.rs:56:9:57:13 | ...::must_use(...) | | macro_expansion.rs:61:1:61:33 | concat!... | macro_expansion.rs:61:1:61:33 | "Hello world!" | | macro_expansion.rs:61:1:61:33 | include!... | macro_expansion.rs:61:1:61:33 | MacroItems | -| macro_expansion.rs:63:9:63:32 | include_str!... | macro_expansion.rs:63:22:63:31 | "" | | macro_expansion.rs:70:16:70:24 | my_int!... | macro_expansion.rs:70:16:70:24 | i32 | | macro_expansion.rs:71:12:71:20 | my_int!... | macro_expansion.rs:71:12:71:20 | i32 | | macro_expansion.rs:72:10:72:18 | my_int!... | macro_expansion.rs:72:10:72:18 | i32 | | macro_expansion.rs:76:14:76:22 | my_int!... | macro_expansion.rs:76:14:76:22 | i32 | | macro_expansion.rs:79:12:79:20 | my_int!... | macro_expansion.rs:79:12:79:20 | i32 | unexpanded_macro_calls +| included/included.rs:2:9:2:39 | concat!... | | macro_expansion.rs:5:9:5:35 | concat!... | | macro_expansion.rs:33:9:33:16 | hello!... | +| macro_expansion.rs:56:9:56:31 | concat!... | +| macro_expansion.rs:63:9:63:32 | include_str!... | warnings +| included/included.rs:2:9:2:39 | macro expansion failed: could not resolve macro 'concat' | +| macro_expansion.rs:56:9:56:31 | macro expansion failed: could not resolve macro 'concat' | +| macro_expansion.rs:63:9:63:32 | macro expansion failed: could not resolve macro 'include_str' | diff --git a/rust/ql/test/library-tests/dataflow/local/CONSISTENCY/PathResolutionConsistency.expected b/rust/ql/test/library-tests/dataflow/local/CONSISTENCY/PathResolutionConsistency.expected index b9ee72e892bd..2595a1c05d1a 100644 --- a/rust/ql/test/library-tests/dataflow/local/CONSISTENCY/PathResolutionConsistency.expected +++ b/rust/ql/test/library-tests/dataflow/local/CONSISTENCY/PathResolutionConsistency.expected @@ -6,6 +6,12 @@ multiplePathResolutions | main.rs:532:10:532:18 | ...::from | file://:0:0:0:0 | fn from | | main.rs:532:10:532:18 | ...::from | file://:0:0:0:0 | fn from | | main.rs:532:10:532:18 | ...::from | file://:0:0:0:0 | fn from | +| main.rs:532:10:532:18 | ...::from | file://:0:0:0:0 | fn from | +| main.rs:532:10:532:18 | ...::from | file://:0:0:0:0 | fn from | +| main.rs:532:10:532:18 | ...::from | file://:0:0:0:0 | fn from | +| main.rs:538:10:538:18 | ...::from | file://:0:0:0:0 | fn from | +| main.rs:538:10:538:18 | ...::from | file://:0:0:0:0 | fn from | +| main.rs:538:10:538:18 | ...::from | file://:0:0:0:0 | fn from | | main.rs:538:10:538:18 | ...::from | file://:0:0:0:0 | fn from | | main.rs:538:10:538:18 | ...::from | file://:0:0:0:0 | fn from | | main.rs:538:10:538:18 | ...::from | file://:0:0:0:0 | fn from | diff --git a/rust/ql/test/library-tests/variables/CONSISTENCY/PathResolutionConsistency.expected b/rust/ql/test/library-tests/variables/CONSISTENCY/PathResolutionConsistency.expected index 82fc38ae2fac..e673be7aa3b7 100644 --- a/rust/ql/test/library-tests/variables/CONSISTENCY/PathResolutionConsistency.expected +++ b/rust/ql/test/library-tests/variables/CONSISTENCY/PathResolutionConsistency.expected @@ -1,3 +1,10 @@ +multipleMethodCallTargets +| main.rs:374:5:374:27 | ... .add_assign(...) | file://:0:0:0:0 | fn add_assign | +| main.rs:374:5:374:27 | ... .add_assign(...) | file://:0:0:0:0 | fn add_assign | +| main.rs:374:5:374:27 | ... .add_assign(...) | file://:0:0:0:0 | fn add_assign | +| main.rs:459:9:459:23 | z.add_assign(...) | file://:0:0:0:0 | fn add_assign | +| main.rs:459:9:459:23 | z.add_assign(...) | file://:0:0:0:0 | fn add_assign | +| main.rs:459:9:459:23 | z.add_assign(...) | file://:0:0:0:0 | fn add_assign | multiplePathResolutions | main.rs:85:19:85:30 | ...::from | file://:0:0:0:0 | fn from | | main.rs:85:19:85:30 | ...::from | file://:0:0:0:0 | fn from | diff --git a/rust/rust-toolchain.toml b/rust/rust-toolchain.toml index 1b61371a926c..680f37655d66 100644 --- a/rust/rust-toolchain.toml +++ b/rust/rust-toolchain.toml @@ -3,6 +3,6 @@ # IMPORTANT: this can also have an impact on QL test results [toolchain] -channel = "1.85" +channel = "1.86" profile = "minimal" components = [ "clippy", "rustfmt", "rust-src" ] diff --git a/rust/schema/ast.py b/rust/schema/ast.py index 17fb872bb8ec..18b1748b5b48 100644 --- a/rust/schema/ast.py +++ b/rust/schema/ast.py @@ -180,11 +180,13 @@ class ClosureExpr(Expr, ): class Const(AssocItem, Item, ): attrs: list["Attr"] | child body: optional["Expr"] | child + generic_param_list: optional["GenericParamList"] | child is_const: predicate is_default: predicate name: optional["Name"] | child type_repr: optional["TypeRepr"] | child visibility: optional["Visibility"] | child + where_clause: optional["WhereClause"] | child class ConstArg(GenericArg, ): expr: optional["Expr"] | child diff --git a/shared/tree-sitter-extractor/Cargo.toml b/shared/tree-sitter-extractor/Cargo.toml index 3bda73a774d2..4cfeae2801b0 100644 --- a/shared/tree-sitter-extractor/Cargo.toml +++ b/shared/tree-sitter-extractor/Cargo.toml @@ -17,11 +17,11 @@ encoding = "0.2" lazy_static = "1.5.0" serde = { version = "1.0", features = ["derive"] } serde_json = "1.0" -chrono = { version = "0.4.40", features = ["serde"] } -num_cpus = "1.16.0" +chrono = { version = "0.4.41", features = ["serde"] } +num_cpus = "1.17.0" zstd = "0.13.3" [dev-dependencies] tree-sitter-ql = "0.23.1" tree-sitter-json = "0.24.8" -rand = "0.9.0" +rand = "0.9.1"