Rust: distinguish [a, b] from [a; b]

This splits the `ArrayExpr` class into `ArrayListExpr` and `ArrayRepeatExpr`.
This uses the `synth.from_class` machinery to integrate seamlessly into the
generated code, by hiding the extracted `ArrayExpr` behind an internal class
and replacing it with a hierarchy of those two classes under a new
`ArrayExpr` class.
This commit is contained in:
Paolo Tranquilli
2024-12-03 15:09:20 +01:00
parent 06b1d8e448
commit 353f1cafe6
49 changed files with 724 additions and 164 deletions

View File

@@ -21,6 +21,7 @@ fn class_name(type_name: &str) -> String {
"Fn" => "Function",
"Literal" => "LiteralExpr",
"Type" => "TypeRef",
"ArrayExpr" => "ArrayExprInternal",
_ => type_name,
};
name.to_owned()
@@ -354,6 +355,13 @@ fn get_fields(node: &AstNodeSrc) -> Vec<FieldInfo> {
is_many: false,
});
}
"ArrayExpr" => {
result.push(FieldInfo {
name: "is_semicolon".to_string(),
tp: "predicate".to_string(),
is_many: true,
});
}
_ => {}
}

View File

@@ -1,2 +1,2 @@
mod.rs 4bcb9def847469aae9d8649461546b7c21ec97cf6e63d3cf394e339915ce65d7 4bcb9def847469aae9d8649461546b7c21ec97cf6e63d3cf394e339915ce65d7
top.rs 272ecf2f56f35211d2449dbf55b1907d8414a8e4cceded03fd12f6f599852c73 272ecf2f56f35211d2449dbf55b1907d8414a8e4cceded03fd12f6f599852c73
top.rs 761143f6f40632476e4bdddb66814720a4fa4b3b655ebad3ea2bfa35161f5ce8 761143f6f40632476e4bdddb66814720a4fa4b3b655ebad3ea2bfa35161f5ce8

View File

@@ -2987,62 +2987,66 @@ impl From<trap::Label<WherePred>> for trap::Label<Locatable> {
}
#[derive(Debug)]
pub struct ArrayExpr {
pub id: trap::TrapId<ArrayExpr>,
pub struct ArrayExprInternal {
pub id: trap::TrapId<ArrayExprInternal>,
pub attrs: Vec<trap::Label<Attr>>,
pub exprs: Vec<trap::Label<Expr>>,
pub is_semicolon: bool,
}
impl trap::TrapEntry for ArrayExpr {
impl trap::TrapEntry for ArrayExprInternal {
fn extract_id(&mut self) -> trap::TrapId<Self> {
std::mem::replace(&mut self.id, trap::TrapId::Star)
}
fn emit(self, id: trap::Label<Self>, out: &mut trap::Writer) {
out.add_tuple("array_exprs", vec![id.into()]);
out.add_tuple("array_expr_internals", vec![id.into()]);
for (i, v) in self.attrs.into_iter().enumerate() {
out.add_tuple("array_expr_attrs", vec![id.into(), i.into(), v.into()]);
out.add_tuple("array_expr_internal_attrs", vec![id.into(), i.into(), v.into()]);
}
for (i, v) in self.exprs.into_iter().enumerate() {
out.add_tuple("array_expr_exprs", vec![id.into(), i.into(), v.into()]);
out.add_tuple("array_expr_internal_exprs", vec![id.into(), i.into(), v.into()]);
}
if self.is_semicolon {
out.add_tuple("array_expr_internal_is_semicolon", vec![id.into()]);
}
}
}
impl trap::TrapClass for ArrayExpr {
fn class_name() -> &'static str { "ArrayExpr" }
impl trap::TrapClass for ArrayExprInternal {
fn class_name() -> &'static str { "ArrayExprInternal" }
}
impl From<trap::Label<ArrayExpr>> for trap::Label<AstNode> {
fn from(value: trap::Label<ArrayExpr>) -> Self {
// SAFETY: this is safe because in the dbscheme ArrayExpr is a subclass of AstNode
impl From<trap::Label<ArrayExprInternal>> for trap::Label<AstNode> {
fn from(value: trap::Label<ArrayExprInternal>) -> Self {
// SAFETY: this is safe because in the dbscheme ArrayExprInternal is a subclass of AstNode
unsafe {
Self::from_untyped(value.as_untyped())
}
}
}
impl From<trap::Label<ArrayExpr>> for trap::Label<Element> {
fn from(value: trap::Label<ArrayExpr>) -> Self {
// SAFETY: this is safe because in the dbscheme ArrayExpr is a subclass of Element
impl From<trap::Label<ArrayExprInternal>> for trap::Label<Element> {
fn from(value: trap::Label<ArrayExprInternal>) -> Self {
// SAFETY: this is safe because in the dbscheme ArrayExprInternal is a subclass of Element
unsafe {
Self::from_untyped(value.as_untyped())
}
}
}
impl From<trap::Label<ArrayExpr>> for trap::Label<Expr> {
fn from(value: trap::Label<ArrayExpr>) -> Self {
// SAFETY: this is safe because in the dbscheme ArrayExpr is a subclass of Expr
impl From<trap::Label<ArrayExprInternal>> for trap::Label<Expr> {
fn from(value: trap::Label<ArrayExprInternal>) -> Self {
// SAFETY: this is safe because in the dbscheme ArrayExprInternal is a subclass of Expr
unsafe {
Self::from_untyped(value.as_untyped())
}
}
}
impl From<trap::Label<ArrayExpr>> for trap::Label<Locatable> {
fn from(value: trap::Label<ArrayExpr>) -> Self {
// SAFETY: this is safe because in the dbscheme ArrayExpr is a subclass of Locatable
impl From<trap::Label<ArrayExprInternal>> for trap::Label<Locatable> {
fn from(value: trap::Label<ArrayExprInternal>) -> Self {
// SAFETY: this is safe because in the dbscheme ArrayExprInternal is a subclass of Locatable
unsafe {
Self::from_untyped(value.as_untyped())
}

View File

@@ -198,16 +198,18 @@ impl Translator<'_> {
label
}
pub(crate) fn emit_array_expr(&mut self, node: ast::ArrayExpr) -> Label<generated::ArrayExpr> {
pub(crate) fn emit_array_expr(&mut self, node: ast::ArrayExpr) -> Label<generated::ArrayExprInternal> {
let attrs = node.attrs().map(|x| self.emit_attr(x)).collect();
let exprs = node.exprs().map(|x| self.emit_expr(x)).collect();
let label = self.trap.emit(generated::ArrayExpr {
let is_semicolon = node.semicolon_token().is_some();
let label = self.trap.emit(generated::ArrayExprInternal {
id: TrapId::Star,
attrs,
exprs,
is_semicolon,
});
self.emit_location(label, &node);
emit_detached!(ArrayExpr, self, node, label);
emit_detached!(ArrayExprInternal, self, node, label);
self.emit_tokens(&node, label.into(), node.syntax().children_with_tokens());
label
}

View File

@@ -1,8 +1,10 @@
lib/codeql/rust/controlflow/internal/generated/CfgNodes.qll a8e083c7d8c4dea6459c5e128e2123f5cf8fd14c076f2256ebda508c13d553cd 16fcc0d34097b0b37a0041281515ca028d2702eec6d9c1d03c39a1158883bdef
lib/codeql/rust/controlflow/internal/generated/CfgNodes.qll 707922d0b7d9718dbe552c3cba830d9ca66673f366f9e86e70137cd739029822 4a133879d2657597dd61f8e4b72944d8d81fb9115fb21488654804d05726911a
lib/codeql/rust/elements/Abi.qll 4c973d28b6d628f5959d1f1cc793704572fd0acaae9a97dfce82ff9d73f73476 250f68350180af080f904cd34cb2af481c5c688dc93edf7365fd0ae99855e893
lib/codeql/rust/elements/Addressable.qll 13011bfd2e1556694c3d440cc34af8527da4df49ad92b62f2939d3699ff2cea5 ddb25935f7553a1a384b1abe2e4b4fa90ab50b952dadec32fd867afcb054f4be
lib/codeql/rust/elements/ArgList.qll 661f5100f5d3ef8351452d9058b663a2a5c720eea8cf11bedd628969741486a2 28e424aac01a90fb58cd6f9f83c7e4cf379eea39e636bc0ba07efc818be71c71
lib/codeql/rust/elements/ArrayExpr.qll a3e6e122632f4011644ec31b37f88b32fe3f2b7e388e7e878a6883309937049f 12ccb5873d95c433da5606fd371d182ef2f71b78d0c53c2d6dec10fa45852bdc
lib/codeql/rust/elements/ArrayExpr.qll 04e5710b083ce29b51e9c9cefd3fa24df5fbf79b0dbaef23b1724d7e708372e5 dd0b89075c985e67aaeb19e1750cc9301f0c1c991232d67a185797dcfe75b223
lib/codeql/rust/elements/ArrayListExpr.qll 451aedcecb479c385ff497588c7a07fda304fd5b873270223a4f2c804e96b245 a8cb008f6f732215623b5626c84b37b651ca01ccafb2cf4c835df35d5140c6ad
lib/codeql/rust/elements/ArrayRepeatExpr.qll d7be62b0840660beffabb5951b40ae1c1b77d1d6bdab9a75ec7f1d456420a1d3 847fc9105a7e1c99e1fbedf4ea7bcd198f3392819b6c1fab9c893c2c06f8a3cd
lib/codeql/rust/elements/ArrayType.qll affd43d308200d60d08e8924cdbb2a17a827ebaa62a296e07bb9ce97451e3c4c 80589a7f79bf2ac293a027faf2589b3027a6c4a286533f2ffccad259a306a8cb
lib/codeql/rust/elements/AsmExpr.qll 2f1c78e92b56d66a559543b2103d8f880dd4fa4c6907346f668b3714cf2355e9 12e174fc469c067c957f6c1a5969ab56a71a07c537ca930a564cce81c7ab4481
lib/codeql/rust/elements/AssocItem.qll 5e514287bbe353d1d637991e7af836e5659ad66922df99af68ab61399e7f8f9a 3733af54938271161ee2720c32ac43228d519b5c46b7cea1e4bbe3dc634f8857
@@ -174,7 +176,10 @@ lib/codeql/rust/elements/internal/AbiImpl.qll 01439712ecadc9dc8da6f74d2e19cee13c
lib/codeql/rust/elements/internal/AddressableImpl.qll e01a6104980960f5708d5a0ada774ba21db9a344e33deeaf3d3239c627268c77 b8bfc711b267df305ac9fe5f6a994f051ddeca7fc95dacd76d1bae2d4fa7adde
lib/codeql/rust/elements/internal/ArgListConstructor.qll a73685c8792ae23a2d628e7357658efb3f6e34006ff6e9661863ef116ec0b015 0bee572a046e8dfc031b1216d729843991519d94ae66280f5e795d20aea07a22
lib/codeql/rust/elements/internal/ArgListImpl.qll 19664651c06b46530f0ae5745ccb3233afc97b9152e053761d641de6e9c62d38 40af167e571f5c255f264b3be7cc7f5ff42ec109661ca03dcee94e92f8facfc6
lib/codeql/rust/elements/internal/ArrayExprConstructor.qll f4ac4efefe5fe4fe1e666f35b1ee92d2243d977b3f3308151c89f61582203c09 4167ae58ec869f7dbd8467093c4a53afd7c1efcf1cc865efa62b4eb484bd7ff8
lib/codeql/rust/elements/internal/ArrayExprImpl.qll b43ef2dc4b3ae6c9d89b61abe41a3723309c341fdc881d8c3264c251d669c321 667ea0b7fccda95365562e4755435af634cc043dd46fe965be0676b8883e3d2a
lib/codeql/rust/elements/internal/ArrayExprInternal.qll 07a219b3d3fba3ff8b18e77686b2f58ab01acd99e0f5d5cad5d91af937e228f5 7528fc0e2064c481f0d6cbff3835950a044e429a2cd00c4d8442d2e132560d37
lib/codeql/rust/elements/internal/ArrayExprInternalConstructor.qll f9756bc40beee99c5e4355bf157030b440c532dff5bdf43e848b3aa1a00fea90 39467f7f313e6f9ede1fe92375ee408098dc65291ca8ee50e36a3684a2767836
lib/codeql/rust/elements/internal/ArrayExprInternalImpl.qll ae4488846c8309b2d4a51d54b36fce0a75107917c0b1f8af5ccf40797f570580 37838c7d6a04b95a16ed46e963d7e56def7a30b5e5ef1ab7e0dfdb5f256fa874
lib/codeql/rust/elements/internal/ArrayTypeConstructor.qll 9e92e6c40df992b4d71ae0e80392e81499604c7586a671b89d31d2d98060380e 76a1915a88f50ffa60bf129237bae2d66cf26d2a9018aca8ccb343929e847531
lib/codeql/rust/elements/internal/ArrayTypeImpl.qll e22d4f4eb21ba1ea44dd53e0c80aa60ec3a42818c1fc2d512c92dc496a6e2cb3 1b4a7347dbb9310ace1e9e3d08c3ba53c1dc441539cebcb4a78f64a58097bc0a
lib/codeql/rust/elements/internal/AsmExprConstructor.qll 36c68023b58beec30af9f05d9d902a4c49faa0206b5528d6aad494a91da07941 4d91b7d30def03e634b92c0d7b99b47c3aadd75f4499f425b80355bc775ea5b6
@@ -414,7 +419,10 @@ lib/codeql/rust/elements/internal/YieldExprImpl.qll af184649a348ddd0be16dee9daae
lib/codeql/rust/elements/internal/generated/Abi.qll 87e1ea6b2a8ebf60e1c69176632740e4e27fc56c3f173939b098ba376562b5fa 94b2121e71c4ec94d53a79f972c05a8484ef0d80ed638f53031e7cf4dc5343d5
lib/codeql/rust/elements/internal/generated/Addressable.qll 96a8b45166dd035b8d2c6d36b8b67019f2d4d0b4ccff6d492677c0c87197613e d8f1ce29feafc8ff7179399fc7eac5db031a7e1a8bc6b2cd75cfce1da3132e9b
lib/codeql/rust/elements/internal/generated/ArgList.qll 1b75b2d7dcf524eb468a0268af6293e9d17832d6bedf3feec49a535824339b57 2bcaf464454bdfdda45fbd24d063f0f1df0eb69f684197b37105adc8f72cd1ea
lib/codeql/rust/elements/internal/generated/ArrayExpr.qll 2ca97b602a707fe2c566002d8709792bb166ae52fdb7da28d7c4b8e0d66dd4bc 1cae1ef017171ec9a1ca28b4f2993b1ee26d22b51b3b04816d9b4e89fdff1fb3
lib/codeql/rust/elements/internal/generated/ArrayExpr.qll 64d194a9a9d6467d123b90f910775ffc28b6c04e44990d6a1af6d1dbb2ec5bf5 ccc6183f9e90a6c11c5f79a068003a7d63db227fa69287d3ac12d48e8af63ac7
lib/codeql/rust/elements/internal/generated/ArrayExprInternal.qll 67a7b0fae04b11cf771727ff39a123fb2d5ce6e2d650d32478fcb33a26ed5688 15833405fa85f6abe0e5146dac283cb5a142a07f08300ccc15a1dae30ed88942
lib/codeql/rust/elements/internal/generated/ArrayListExpr.qll f325163c2bd401286305330482bee20d060cecd24afa9e49deab7ba7e72ca056 ae3f5b303e31fc6c48b38172304ee8dcf3af2b2ba693767824ea8a944b6be0eb
lib/codeql/rust/elements/internal/generated/ArrayRepeatExpr.qll c8da67cf3bd67e1101b6ebc342f0b4ba2d9366c300f2eadeb017efedfcb3b5de 0e6ba406b156b07a4d3c28eca187ff9f90b2ef6a73899c0dc703d69953d49e6a
lib/codeql/rust/elements/internal/generated/ArrayType.qll 225ac477f67865d72b2a2e17420f5e52c25452a3c14f7ff367f873a859f97783 0030e3bf296dd5b69ea912fc85dc7120b060780033083127257cdca792dc3f4b
lib/codeql/rust/elements/internal/generated/AsmExpr.qll b5fef59589c02c17857a4a7f5c7b5efb747a1e98710167efa5c2e88cffd7bcbb b43b297a3b4894e8dd92ef3a23b76f2684c303d41e6030398e69b7754ebea9cd
lib/codeql/rust/elements/internal/generated/AssocItem.qll aa7c06e001b67e4a59476fa7299e09f8da16c93f91aff0ec9812c64386e7c023 0032b45e34e6aba9c4b3d319b108efa0de8ad679b5f254a1ec7c606877ff5e95
@@ -512,7 +520,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 ce24b8f8ecbf0f204af200317405724063887257460c80cf250c39b2fdf37185 e7c87d37e1a0ca7ea03840017e1aa9ddb7f927f1f3b6396c0305b46aeee33db6
lib/codeql/rust/elements/internal/generated/ParenType.qll 9cc954d73f8330dcac7b475f97748b63af5c8766dee9d2f2872c0a7e4c903537 c07534c8a9c683c4a9b11d490095647e420de0a0bfc23273eaf6f31b00244273
lib/codeql/rust/elements/internal/generated/ParentChild.qll db7a782f11a14305acc666c865118475e2d324d2bf5d4110b157e1d488b62b75 3b5d31528d0baa0ceee139097e93461d18503797a1507288dc43428f378500e2
lib/codeql/rust/elements/internal/generated/ParentChild.qll 2a2132e9df63ceeee7e2abbb6b6d9fd62856ae93d113b60ae7d8311d4c9535be b7aaa62c085e71c2dff42e7f2886770c48d964dfe45981c2857af4b9126a8a7b
lib/codeql/rust/elements/internal/generated/Pat.qll 3605ac062be2f294ee73336e9669027b8b655f4ad55660e1eab35266275154ee 7f9400db2884d336dd1d21df2a8093759c2a110be9bf6482ce8e80ae0fd74ed4
lib/codeql/rust/elements/internal/generated/Path.qll 4c1c8e840ed57880e574142b081b11d7a7428a009f10e3aa8f4645e211f6b2e0 989668cf0f1bdee7557e2f97c01e41d2a56848227fed41477833f5fc1e1d35f6
lib/codeql/rust/elements/internal/generated/PathExpr.qll 2096e3c1db22ee488a761690adabfc9cfdea501c99f7c5d96c0019cb113fc506 54245ce0449c4e263173213df01e079d5168a758503a5dbd61b25ad35a311140
@@ -522,10 +530,10 @@ lib/codeql/rust/elements/internal/generated/PathSegment.qll 0fa07886deb0fc4d909d
lib/codeql/rust/elements/internal/generated/PathType.qll df6fd322ba0d99d6cb315edce8dbf099b661b84fdfcc3ad629fdd1fd066c1986 e11c8615cd7b02034b47b58f30a7b6fcbc6d33ec53303288dfd34d9a25f5a186
lib/codeql/rust/elements/internal/generated/PrefixExpr.qll c9ede5f2deb7b41bc8240969e8554f645057018fe96e7e9ad9c2924c8b14722b 5ae2e3c3dc8fa73e7026ef6534185afa6b0b5051804435d8b741dd3640c864e1
lib/codeql/rust/elements/internal/generated/PtrType.qll 40099c5a4041314b66932dfd777c9e2bef90a0711fb8d7c2c2cec764c003ac4a cf8297d93557356a572223d3e8acca701837c4b1f54e8d4351ba195fb7ed27f8
lib/codeql/rust/elements/internal/generated/PureSynthConstructors.qll ea294a3ba33fd1bc632046c4fedbcb84dcb961a8e4599969d65893b19d90e590 ea294a3ba33fd1bc632046c4fedbcb84dcb961a8e4599969d65893b19d90e590
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 efd93730de217cf50dcba5875595263a5eadf9f7e4e1272401342a094d158614 229b251b3d118932e31e78ac4dfb75f48b766f240f20d436062785606d44467b
lib/codeql/rust/elements/internal/generated/Raw.qll 7de290d66bd594f4c5b5a296502792e803e9f1084bb2616d9774196e33b16c87 28150fdd3cff3bb49b407f0c2119602be13e78cbb1f8fd749edd31f5d9772f7a
lib/codeql/rust/elements/internal/generated/Raw.qll bb1c4724c3d702a189b41c2d56fa0ce89b957d99daece3229443625f20f7a427 6ace458b3b15e2dc887d11d9b18aebfd27201730ee763076cfe9ec3434a46c12
lib/codeql/rust/elements/internal/generated/RecordExpr.qll eb6cb662e463f9260efae1a6ce874fa781172063b916ef1963f861e9942d308d 1a21cbccc8f3799ff13281e822818ebfb21d81591720a427cac3625512cb9d40
lib/codeql/rust/elements/internal/generated/RecordExprField.qll 7e9f8663d3b74ebbc9603b10c9912f082febba6bd73d344b100bbd3edf837802 fbe6b578e7fd5d5a6f21bbb8c388957ab7210a6a249ec71510a50fb35b319ea1
lib/codeql/rust/elements/internal/generated/RecordExprFieldList.qll 179a97211fe7aa6265085d4d54115cdbc0e1cd7c9b2135591e8f36d6432f13d3 dd44bbbc1e83a1ed3a587afb729d7debf7aeb7b63245de181726af13090e50c0
@@ -551,8 +559,8 @@ lib/codeql/rust/elements/internal/generated/Static.qll 5fbd6879858cf356d4bdaa6da
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 65873a7fa44e223edc5e76cc768591a036eb2550960a6b6882476f43a01aefba 3e08e2bdfba53ae26d8f48f2d240b92b44c603f03105518c37a963e0cbe63e3f
lib/codeql/rust/elements/internal/generated/SynthConstructors.qll e929c49ea60810a2bbc19ad38110b8bbaf21db54dae90393b21a3459a54abf6f e929c49ea60810a2bbc19ad38110b8bbaf21db54dae90393b21a3459a54abf6f
lib/codeql/rust/elements/internal/generated/Synth.qll d5358d9ac151c7e5940dbc3c2e3ddbabbb3160d9ea9ba8e8879d7e0b459bf871 1365f2db99d8aae7188197f840efc7c457f63b1ed8b1366974104d8470295069
lib/codeql/rust/elements/internal/generated/SynthConstructors.qll 410b2360c1469a655e1a8c7586add83477d129fcb53f61d438502bf43dfb4af2 410b2360c1469a655e1a8c7586add83477d129fcb53f61d438502bf43dfb4af2
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
@@ -586,14 +594,15 @@ lib/codeql/rust/elements/internal/generated/WhileExpr.qll 7edf1f23fbf953a2baabcd
lib/codeql/rust/elements/internal/generated/WildcardPat.qll d74b70b57a0a66bfae017a329352a5b27a6b9e73dd5521d627f680e810c6c59e 4b913b548ba27ff3c82fcd32cf996ff329cb57d176d3bebd0fcef394486ea499
lib/codeql/rust/elements/internal/generated/YeetExpr.qll cac328200872a35337b4bcb15c851afb4743f82c080f9738d295571eb01d7392 94af734eea08129b587fed849b643e7572800e8330c0b57d727d41abda47930b
lib/codeql/rust/elements/internal/generated/YieldExpr.qll 37e5f0c1e373a22bbc53d8b7f2c0e1f476e5be5080b8437c5e964f4e83fad79a 4a9a68643401637bf48e5c2b2f74a6bf0ddcb4ff76f6bffb61d436b685621e85
lib/codeql/rust/elements.qll ced76fbeebc6e2e972ecaed65ef97851f90a215cf330f28a0f31a253f1c03442 ced76fbeebc6e2e972ecaed65ef97851f90a215cf330f28a0f31a253f1c03442
lib/codeql/rust/elements.qll c5dabb77abc45a329a4b90c80e421383e558ca33bb6392350a1ce6c7bea84adb c5dabb77abc45a329a4b90c80e421383e558ca33bb6392350a1ce6c7bea84adb
test/extractor-tests/generated/Abi/Abi.ql 7f6e7dc4af86eca3ebdc79b10373988cd0871bd78b51997d3cffd969105e5fdd 2f936b6ca005c6157c755121584410c03e4a3949c23bee302fbe05ee10ce118f
test/extractor-tests/generated/Abi/Abi_getAbiString.ql a496762fcec5a0887b87023bbf93e9b650f02e20113e25c44d6e4281ae8f5335 14109c7ce11ba25e3cd6e7f1b3fcb4cb00622f2a4eac91bfe43145c5f366bc52
test/extractor-tests/generated/ArgList/ArgList.ql e412927756e72165d0e7c5c9bd3fca89d08197bbf760db8fb7683c64bb2229bc 043dba8506946fbb87753e22c387987d7eded6ddb963aa067f9e60ef9024d684
test/extractor-tests/generated/ArgList/ArgList_getArg.ql c07c946218489a0ad5fe89e5fd4a7f0ad84a73dc2e650729f48a340cb133be84 ff2382c0693f47e5eb1290aca325290e60c19d877b25b1d7e2ee96009f5fe934
test/extractor-tests/generated/ArrayExpr/ArrayExpr.ql fd4e504678714c99a987069e5013bda04313573cec2bab31b74bc4559bb73d7f 0b63120b61964a215ec451793a1b5aef525882484ad62193d7635b5a370881d4
test/extractor-tests/generated/ArrayExpr/ArrayExpr_getAttr.ql ce143c8b416c35270cca839848baf6d8cda74251f3717314e0f332fcb74a9259 c86d282153feee3facad752ed0fc1638be0cbaafca4ec620f337ad61b694cade
test/extractor-tests/generated/ArrayExpr/ArrayExpr_getExpr.ql e8b7e24db6fc6098131fea1053430920b2e2f33d2aa52b10d2ff29b9efd70a88 a52b6b2476104695b395d86bbd1a99068372ca56989ea94b150055e664ba034a
test/extractor-tests/generated/ArrayListExpr/ArrayListExpr.ql 5b6c0d3f9c75e2cfde4fbe6dc443cb992e91925ba108664b04b88f9567322c28 01b891665f2c8a98770e4b4ac284aafc0d680dbaa10ad54a7799eda62048e21a
test/extractor-tests/generated/ArrayListExpr/ArrayListExpr_getExpr.ql 6920b532623e8c919701a83a059d9b1aac9e8673e7fdbe26e0a8af5ad6a34b8a 601137c715ce947d79f39d5b131d7ab167a16d29477eacdb1380cd647c4ebac4
test/extractor-tests/generated/ArrayRepeatExpr/ArrayRepeatExpr.ql cdf73db3b37a9b98a1c63c51bdca9691fcd16f952ce8730385240b7194c55819 8dc29fb0db5df4c4cdd87b406cea92e6e6602908d087af16037a2dec6f9204b8
test/extractor-tests/generated/ArrayRepeatExpr/ArrayRepeatExpr_getExpr.ql 6b00037350fc36cc46345a290bda4c4d4ff99050b970d23eb94294313046a884 0687638b46e43bba9dda35d78ff7b40f976e5e38271eec77e7a21c28349dc42c
test/extractor-tests/generated/ArrayType/ArrayType.ql d781ea647d60218777261d82230bd85f989a4768a043e736d268363b5a777390 b5c7fa0aa1b8b1f3a82b8af7254bf20efd3477bba83ad53530959d1733636604
test/extractor-tests/generated/ArrayType/ArrayType_getConstArg.ql b6a250873bc2d553219b8301a15bd19a4044f590085992c532a800bf3ab744cb 5e6b9dbbe2d3ea7f6fa3fba4811517a528d5eb58169b69d1b9113e1508c6e627
test/extractor-tests/generated/ArrayType/ArrayType_getTy.ql 1c23613e509ada3ffc1f727d0db7c5955dbc104d886fe5f9d8f39413b54d16b0 a662d234e1e54159d931a873f20ed8953d9b27778c7a6ca898f86b31d1dae0cc

17
rust/ql/.gitattributes generated vendored
View File

@@ -5,6 +5,8 @@
/lib/codeql/rust/elements/Addressable.qll linguist-generated
/lib/codeql/rust/elements/ArgList.qll linguist-generated
/lib/codeql/rust/elements/ArrayExpr.qll linguist-generated
/lib/codeql/rust/elements/ArrayListExpr.qll linguist-generated
/lib/codeql/rust/elements/ArrayRepeatExpr.qll linguist-generated
/lib/codeql/rust/elements/ArrayType.qll linguist-generated
/lib/codeql/rust/elements/AsmExpr.qll linguist-generated
/lib/codeql/rust/elements/AssocItem.qll linguist-generated
@@ -176,7 +178,10 @@
/lib/codeql/rust/elements/internal/AddressableImpl.qll linguist-generated
/lib/codeql/rust/elements/internal/ArgListConstructor.qll linguist-generated
/lib/codeql/rust/elements/internal/ArgListImpl.qll linguist-generated
/lib/codeql/rust/elements/internal/ArrayExprConstructor.qll linguist-generated
/lib/codeql/rust/elements/internal/ArrayExprImpl.qll linguist-generated
/lib/codeql/rust/elements/internal/ArrayExprInternal.qll linguist-generated
/lib/codeql/rust/elements/internal/ArrayExprInternalConstructor.qll linguist-generated
/lib/codeql/rust/elements/internal/ArrayExprInternalImpl.qll linguist-generated
/lib/codeql/rust/elements/internal/ArrayTypeConstructor.qll linguist-generated
/lib/codeql/rust/elements/internal/ArrayTypeImpl.qll linguist-generated
/lib/codeql/rust/elements/internal/AsmExprConstructor.qll linguist-generated
@@ -417,6 +422,9 @@
/lib/codeql/rust/elements/internal/generated/Addressable.qll linguist-generated
/lib/codeql/rust/elements/internal/generated/ArgList.qll linguist-generated
/lib/codeql/rust/elements/internal/generated/ArrayExpr.qll linguist-generated
/lib/codeql/rust/elements/internal/generated/ArrayExprInternal.qll linguist-generated
/lib/codeql/rust/elements/internal/generated/ArrayListExpr.qll linguist-generated
/lib/codeql/rust/elements/internal/generated/ArrayRepeatExpr.qll linguist-generated
/lib/codeql/rust/elements/internal/generated/ArrayType.qll linguist-generated
/lib/codeql/rust/elements/internal/generated/AsmExpr.qll linguist-generated
/lib/codeql/rust/elements/internal/generated/AssocItem.qll linguist-generated
@@ -593,9 +601,10 @@
/test/extractor-tests/generated/Abi/Abi_getAbiString.ql linguist-generated
/test/extractor-tests/generated/ArgList/ArgList.ql linguist-generated
/test/extractor-tests/generated/ArgList/ArgList_getArg.ql linguist-generated
/test/extractor-tests/generated/ArrayExpr/ArrayExpr.ql linguist-generated
/test/extractor-tests/generated/ArrayExpr/ArrayExpr_getAttr.ql linguist-generated
/test/extractor-tests/generated/ArrayExpr/ArrayExpr_getExpr.ql linguist-generated
/test/extractor-tests/generated/ArrayListExpr/ArrayListExpr.ql linguist-generated
/test/extractor-tests/generated/ArrayListExpr/ArrayListExpr_getExpr.ql linguist-generated
/test/extractor-tests/generated/ArrayRepeatExpr/ArrayRepeatExpr.ql linguist-generated
/test/extractor-tests/generated/ArrayRepeatExpr/ArrayRepeatExpr_getExpr.ql linguist-generated
/test/extractor-tests/generated/ArrayType/ArrayType.ql linguist-generated
/test/extractor-tests/generated/ArrayType/ArrayType_getConstArg.ql linguist-generated
/test/extractor-tests/generated/ArrayType/ArrayType_getTy.ql linguist-generated

View File

@@ -81,7 +81,7 @@ module MakeCfgNodes<LocationSig Loc, InputSig<Loc> Input> {
}
/**
* An array expression. For example:
* The base class for array expressions. For example:
* ```rust
* [1, 2, 3];
* [1; 10];
@@ -95,21 +95,6 @@ module MakeCfgNodes<LocationSig Loc, InputSig<Loc> Input> {
/** Gets the underlying `ArrayExpr`. */
ArrayExpr getArrayExpr() { result = node }
/**
* Gets the `index`th attr of this array expression (0-based).
*/
Attr getAttr(int index) { result = node.getAttr(index) }
/**
* Gets any of the attrs of this array expression.
*/
Attr getAnAttr() { result = this.getAttr(_) }
/**
* Gets the number of attrs of this array expression.
*/
int getNumberOfAttrs() { result = count(int i | exists(this.getAttr(i))) }
/**
* Gets the `index`th expression of this array expression (0-based).
*/
@@ -128,6 +113,64 @@ module MakeCfgNodes<LocationSig Loc, InputSig<Loc> Input> {
int getNumberOfExprs() { result = count(int i | exists(this.getExpr(i))) }
}
final private class ParentArrayListExpr extends ParentAstNode, ArrayListExpr {
override predicate relevantChild(AstNode child) { none() }
}
/**
* An array expression with a list of elements. For example:
* ```rust
* [1, 2, 3];
* ```
*/
final class ArrayListExprCfgNode extends CfgNodeFinal, ArrayExprCfgNode {
private ArrayListExpr node;
ArrayListExprCfgNode() { node = this.getAstNode() }
/** Gets the underlying `ArrayListExpr`. */
ArrayListExpr getArrayListExpr() { result = node }
}
final private class ParentArrayRepeatExpr extends ParentAstNode, ArrayRepeatExpr {
override predicate relevantChild(AstNode child) {
none()
or
child = this.getRepeatOperand()
or
child = this.getRepeatLength()
}
}
/**
* An array expression with a repeat oeprand and a repeat length. For example:
* ```rust
* [1; 10];
* ```
*/
final class ArrayRepeatExprCfgNode extends CfgNodeFinal, ArrayExprCfgNode {
private ArrayRepeatExpr node;
ArrayRepeatExprCfgNode() { node = this.getAstNode() }
/** Gets the underlying `ArrayRepeatExpr`. */
ArrayRepeatExpr getArrayRepeatExpr() { result = node }
/**
* Gets the repeat operand of this array repeat expression.
*/
ExprCfgNode getRepeatOperand() {
any(ChildMapping mapping).hasCfgChild(node, node.getRepeatOperand(), this, result)
}
/**
* Gets the repeat length of this array repeat expression.
*/
ExprCfgNode getRepeatLength() {
any(ChildMapping mapping).hasCfgChild(node, node.getRepeatLength(), this, result)
}
}
final private class ParentAsmExpr extends ParentAstNode, AsmExpr {
override predicate relevantChild(AstNode child) {
none()
@@ -3127,6 +3170,30 @@ module MakeCfgNodes<LocationSig Loc, InputSig<Loc> Input> {
cfgNode
)
or
pred = "getRepeatOperand" and
parent =
any(Nodes::ArrayRepeatExprCfgNode cfgNode, ArrayRepeatExpr astNode |
astNode = cfgNode.getArrayRepeatExpr() and
child = getDesugared(astNode.getRepeatOperand()) and
i = -1 and
hasCfgNode(child) and
not child = cfgNode.getRepeatOperand().getAstNode()
|
cfgNode
)
or
pred = "getRepeatLength" and
parent =
any(Nodes::ArrayRepeatExprCfgNode cfgNode, ArrayRepeatExpr astNode |
astNode = cfgNode.getArrayRepeatExpr() and
child = getDesugared(astNode.getRepeatLength()) and
i = -1 and
hasCfgNode(child) and
not child = cfgNode.getRepeatLength().getAstNode()
|
cfgNode
)
or
pred = "getExpr" and
parent =
any(Nodes::AsmExprCfgNode cfgNode, AsmExpr astNode |

View File

@@ -7,6 +7,8 @@ import codeql.rust.elements.Abi
import codeql.rust.elements.Addressable
import codeql.rust.elements.ArgList
import codeql.rust.elements.ArrayExpr
import codeql.rust.elements.ArrayListExpr
import codeql.rust.elements.ArrayRepeatExpr
import codeql.rust.elements.ArrayType
import codeql.rust.elements.AsmExpr
import codeql.rust.elements.AssocItem

View File

@@ -4,11 +4,10 @@
*/
private import internal.ArrayExprImpl
import codeql.rust.elements.Attr
import codeql.rust.elements.Expr
/**
* An array expression. For example:
* The base class for array expressions. For example:
* ```rust
* [1, 2, 3];
* [1; 10];

View File

@@ -0,0 +1,15 @@
// generated by codegen, do not edit
/**
* This module provides the public class `ArrayListExpr`.
*/
private import internal.ArrayListExprImpl
import codeql.rust.elements.ArrayExpr
/**
* An array expression with a list of elements. For example:
* ```rust
* [1, 2, 3];
* ```
*/
final class ArrayListExpr = Impl::ArrayListExpr;

View File

@@ -0,0 +1,16 @@
// generated by codegen, do not edit
/**
* This module provides the public class `ArrayRepeatExpr`.
*/
private import internal.ArrayRepeatExprImpl
import codeql.rust.elements.ArrayExpr
import codeql.rust.elements.Expr
/**
* An array expression with a repeat oeprand and a repeat length. For example:
* ```rust
* [1; 10];
* ```
*/
final class ArrayRepeatExpr = Impl::ArrayRepeatExpr;

View File

@@ -1,14 +0,0 @@
// 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
* `ArrayExpr` synthesized instances.
* INTERNAL: Do not use.
*/
private import codeql.rust.elements.internal.generated.Raw
/**
* The characteristic predicate of `ArrayExpr` synthesized instances.
* INTERNAL: Do not use.
*/
predicate constructArrayExpr(Raw::ArrayExpr id) { any() }

View File

@@ -1,3 +1,4 @@
// generated by codegen, remove this comment if you wish to edit this file
/**
* This module provides a hand-modifiable wrapper around the generated class `ArrayExpr`.
*
@@ -11,15 +12,12 @@ private import codeql.rust.elements.internal.generated.ArrayExpr
* be referenced directly.
*/
module Impl {
// the following QLdoc is generated: if you need to edit it, do it in the schema file
/**
* An array expression. For example:
* The base class for array expressions. For example:
* ```rust
* [1, 2, 3];
* [1; 10];
* ```
*/
class ArrayExpr extends Generated::ArrayExpr {
override string toString() { result = "[...]" }
}
class ArrayExpr extends Generated::ArrayExpr { }
}

View File

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

View File

@@ -0,0 +1,17 @@
// 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
* `ArrayExprInternal` synthesized instances.
* INTERNAL: Do not use.
*/
private import codeql.rust.elements.internal.generated.Raw
private import codeql.rust.elements.internal.generated.PureSynthConstructors
/**
* The characteristic predicate of `ArrayExprInternal` synthesized instances.
* INTERNAL: Do not use.
*/
predicate constructArrayExprInternal(Raw::ArrayExprInternal id) {
not constructArrayListExpr(id) and not constructArrayRepeatExpr(id)
}

View File

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

View File

@@ -0,0 +1,13 @@
/**
* This module defines the hook used internally to tweak the characteristic predicate of
* `ArrayListExpr` synthesized instances.
* INTERNAL: Do not use.
*/
private import codeql.rust.elements.internal.generated.Raw
/**
* The characteristic predicate of `ArrayListExpr` synthesized instances.
* INTERNAL: Do not use.
*/
predicate constructArrayListExpr(Raw::ArrayExprInternal id) { not id.isSemicolon() }

View File

@@ -0,0 +1,34 @@
/**
* This module provides a hand-modifiable wrapper around the generated class `ArrayListExpr`.
*
* INTERNAL: Do not use.
*/
private import codeql.rust.elements.internal.generated.ArrayListExpr
private import codeql.rust.elements.internal.generated.Raw
private import codeql.rust.elements.internal.generated.Synth
private import codeql.rust.elements.Expr
/**
* INTERNAL: This module contains the customizable definition of `ArrayListExpr` and should not
* be referenced directly.
*/
module Impl {
// the following QLdoc is generated: if you need to edit it, do it in the schema file
/**
* An array expression with a list of elements. For example:
* ```rust
* [1, 2, 3];
* ```
*/
class ArrayListExpr extends Generated::ArrayListExpr {
cached
private Raw::ArrayExprInternal getUnderlyingEntity() { this = Synth::TArrayListExpr(result) }
override string toString() { result = "[...]" }
override Expr getExpr(int index) {
result = Synth::convertExprFromRaw(this.getUnderlyingEntity().getExpr(index))
}
}
}

View File

@@ -0,0 +1,13 @@
/**
* This module defines the hook used internally to tweak the characteristic predicate of
* `ArrayRepeatExpr` synthesized instances.
* INTERNAL: Do not use.
*/
private import codeql.rust.elements.internal.generated.Raw
/**
* The characteristic predicate of `ArrayRepeatExpr` synthesized instances.
* INTERNAL: Do not use.
*/
predicate constructArrayRepeatExpr(Raw::ArrayExprInternal id) { id.isSemicolon() }

View File

@@ -0,0 +1,41 @@
/**
* This module provides a hand-modifiable wrapper around the generated class `ArrayRepeatExpr`.
*
* INTERNAL: Do not use.
*/
private import codeql.rust.elements.internal.generated.ArrayRepeatExpr
private import codeql.rust.elements.internal.generated.Raw
private import codeql.rust.elements.internal.generated.Synth
/**
* INTERNAL: This module contains the customizable definition of `ArrayRepeatExpr` and should not
* be referenced directly.
*/
module Impl {
// the following QLdoc is generated: if you need to edit it, do it in the schema file
/**
* An array expression with a repeat oeprand and a repeat length. For example:
* ```rust
* [1; 10];
* ```
*/
class ArrayRepeatExpr extends Generated::ArrayRepeatExpr {
cached
private Raw::ArrayExprInternal getUnderlyingEntity() { this = Synth::TArrayRepeatExpr(result) }
override string toString() {
result =
"[" + this.getRepeatOperand().toAbbreviatedString() + "; " +
this.getRepeatLength().toAbbreviatedString() + "]"
}
override Expr getRepeatOperand() { result = this.getExpr(0) }
override Expr getRepeatLength() { result = this.getExpr(1) }
override Expr getExpr(int index) {
result = Synth::convertExprFromRaw(this.getUnderlyingEntity().getExpr(index))
}
}
}

View File

@@ -6,7 +6,6 @@
private import codeql.rust.elements.internal.generated.Synth
private import codeql.rust.elements.internal.generated.Raw
import codeql.rust.elements.Attr
import codeql.rust.elements.Expr
import codeql.rust.elements.internal.ExprImpl::Impl as ExprImpl
@@ -16,7 +15,7 @@ import codeql.rust.elements.internal.ExprImpl::Impl as ExprImpl
*/
module Generated {
/**
* An array expression. For example:
* The base class for array expressions. For example:
* ```rust
* [1, 2, 3];
* [1; 10];
@@ -25,33 +24,10 @@ module Generated {
* Use the subclass `ArrayExpr`, where the following predicates are available.
*/
class ArrayExpr extends Synth::TArrayExpr, ExprImpl::Expr {
override string getAPrimaryQlClass() { result = "ArrayExpr" }
/**
* Gets the `index`th attr of this array expression (0-based).
*/
Attr getAttr(int index) {
result =
Synth::convertAttrFromRaw(Synth::convertArrayExprToRaw(this).(Raw::ArrayExpr).getAttr(index))
}
/**
* Gets any of the attrs of this array expression.
*/
final Attr getAnAttr() { result = this.getAttr(_) }
/**
* Gets the number of attrs of this array expression.
*/
final int getNumberOfAttrs() { result = count(int i | exists(this.getAttr(i))) }
/**
* Gets the `index`th expression of this array expression (0-based).
*/
Expr getExpr(int index) {
result =
Synth::convertExprFromRaw(Synth::convertArrayExprToRaw(this).(Raw::ArrayExpr).getExpr(index))
}
Expr getExpr(int index) { none() }
/**
* Gets any of the expressions of this array expression.

View File

@@ -0,0 +1,72 @@
// generated by codegen, do not edit
/**
* This module provides the generated definition of `ArrayExprInternal`.
* 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.Attr
import codeql.rust.elements.Expr
import codeql.rust.elements.internal.ExprImpl::Impl as ExprImpl
/**
* INTERNAL: This module contains the fully generated definition of `ArrayExprInternal` and should not
* be referenced directly.
*/
module Generated {
/**
* INTERNAL: Do not reference the `Generated::ArrayExprInternal` class directly.
* Use the subclass `ArrayExprInternal`, where the following predicates are available.
*/
class ArrayExprInternal extends Synth::TArrayExprInternal, ExprImpl::Expr {
override string getAPrimaryQlClass() { result = "ArrayExprInternal" }
/**
* Gets the `index`th attr of this array expression internal (0-based).
*/
Attr getAttr(int index) {
result =
Synth::convertAttrFromRaw(Synth::convertArrayExprInternalToRaw(this)
.(Raw::ArrayExprInternal)
.getAttr(index))
}
/**
* Gets any of the attrs of this array expression internal.
*/
final Attr getAnAttr() { result = this.getAttr(_) }
/**
* Gets the number of attrs of this array expression internal.
*/
final int getNumberOfAttrs() { result = count(int i | exists(this.getAttr(i))) }
/**
* Gets the `index`th expression of this array expression internal (0-based).
*/
Expr getExpr(int index) {
result =
Synth::convertExprFromRaw(Synth::convertArrayExprInternalToRaw(this)
.(Raw::ArrayExprInternal)
.getExpr(index))
}
/**
* Gets any of the expressions of this array expression internal.
*/
final Expr getAnExpr() { result = this.getExpr(_) }
/**
* Gets the number of expressions of this array expression internal.
*/
final int getNumberOfExprs() { result = count(int i | exists(this.getExpr(i))) }
/**
* Holds if this array expression internal is semicolon.
*/
predicate isSemicolon() {
Synth::convertArrayExprInternalToRaw(this).(Raw::ArrayExprInternal).isSemicolon()
}
}
}

View File

@@ -0,0 +1,27 @@
// generated by codegen, do not edit
/**
* This module provides the generated definition of `ArrayListExpr`.
* 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.internal.ArrayExprImpl::Impl as ArrayExprImpl
/**
* INTERNAL: This module contains the fully generated definition of `ArrayListExpr` and should not
* be referenced directly.
*/
module Generated {
/**
* An array expression with a list of elements. For example:
* ```rust
* [1, 2, 3];
* ```
* INTERNAL: Do not reference the `Generated::ArrayListExpr` class directly.
* Use the subclass `ArrayListExpr`, where the following predicates are available.
*/
class ArrayListExpr extends Synth::TArrayListExpr, ArrayExprImpl::ArrayExpr {
override string getAPrimaryQlClass() { result = "ArrayListExpr" }
}
}

View File

@@ -0,0 +1,38 @@
// generated by codegen, do not edit
/**
* This module provides the generated definition of `ArrayRepeatExpr`.
* 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.internal.ArrayExprImpl::Impl as ArrayExprImpl
import codeql.rust.elements.Expr
/**
* INTERNAL: This module contains the fully generated definition of `ArrayRepeatExpr` and should not
* be referenced directly.
*/
module Generated {
/**
* An array expression with a repeat oeprand and a repeat length. For example:
* ```rust
* [1; 10];
* ```
* INTERNAL: Do not reference the `Generated::ArrayRepeatExpr` class directly.
* Use the subclass `ArrayRepeatExpr`, where the following predicates are available.
*/
class ArrayRepeatExpr extends Synth::TArrayRepeatExpr, ArrayExprImpl::ArrayExpr {
override string getAPrimaryQlClass() { result = "ArrayRepeatExpr" }
/**
* Gets the repeat operand of this array repeat expression.
*/
Expr getRepeatOperand() { none() }
/**
* Gets the repeat length of this array repeat expression.
*/
Expr getRepeatLength() { none() }
}
}

View File

@@ -4,6 +4,7 @@
*/
import codeql.rust.elements
import codeql.rust.elements.internal.ArrayExprInternal
private module Impl {
private Element getImmediateChildOfElement(Element e, int index, string partialPredicateCall) {
@@ -1189,6 +1190,25 @@ private module Impl {
}
private Element getImmediateChildOfArrayExpr(ArrayExpr e, int index, string partialPredicateCall) {
exists(int b, int bExpr, int n, int nExpr |
b = 0 and
bExpr = b + 1 + max(int i | i = -1 or exists(getImmediateChildOfExpr(e, i, _)) | i) and
n = bExpr and
nExpr = n + 1 + max(int i | i = -1 or exists(e.getExpr(i)) | i) and
(
none()
or
result = getImmediateChildOfExpr(e, index - b, partialPredicateCall)
or
result = e.getExpr(index - n) and
partialPredicateCall = "Expr(" + (index - n).toString() + ")"
)
)
}
private Element getImmediateChildOfArrayExprInternal(
ArrayExprInternal e, int index, string partialPredicateCall
) {
exists(int b, int bExpr, int n, int nAttr, int nExpr |
b = 0 and
bExpr = b + 1 + max(int i | i = -1 or exists(getImmediateChildOfExpr(e, i, _)) | i) and
@@ -2785,6 +2805,44 @@ private module Impl {
)
}
private Element getImmediateChildOfArrayListExpr(
ArrayListExpr e, int index, string partialPredicateCall
) {
exists(int b, int bArrayExpr, int n |
b = 0 and
bArrayExpr = b + 1 + max(int i | i = -1 or exists(getImmediateChildOfArrayExpr(e, i, _)) | i) and
n = bArrayExpr and
(
none()
or
result = getImmediateChildOfArrayExpr(e, index - b, partialPredicateCall)
)
)
}
private Element getImmediateChildOfArrayRepeatExpr(
ArrayRepeatExpr e, int index, string partialPredicateCall
) {
exists(int b, int bArrayExpr, int n, int nRepeatOperand, int nRepeatLength |
b = 0 and
bArrayExpr = b + 1 + max(int i | i = -1 or exists(getImmediateChildOfArrayExpr(e, i, _)) | i) and
n = bArrayExpr and
nRepeatOperand = n + 1 and
nRepeatLength = nRepeatOperand + 1 and
(
none()
or
result = getImmediateChildOfArrayExpr(e, index - b, partialPredicateCall)
or
index = n and result = e.getRepeatOperand() and partialPredicateCall = "RepeatOperand()"
or
index = nRepeatOperand and
result = e.getRepeatLength() and
partialPredicateCall = "RepeatLength()"
)
)
}
private Element getImmediateChildOfBlockExpr(BlockExpr e, int index, string partialPredicateCall) {
exists(int b, int bLabelableExpr, int n, int nAttr, int nStmtList |
b = 0 and
@@ -3694,7 +3752,7 @@ private module Impl {
or
result = getImmediateChildOfWherePred(e, index, partialAccessor)
or
result = getImmediateChildOfArrayExpr(e, index, partialAccessor)
result = getImmediateChildOfArrayExprInternal(e, index, partialAccessor)
or
result = getImmediateChildOfArrayType(e, index, partialAccessor)
or
@@ -3844,6 +3902,10 @@ private module Impl {
or
result = getImmediateChildOfYieldExpr(e, index, partialAccessor)
or
result = getImmediateChildOfArrayListExpr(e, index, partialAccessor)
or
result = getImmediateChildOfArrayRepeatExpr(e, index, partialAccessor)
or
result = getImmediateChildOfBlockExpr(e, index, partialAccessor)
or
result = getImmediateChildOfCallExpr(e, index, partialAccessor)

View File

@@ -3,6 +3,8 @@
* This module exports all modules providing `Element` subclasses.
*/
import codeql.rust.elements.internal.ArrayListExprConstructor
import codeql.rust.elements.internal.ArrayRepeatExprConstructor
import codeql.rust.elements.internal.FormatConstructor
import codeql.rust.elements.internal.FormatArgumentConstructor
import codeql.rust.elements.internal.FormatTemplateVariableAccessConstructor

View File

@@ -1104,24 +1104,24 @@ module Raw {
/**
* INTERNAL: Do not use.
* An array expression. For example:
* ```rust
* [1, 2, 3];
* [1; 10];
* ```
*/
class ArrayExpr extends @array_expr, Expr {
override string toString() { result = "ArrayExpr" }
class ArrayExprInternal extends @array_expr_internal, Expr {
override string toString() { result = "ArrayExprInternal" }
/**
* Gets the `index`th attr of this array expression (0-based).
* Gets the `index`th attr of this array expression internal (0-based).
*/
Attr getAttr(int index) { array_expr_attrs(this, index, result) }
Attr getAttr(int index) { array_expr_internal_attrs(this, index, result) }
/**
* Gets the `index`th expression of this array expression (0-based).
* Gets the `index`th expression of this array expression internal (0-based).
*/
Expr getExpr(int index) { array_expr_exprs(this, index, result) }
Expr getExpr(int index) { array_expr_internal_exprs(this, index, result) }
/**
* Holds if this array expression internal is semicolon.
*/
predicate isSemicolon() { array_expr_internal_is_semicolon(this) }
}
/**

View File

@@ -25,7 +25,15 @@ module Synth {
/**
* INTERNAL: Do not use.
*/
TArrayExpr(Raw::ArrayExpr id) { constructArrayExpr(id) } or
TArrayExprInternal(Raw::ArrayExprInternal id) { constructArrayExprInternal(id) } or
/**
* INTERNAL: Do not use.
*/
TArrayListExpr(Raw::ArrayExprInternal id) { constructArrayListExpr(id) } or
/**
* INTERNAL: Do not use.
*/
TArrayRepeatExpr(Raw::ArrayExprInternal id) { constructArrayRepeatExpr(id) } or
/**
* INTERNAL: Do not use.
*/
@@ -616,6 +624,11 @@ module Synth {
*/
class TAddressable = TItem or TVariant;
/**
* INTERNAL: Do not use.
*/
class TArrayExpr = TArrayListExpr or TArrayRepeatExpr;
/**
* INTERNAL: Do not use.
*/
@@ -650,8 +663,8 @@ module Synth {
* INTERNAL: Do not use.
*/
class TExpr =
TArrayExpr or TAsmExpr or TAwaitExpr or TBecomeExpr or TBinaryExpr or TBreakExpr or
TCallExprBase or TCastExpr or TClosureExpr or TContinueExpr or TFieldExpr or
TArrayExpr or TArrayExprInternal or TAsmExpr or TAwaitExpr or TBecomeExpr or TBinaryExpr or
TBreakExpr or TCallExprBase or TCastExpr or TClosureExpr or TContinueExpr or TFieldExpr or
TFormatArgsExpr or TIfExpr or TIndexExpr or TLabelableExpr or TLetExpr or TLiteralExpr or
TMacroExpr or TMatchExpr or TOffsetOfExpr or TParenExpr or TPathExprBase or TPrefixExpr or
TRangeExpr or TRecordExpr or TRefExpr or TReturnExpr or TTryExpr or TTupleExpr or
@@ -760,9 +773,23 @@ module Synth {
/**
* INTERNAL: Do not use.
* Converts a raw element to a synthesized `TArrayExpr`, if possible.
* Converts a raw element to a synthesized `TArrayExprInternal`, if possible.
*/
TArrayExpr convertArrayExprFromRaw(Raw::Element e) { result = TArrayExpr(e) }
TArrayExprInternal convertArrayExprInternalFromRaw(Raw::Element e) {
result = TArrayExprInternal(e)
}
/**
* INTERNAL: Do not use.
* Converts a raw element to a synthesized `TArrayListExpr`, if possible.
*/
TArrayListExpr convertArrayListExprFromRaw(Raw::Element e) { result = TArrayListExpr(e) }
/**
* INTERNAL: Do not use.
* Converts a raw element to a synthesized `TArrayRepeatExpr`, if possible.
*/
TArrayRepeatExpr convertArrayRepeatExprFromRaw(Raw::Element e) { result = TArrayRepeatExpr(e) }
/**
* INTERNAL: Do not use.
@@ -1644,6 +1671,16 @@ module Synth {
result = convertVariantFromRaw(e)
}
/**
* INTERNAL: Do not use.
* Converts a raw DB element to a synthesized `TArrayExpr`, if possible.
*/
TArrayExpr convertArrayExprFromRaw(Raw::Element e) {
result = convertArrayListExprFromRaw(e)
or
result = convertArrayRepeatExprFromRaw(e)
}
/**
* INTERNAL: Do not use.
* Converts a raw DB element to a synthesized `TAssocItem`, if possible.
@@ -1815,6 +1852,8 @@ module Synth {
TExpr convertExprFromRaw(Raw::Element e) {
result = convertArrayExprFromRaw(e)
or
result = convertArrayExprInternalFromRaw(e)
or
result = convertAsmExprFromRaw(e)
or
result = convertAwaitExprFromRaw(e)
@@ -2146,9 +2185,23 @@ module Synth {
/**
* INTERNAL: Do not use.
* Converts a synthesized `TArrayExpr` to a raw DB element, if possible.
* Converts a synthesized `TArrayExprInternal` to a raw DB element, if possible.
*/
Raw::Element convertArrayExprToRaw(TArrayExpr e) { e = TArrayExpr(result) }
Raw::Element convertArrayExprInternalToRaw(TArrayExprInternal e) {
e = TArrayExprInternal(result)
}
/**
* INTERNAL: Do not use.
* Converts a synthesized `TArrayListExpr` to a raw DB element, if possible.
*/
Raw::Element convertArrayListExprToRaw(TArrayListExpr e) { e = TArrayListExpr(result) }
/**
* INTERNAL: Do not use.
* Converts a synthesized `TArrayRepeatExpr` to a raw DB element, if possible.
*/
Raw::Element convertArrayRepeatExprToRaw(TArrayRepeatExpr e) { e = TArrayRepeatExpr(result) }
/**
* INTERNAL: Do not use.
@@ -3028,6 +3081,16 @@ module Synth {
result = convertVariantToRaw(e)
}
/**
* INTERNAL: Do not use.
* Converts a synthesized `TArrayExpr` to a raw DB element, if possible.
*/
Raw::Element convertArrayExprToRaw(TArrayExpr e) {
result = convertArrayListExprToRaw(e)
or
result = convertArrayRepeatExprToRaw(e)
}
/**
* INTERNAL: Do not use.
* Converts a synthesized `TAssocItem` to a raw DB element, if possible.
@@ -3199,6 +3262,8 @@ module Synth {
Raw::Element convertExprToRaw(TExpr e) {
result = convertArrayExprToRaw(e)
or
result = convertArrayExprInternalToRaw(e)
or
result = convertAsmExprToRaw(e)
or
result = convertAwaitExprToRaw(e)

View File

@@ -5,7 +5,9 @@
import codeql.rust.elements.internal.AbiConstructor
import codeql.rust.elements.internal.ArgListConstructor
import codeql.rust.elements.internal.ArrayExprConstructor
import codeql.rust.elements.internal.ArrayExprInternalConstructor
import codeql.rust.elements.internal.ArrayListExprConstructor
import codeql.rust.elements.internal.ArrayRepeatExprConstructor
import codeql.rust.elements.internal.ArrayTypeConstructor
import codeql.rust.elements.internal.AsmExprConstructor
import codeql.rust.elements.internal.AssocItemListConstructor

View File

@@ -303,7 +303,7 @@ closure_binder_generic_param_lists(
);
@expr =
@array_expr
@array_expr_internal
| @asm_expr
| @await_expr
| @become_expr
@@ -1087,24 +1087,29 @@ where_pred_type_bound_lists(
int type_bound_list: @type_bound_list ref
);
array_exprs(
unique int id: @array_expr
array_expr_internals(
unique int id: @array_expr_internal
);
#keyset[id, index]
array_expr_attrs(
int id: @array_expr ref,
array_expr_internal_attrs(
int id: @array_expr_internal ref,
int index: int ref,
int attr: @attr ref
);
#keyset[id, index]
array_expr_exprs(
int id: @array_expr ref,
array_expr_internal_exprs(
int id: @array_expr_internal ref,
int index: int ref,
int expr: @expr ref
);
#keyset[id]
array_expr_internal_is_semicolon(
int id: @array_expr_internal ref
);
array_types(
unique int id: @array_type
);

View File

@@ -1,6 +1,7 @@
Abi/gen_abi.rs 5d2f6eccb2bab86080188be9700ab64a34fa6e8e8e7b08f65a5c97d1de0a900c 5d2f6eccb2bab86080188be9700ab64a34fa6e8e8e7b08f65a5c97d1de0a900c
ArgList/gen_arg_list.rs 569d0b9b0479de5453ae0f89e4f90e32b02ee84dfb3d815821d722ece6f75b64 569d0b9b0479de5453ae0f89e4f90e32b02ee84dfb3d815821d722ece6f75b64
ArrayExpr/gen_array_expr.rs e4863b428ea2b5cfd59773f201e58fd905f7363512e54e4fdebd02c297bd85ff e4863b428ea2b5cfd59773f201e58fd905f7363512e54e4fdebd02c297bd85ff
ArrayListExpr/gen_array_list_expr.rs 99a1233b77a6b6eb0a538025688ca5a0824118a123bef0fe3f92a81834b17924 99a1233b77a6b6eb0a538025688ca5a0824118a123bef0fe3f92a81834b17924
ArrayRepeatExpr/gen_array_repeat_expr.rs 2d3ed378b055681b71efda5c50989d2465c8b4210bd1ad52a05d68c55aaa61e2 2d3ed378b055681b71efda5c50989d2465c8b4210bd1ad52a05d68c55aaa61e2
ArrayType/gen_array_type.rs 3cb5f35006648d676ead1088aa330cd34beaabaaad7b9aa952e6375bc1cec5cb 3cb5f35006648d676ead1088aa330cd34beaabaaad7b9aa952e6375bc1cec5cb
AsmExpr/gen_asm_expr.rs 00b21fd66fe12785174bd0160d0317a6c78ff05dbba73313eb07b56531cf3158 00b21fd66fe12785174bd0160d0317a6c78ff05dbba73313eb07b56531cf3158
AssocTypeArg/gen_assoc_type_arg.rs 00ec0e22c4d73338de605dc3b1b1306bc83a95f87376ce976f08d2f9923cc2b4 00ec0e22c4d73338de605dc3b1b1306bc83a95f87376ce976f08d2f9923cc2b4

View File

@@ -2,7 +2,8 @@
/.gitattributes linguist-generated
/Abi/gen_abi.rs linguist-generated
/ArgList/gen_arg_list.rs linguist-generated
/ArrayExpr/gen_array_expr.rs linguist-generated
/ArrayListExpr/gen_array_list_expr.rs linguist-generated
/ArrayRepeatExpr/gen_array_repeat_expr.rs linguist-generated
/ArrayType/gen_array_type.rs linguist-generated
/AsmExpr/gen_asm_expr.rs linguist-generated
/AssocTypeArg/gen_assoc_type_arg.rs linguist-generated

View File

@@ -1,2 +0,0 @@
| gen_array_expr.rs:5:5:5:13 | [...] | getNumberOfAttrs: | 0 | getNumberOfExprs: | 3 |
| gen_array_expr.rs:6:5:6:11 | [...] | getNumberOfAttrs: | 0 | getNumberOfExprs: | 2 |

View File

@@ -1,11 +0,0 @@
// generated by codegen, do not edit
import codeql.rust.elements
import TestUtils
from ArrayExpr x, int getNumberOfAttrs, int getNumberOfExprs
where
toBeTested(x) and
not x.isUnknown() and
getNumberOfAttrs = x.getNumberOfAttrs() and
getNumberOfExprs = x.getNumberOfExprs()
select x, "getNumberOfAttrs:", getNumberOfAttrs, "getNumberOfExprs:", getNumberOfExprs

View File

@@ -1,5 +0,0 @@
| gen_array_expr.rs:5:5:5:13 | [...] | 0 | gen_array_expr.rs:5:6:5:6 | 1 |
| gen_array_expr.rs:5:5:5:13 | [...] | 1 | gen_array_expr.rs:5:9:5:9 | 2 |
| gen_array_expr.rs:5:5:5:13 | [...] | 2 | gen_array_expr.rs:5:12:5:12 | 3 |
| gen_array_expr.rs:6:5:6:11 | [...] | 0 | gen_array_expr.rs:6:6:6:6 | 1 |
| gen_array_expr.rs:6:5:6:11 | [...] | 1 | gen_array_expr.rs:6:9:6:10 | 10 |

View File

@@ -1,7 +0,0 @@
// generated by codegen, do not edit
fn test_array_expr() -> () {
// An array expression. For example:
[1, 2, 3];
[1; 10];
}

View File

@@ -0,0 +1 @@
| gen_array_list_expr.rs:5:5:5:13 | [...] | getNumberOfExprs: | 3 |

View File

@@ -0,0 +1,10 @@
// generated by codegen, do not edit
import codeql.rust.elements
import TestUtils
from ArrayListExpr x, int getNumberOfExprs
where
toBeTested(x) and
not x.isUnknown() and
getNumberOfExprs = x.getNumberOfExprs()
select x, "getNumberOfExprs:", getNumberOfExprs

View File

@@ -0,0 +1,3 @@
| gen_array_list_expr.rs:5:5:5:13 | [...] | 0 | gen_array_list_expr.rs:5:6:5:6 | 1 |
| gen_array_list_expr.rs:5:5:5:13 | [...] | 1 | gen_array_list_expr.rs:5:9:5:9 | 2 |
| gen_array_list_expr.rs:5:5:5:13 | [...] | 2 | gen_array_list_expr.rs:5:12:5:12 | 3 |

View File

@@ -2,6 +2,6 @@
import codeql.rust.elements
import TestUtils
from ArrayExpr x, int index
from ArrayListExpr x, int index
where toBeTested(x) and not x.isUnknown()
select x, index, x.getExpr(index)

View File

@@ -0,0 +1,6 @@
// generated by codegen, do not edit
fn test_array_list_expr() -> () {
// An array expression with a list of elements. For example:
[1, 2, 3];
}

View File

@@ -0,0 +1 @@
| gen_array_repeat_expr.rs:5:5:5:11 | [1; 10] | getNumberOfExprs: | 2 | getRepeatOperand: | gen_array_repeat_expr.rs:5:6:5:6 | 1 | getRepeatLength: | gen_array_repeat_expr.rs:5:9:5:10 | 10 |

View File

@@ -0,0 +1,13 @@
// generated by codegen, do not edit
import codeql.rust.elements
import TestUtils
from ArrayRepeatExpr x, int getNumberOfExprs, Expr getRepeatOperand, Expr getRepeatLength
where
toBeTested(x) and
not x.isUnknown() and
getNumberOfExprs = x.getNumberOfExprs() and
getRepeatOperand = x.getRepeatOperand() and
getRepeatLength = x.getRepeatLength()
select x, "getNumberOfExprs:", getNumberOfExprs, "getRepeatOperand:", getRepeatOperand,
"getRepeatLength:", getRepeatLength

View File

@@ -0,0 +1,2 @@
| gen_array_repeat_expr.rs:5:5:5:11 | [1; 10] | 0 | gen_array_repeat_expr.rs:5:6:5:6 | 1 |
| gen_array_repeat_expr.rs:5:5:5:11 | [1; 10] | 1 | gen_array_repeat_expr.rs:5:9:5:10 | 10 |

View File

@@ -2,6 +2,6 @@
import codeql.rust.elements
import TestUtils
from ArrayExpr x, int index
from ArrayRepeatExpr x, int index
where toBeTested(x) and not x.isUnknown()
select x, index, x.getAttr(index)
select x, index, x.getExpr(index)

View File

@@ -0,0 +1,6 @@
// generated by codegen, do not edit
fn test_array_repeat_expr() -> () {
// An array expression with a repeat oeprand and a repeat length. For example:
[1; 10];
}

View File

@@ -550,15 +550,44 @@ class _:
"""
@annotate(ArrayExpr, cfg = True)
@annotate(ArrayExprInternal)
@ql.internal
@qltest.skip
class _:
pass
class ArrayExpr(Expr):
"""
An array expression. For example:
The base class for array expressions. For example:
```rust
[1, 2, 3];
[1; 10];
```
"""
exprs: list[Expr] | child
@synth.from_class(ArrayExprInternal)
class ArrayListExpr(ArrayExpr):
"""
An array expression with a list of elements. For example:
```rust
[1, 2, 3];
```
"""
__cfg__ = True
@synth.from_class(ArrayExprInternal)
class ArrayRepeatExpr(ArrayExpr):
"""
An array expression with a repeat oeprand and a repeat length. For example:
```rust
[1; 10];
```
"""
__cfg__ = True
repeat_operand: Expr | child
repeat_length: Expr | child
@annotate(LiteralExpr, cfg = True)

3
rust/schema/ast.py generated
View File

@@ -38,9 +38,10 @@ class Abi(AstNode):
class ArgList(AstNode):
args: list["Expr"] | child
class ArrayExpr(Expr):
class ArrayExprInternal(Expr):
attrs: list["Attr"] | child
exprs: list["Expr"] | child
is_semicolon: predicate
class ArrayType(TypeRef):
const_arg: optional["ConstArg"] | child