From cbae16b3928ad1770fa55ec06d69d5fb9534e4de Mon Sep 17 00:00:00 2001 From: Paolo Tranquilli Date: Tue, 25 Feb 2025 13:29:17 +0100 Subject: [PATCH] Rust: rerun code generation --- rust/extractor/src/generated/.generated.list | 2 +- rust/extractor/src/generated/top.rs | 4 ++++ rust/extractor/src/translate/generated.rs | 2 ++ rust/ql/.generated.list | 11 ++++++----- rust/ql/.gitattributes | 1 + rust/ql/lib/codeql/rust/elements/RecordField.qll | 1 + .../elements/internal/generated/ParentChild.qll | 11 ++++++++--- .../rust/elements/internal/generated/Raw.qll | 5 +++++ .../elements/internal/generated/RecordField.qll | 14 ++++++++++++++ rust/ql/lib/rust.dbscheme | 6 ++++++ .../generated/RecordField/RecordField.ql | 9 ++++++--- .../generated/RecordField/RecordField_getExpr.ql | 7 +++++++ rust/schema/ast.py | 1 + 13 files changed, 62 insertions(+), 12 deletions(-) create mode 100644 rust/ql/test/extractor-tests/generated/RecordField/RecordField_getExpr.ql diff --git a/rust/extractor/src/generated/.generated.list b/rust/extractor/src/generated/.generated.list index 6aaea33eac5..528da1d5671 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 18702be33d768cc6f723201fce8c2bf2125df192c0336db9711a99f8fa7b074f 18702be33d768cc6f723201fce8c2bf2125df192c0336db9711a99f8fa7b074f +top.rs da0f43b99d3a173520048275597e2b052a7351f6fcb2ad5fc912257976742bb7 da0f43b99d3a173520048275597e2b052a7351f6fcb2ad5fc912257976742bb7 diff --git a/rust/extractor/src/generated/top.rs b/rust/extractor/src/generated/top.rs index fe5a9cd8ee3..2774193823a 100644 --- a/rust/extractor/src/generated/top.rs +++ b/rust/extractor/src/generated/top.rs @@ -2185,6 +2185,7 @@ impl From> for trap::Label { pub struct RecordField { pub id: trap::TrapId, pub attrs: Vec>, + pub expr: Option>, pub name: Option>, pub type_repr: Option>, pub visibility: Option>, @@ -2200,6 +2201,9 @@ impl trap::TrapEntry for RecordField { for (i, v) in self.attrs.into_iter().enumerate() { out.add_tuple("record_field_attrs", vec![id.into(), i.into(), v.into()]); } + if let Some(v) = self.expr { + out.add_tuple("record_field_exprs", vec![id.into(), v.into()]); + } if let Some(v) = self.name { out.add_tuple("record_field_names", vec![id.into(), v.into()]); } diff --git a/rust/extractor/src/translate/generated.rs b/rust/extractor/src/translate/generated.rs index dc4828e078f..249027eefa9 100644 --- a/rust/extractor/src/translate/generated.rs +++ b/rust/extractor/src/translate/generated.rs @@ -1849,12 +1849,14 @@ impl Translator<'_> { pub(crate) fn emit_record_field(&mut self, node: ast::RecordField) -> Option> { if self.should_be_excluded(&node) { return None; } let attrs = node.attrs().filter_map(|x| self.emit_attr(x)).collect(); + let expr = node.expr().and_then(|x| self.emit_expr(x)); 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 label = self.trap.emit(generated::RecordField { id: TrapId::Star, attrs, + expr, name, type_repr, visibility, diff --git a/rust/ql/.generated.list b/rust/ql/.generated.list index c8195b8a766..6e7a2892a41 100644 --- a/rust/ql/.generated.list +++ b/rust/ql/.generated.list @@ -131,7 +131,7 @@ lib/codeql/rust/elements/RangePat.qll b5c0cfc84b8a767d58593fa7102dcf4be3ff8b02ba lib/codeql/rust/elements/RecordExpr.qll b8541a33ef408f2070103c1db8b6ec845bc6b1d8c810f5d8d208e5eeb9f86b30 a6d9602a64c9acf48f033f06fe7e1d86382512fd378ee3044f1126726847f696 lib/codeql/rust/elements/RecordExprField.qll edac04146849e2aeca27e7bbb896c21aa2e2b15736b1e8a06ac51ab01433b3ac 7c062bd6d5dd5b1d972450fb0b3272cd9b45f94ccd668c3bd4347e2dce3279ed lib/codeql/rust/elements/RecordExprFieldList.qll 672c3854cb84090c8a2e9311c43448016dc2614ecbf86dbe404156304674e38f 01ae0ffca0bf640c61120e36fcf2c560555f4aabbd49ddce6f5c1a3561dbfc31 -lib/codeql/rust/elements/RecordField.qll 87d68aa912574596ba09ecb3ab437472635cd76eff49cd5bef00eaabbd264f08 01871ee4dd9bd02acd981fbc109abfa4ee1b303deaa148484476317c4c41c924 +lib/codeql/rust/elements/RecordField.qll 5d23e25985857e37ab7d699a6298d842751da9fb46da341378e17fd7cef66cc8 59272d720dbbad02094f98bf8cf3372974eb449843522b5f510c1f1b01bd2834 lib/codeql/rust/elements/RecordFieldList.qll cebab3fba41221e61cda801070a7f414b62b4fbcf2206e35462c0da35ad75c3f db092d47eea871d61541b9711d7139a99394e0ed83901a8ae60f03dfa8ed722f lib/codeql/rust/elements/RecordPat.qll 3e31af707f72e9af42142e54b7251da8cbc88a9d5f448a4e6b3ca578f92f5680 0b459d751c26a062608ef0b6f3859e9ed1342e129b004ec218694d011955cfbd lib/codeql/rust/elements/RecordPatField.qll 7487461887e82bcf224b02628dfc64457121ab17e731e2dc7aa7e731ab16c02f f2018e55722245eb4273fb067242aaa503c43f91671a55b3a4bb51fe7bc0a03c @@ -574,7 +574,7 @@ lib/codeql/rust/elements/internal/generated/ParamList.qll c808c9d84dd7800573832b lib/codeql/rust/elements/internal/generated/ParenExpr.qll bc0731505bfe88516205ec360582a4222d2681d11342c93e15258590ddee82f2 d4bd6e0c80cf1d63746c88d4bcb3a01d4c75732e5da09e3ebd9437ced227fb60 lib/codeql/rust/elements/internal/generated/ParenPat.qll 4f168ef5d5bb87a903251cc31b2e44a759b099ec69c90af31783fbb15778c940 0e34f94a45a13396fd57d94c245dc64d1adde2ab0e22b56946f7e94c04e297fc lib/codeql/rust/elements/internal/generated/ParenTypeRepr.qll 40ab5c592e7699c621787793743e33988de71ff42ca27599f5ab3ddb70e3f7d8 12c0a6eed2202ee3e892f61da3b3ce77ac3190854cdf3097e8d2be98aa3cb91d -lib/codeql/rust/elements/internal/generated/ParentChild.qll 1df63bfa8268f7db25eab70abedb8d424d892b56e92ceee8c7900cd33b1af07f cfa3d31a89303e60f4ed60ed5ca5fd04973202828aa674205d333f9fa784705f +lib/codeql/rust/elements/internal/generated/ParentChild.qll 2992505ffc3279d58f2d03e89ec0f7d23aedebb3c3baf990bfbda894a6cc10e8 2f6b721e8244b444b47d41c2303fea166debee208544389c4dd9f2be0d62fe43 lib/codeql/rust/elements/internal/generated/ParenthesizedArgList.qll c5fa328ea60d3a3333d7c7bb3480969c1873166c7ac8ebb9d0afad7a8099d1a8 2dbbb6200d96f7db7dea4a55bdeab8d67b14d39a43e0bd54ada019f7e466f163 lib/codeql/rust/elements/internal/generated/Pat.qll 3605ac062be2f294ee73336e9669027b8b655f4ad55660e1eab35266275154ee 7f9400db2884d336dd1d21df2a8093759c2a110be9bf6482ce8e80ae0fd74ed4 lib/codeql/rust/elements/internal/generated/Path.qll 8e47e91aff3f8c60f1ee8cb3887b8e4936c38e4665d052f2c92a939a969aac29 2c28beb89cabd7c7c91a5bc65c874f414cb96bbefde37b25811b61089a8a0053 @@ -589,11 +589,11 @@ lib/codeql/rust/elements/internal/generated/PtrTypeRepr.qll 51d1e9e683fc79dddbff lib/codeql/rust/elements/internal/generated/PureSynthConstructors.qll e5b8e69519012bbaae29dcb82d53f7f7ecce368c0358ec27ef6180b228a0057f e5b8e69519012bbaae29dcb82d53f7f7ecce368c0358ec27ef6180b228a0057f lib/codeql/rust/elements/internal/generated/RangeExpr.qll 23cca03bf43535f33b22a38894f70d669787be4e4f5b8fe5c8f7b964d30e9027 18624cef6c6b679eeace2a98737e472432e0ead354cca02192b4d45330f047c9 lib/codeql/rust/elements/internal/generated/RangePat.qll 80826a6a6868a803aa2372e31c52a03e1811a3f1f2abdb469f91ca0bfdd9ecb6 34ee1e208c1690cba505dff2c588837c0cd91e185e2a87d1fe673191962276a9 -lib/codeql/rust/elements/internal/generated/Raw.qll 17037cbf4b911c74b45453d733726218512c5c8f5e890a6f0e3290fab894a237 5fb11b239f210c30823b8862385f8b9f459ef8b62d47b6b50ba560e4ce2cac7c +lib/codeql/rust/elements/internal/generated/Raw.qll cfbf960b83fc7f659214a48ced60001366410322a116de255678dec9d765d8dd c0d1ee182ccb916dedf33a272fb37ac394e0fac95ef4fadb8a93c7db8d11feb5 lib/codeql/rust/elements/internal/generated/RecordExpr.qll 2131b2cb336caa76170082e69776011bf02576bbfdd34ba68ca84af24209250a 39a2e3ec32352b594c43cc1295e0e8b3f9808173322d3d73cb7d48ef969d5565 lib/codeql/rust/elements/internal/generated/RecordExprField.qll 7e9f8663d3b74ebbc9603b10c9912f082febba6bd73d344b100bbd3edf837802 fbe6b578e7fd5d5a6f21bbb8c388957ab7210a6a249ec71510a50fb35b319ea1 lib/codeql/rust/elements/internal/generated/RecordExprFieldList.qll 179a97211fe7aa6265085d4d54115cdbc0e1cd7c9b2135591e8f36d6432f13d3 dd44bbbc1e83a1ed3a587afb729d7debf7aeb7b63245de181726af13090e50c0 -lib/codeql/rust/elements/internal/generated/RecordField.qll 6d4b184c85419f9282937ebd1b1d14930a263e8754124f2323953991ca0f0e59 2f8bec227f960ae98fc320a65efdfdc5dc04455cd59697e2621585e5a5f942b8 +lib/codeql/rust/elements/internal/generated/RecordField.qll 7a6fd6a8362ea1671560eeb96abcaf9ae412ec9800fcf9c9fbda1849253912af 0e72e067475c20d72aeae2f10589e3f25806b44ac60b6b7289ba860de98a7c92 lib/codeql/rust/elements/internal/generated/RecordFieldList.qll d7bb2677338cf420b0d6371aeec781aacc2272c73413ea96b7418177ad149fb9 5ef52074b9f4ec31e7422b70efdb2e650d673b2625efdfec18a4e48c30e35cf6 lib/codeql/rust/elements/internal/generated/RecordPat.qll f2ce392fb7e481a139ea527ad32d1c7ba65404a05efc56f5c68ce1e8e1e0a928 9710048cd1e6b26b3054ac95778e47f16cff6424bab9ef0c099c1109ef14741f lib/codeql/rust/elements/internal/generated/RecordPatField.qll 5bf624d22903fb874e6d03541cf453493badd382b6910ce950ad0d34dd580e9a b9ec89b69a58b9c418405efa9b0e6ee7b07616f5696a0858583a339d657b5855 @@ -1029,8 +1029,9 @@ test/extractor-tests/generated/RecordExprFieldList/RecordExprFieldList.ql b6cd65 test/extractor-tests/generated/RecordExprFieldList/RecordExprFieldList_getAttr.ql 15b297e79c1ba8c92cb97148d6aab78ed1fd2c94f0d3a430ead8d541024e81ce 4f0a131011cf32e172f7bd027769e39642fb506d37b3d50b175c6ed5947d3d9c test/extractor-tests/generated/RecordExprFieldList/RecordExprFieldList_getField.ql c55e4775c8880c05944be04bdeb1c9e6bad45b922ba71ac3145acd83ff988e59 14ce98d1e5564e9e27c29110237cf6210d130ea887920b2b1bd34a853b7fcc63 test/extractor-tests/generated/RecordExprFieldList/RecordExprFieldList_getSpread.ql f2dd6b85da1cd8195986aefbe7dc8171db6fbbe5b2612c4cbdd8aba052cb0c6a 2c19cb1510c215ddfa004d40bf30fc0fe0dcbb530c320b297541f1dbcb204143 -test/extractor-tests/generated/RecordField/RecordField.ql b1f14a17b6f2e581c2a1e882a7405351ded14c565375b99a0119fafed93a2b09 b7d74549a4f7556e79fcbdb79748905fb13d13cd01de3d551cb5898b1d0af87a +test/extractor-tests/generated/RecordField/RecordField.ql 8ba8ed51144c69266f8a5644604f560d1569de76e1070d8f22247d07ebc521c8 87d485651f9711e49c576dddd543077c49892b71e45fc65ce5122ded303b49f5 test/extractor-tests/generated/RecordField/RecordField_getAttr.ql aa29d317dee23039a807df530a6f04b0678c4d1d34207a4381be535ff04af478 41c5778d6316eec19192334046ed110aea44a4c45937d5c355a9b71c54aa8e04 +test/extractor-tests/generated/RecordField/RecordField_getExpr.ql 15ab939ede4ed4395ef8db8f6e0a3ac03079a3ae617ce9335fb93ba565b402de 9d853f305baf56ec08b22342adc4deb096d771fa48fd478932cc5187cd66304f test/extractor-tests/generated/RecordField/RecordField_getName.ql 1f5c47d41367bd0115df86f22a70d4621d7cbfb41554daa598da29f549479670 64535303b273f1c2027b6ce89b50816ad3cbbca9bf00b2b8402e36b26e675d97 test/extractor-tests/generated/RecordField/RecordField_getTypeRepr.ql f61cfcd0c682604b882a4ed9c746e6f6087e4798d7aaf9d29579e0e2372406e6 01371887fa82748ef196d2e9d27d26c586efb5b4f82d48967b5494723c54af4d test/extractor-tests/generated/RecordField/RecordField_getVisibility.ql cc45e9bb9418d15cef07a1827358c3f18a8737324c8e6852591a2da70df89360 45557497fc165a212fffda71dedabc8159a4f72323430df732698a18922b366c diff --git a/rust/ql/.gitattributes b/rust/ql/.gitattributes index 4d5b319bc36..05ac0fbbf27 100644 --- a/rust/ql/.gitattributes +++ b/rust/ql/.gitattributes @@ -1033,6 +1033,7 @@ /test/extractor-tests/generated/RecordExprFieldList/RecordExprFieldList_getSpread.ql linguist-generated /test/extractor-tests/generated/RecordField/RecordField.ql linguist-generated /test/extractor-tests/generated/RecordField/RecordField_getAttr.ql linguist-generated +/test/extractor-tests/generated/RecordField/RecordField_getExpr.ql linguist-generated /test/extractor-tests/generated/RecordField/RecordField_getName.ql linguist-generated /test/extractor-tests/generated/RecordField/RecordField_getTypeRepr.ql linguist-generated /test/extractor-tests/generated/RecordField/RecordField_getVisibility.ql linguist-generated diff --git a/rust/ql/lib/codeql/rust/elements/RecordField.qll b/rust/ql/lib/codeql/rust/elements/RecordField.qll index 4a5e749b905..d19a605dad9 100644 --- a/rust/ql/lib/codeql/rust/elements/RecordField.qll +++ b/rust/ql/lib/codeql/rust/elements/RecordField.qll @@ -6,6 +6,7 @@ private import internal.RecordFieldImpl import codeql.rust.elements.AstNode import codeql.rust.elements.Attr +import codeql.rust.elements.Expr import codeql.rust.elements.Name import codeql.rust.elements.TypeRepr import codeql.rust.elements.Visibility 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 54301cd04ce..ee97d8a4c60 100644 --- a/rust/ql/lib/codeql/rust/elements/internal/generated/ParentChild.qll +++ b/rust/ql/lib/codeql/rust/elements/internal/generated/ParentChild.qll @@ -903,12 +903,15 @@ private module Impl { private Element getImmediateChildOfRecordField( RecordField e, int index, string partialPredicateCall ) { - exists(int b, int bAstNode, int n, int nAttr, int nName, int nTypeRepr, int nVisibility | + exists( + int b, int bAstNode, int n, int nAttr, int nExpr, int nName, int nTypeRepr, int nVisibility + | b = 0 and bAstNode = b + 1 + max(int i | i = -1 or exists(getImmediateChildOfAstNode(e, i, _)) | i) and n = bAstNode and nAttr = n + 1 + max(int i | i = -1 or exists(e.getAttr(i)) | i) and - nName = nAttr + 1 and + nExpr = nAttr + 1 and + nName = nExpr + 1 and nTypeRepr = nName + 1 and nVisibility = nTypeRepr + 1 and ( @@ -919,7 +922,9 @@ private module Impl { result = e.getAttr(index - n) and partialPredicateCall = "Attr(" + (index - n).toString() + ")" or - index = nAttr and result = e.getName() and partialPredicateCall = "Name()" + index = nAttr and result = e.getExpr() and partialPredicateCall = "Expr()" + or + index = nExpr and result = e.getName() and partialPredicateCall = "Name()" or index = nName and result = e.getTypeRepr() and partialPredicateCall = "TypeRepr()" or 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 4e4abb2ae67..a858c89ce57 100644 --- a/rust/ql/lib/codeql/rust/elements/internal/generated/Raw.qll +++ b/rust/ql/lib/codeql/rust/elements/internal/generated/Raw.qll @@ -786,6 +786,11 @@ module Raw { */ Attr getAttr(int index) { record_field_attrs(this, index, result) } + /** + * Gets the expression of this record field, if it exists. + */ + Expr getExpr() { record_field_exprs(this, result) } + /** * Gets the name of this record field, if it exists. */ diff --git a/rust/ql/lib/codeql/rust/elements/internal/generated/RecordField.qll b/rust/ql/lib/codeql/rust/elements/internal/generated/RecordField.qll index aa840aafdcd..c60261128a1 100644 --- a/rust/ql/lib/codeql/rust/elements/internal/generated/RecordField.qll +++ b/rust/ql/lib/codeql/rust/elements/internal/generated/RecordField.qll @@ -8,6 +8,7 @@ private import codeql.rust.elements.internal.generated.Synth private import codeql.rust.elements.internal.generated.Raw import codeql.rust.elements.internal.AstNodeImpl::Impl as AstNodeImpl import codeql.rust.elements.Attr +import codeql.rust.elements.Expr import codeql.rust.elements.Name import codeql.rust.elements.TypeRepr import codeql.rust.elements.Visibility @@ -48,6 +49,19 @@ module Generated { */ final int getNumberOfAttrs() { result = count(int i | exists(this.getAttr(i))) } + /** + * Gets the expression of this record field, if it exists. + */ + Expr getExpr() { + result = + Synth::convertExprFromRaw(Synth::convertRecordFieldToRaw(this).(Raw::RecordField).getExpr()) + } + + /** + * Holds if `getExpr()` exists. + */ + final predicate hasExpr() { exists(this.getExpr()) } + /** * Gets the name of this record field, if it exists. */ diff --git a/rust/ql/lib/rust.dbscheme b/rust/ql/lib/rust.dbscheme index bbe668c56ea..29a351d42ac 100644 --- a/rust/ql/lib/rust.dbscheme +++ b/rust/ql/lib/rust.dbscheme @@ -836,6 +836,12 @@ record_field_attrs( int attr: @attr ref ); +#keyset[id] +record_field_exprs( + int id: @record_field ref, + int expr: @expr ref +); + #keyset[id] record_field_names( int id: @record_field ref, diff --git a/rust/ql/test/extractor-tests/generated/RecordField/RecordField.ql b/rust/ql/test/extractor-tests/generated/RecordField/RecordField.ql index 6cb0510df2c..d338dec4c35 100644 --- a/rust/ql/test/extractor-tests/generated/RecordField/RecordField.ql +++ b/rust/ql/test/extractor-tests/generated/RecordField/RecordField.ql @@ -2,13 +2,16 @@ import codeql.rust.elements import TestUtils -from RecordField x, int getNumberOfAttrs, string hasName, string hasTypeRepr, string hasVisibility +from + RecordField x, int getNumberOfAttrs, string hasExpr, string hasName, string hasTypeRepr, + string hasVisibility where toBeTested(x) and not x.isUnknown() and getNumberOfAttrs = x.getNumberOfAttrs() and + (if x.hasExpr() then hasExpr = "yes" else hasExpr = "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" -select x, "getNumberOfAttrs:", getNumberOfAttrs, "hasName:", hasName, "hasTypeRepr:", hasTypeRepr, - "hasVisibility:", hasVisibility +select x, "getNumberOfAttrs:", getNumberOfAttrs, "hasExpr:", hasExpr, "hasName:", hasName, + "hasTypeRepr:", hasTypeRepr, "hasVisibility:", hasVisibility diff --git a/rust/ql/test/extractor-tests/generated/RecordField/RecordField_getExpr.ql b/rust/ql/test/extractor-tests/generated/RecordField/RecordField_getExpr.ql new file mode 100644 index 00000000000..7519191f6b6 --- /dev/null +++ b/rust/ql/test/extractor-tests/generated/RecordField/RecordField_getExpr.ql @@ -0,0 +1,7 @@ +// generated by codegen, do not edit +import codeql.rust.elements +import TestUtils + +from RecordField x +where toBeTested(x) and not x.isUnknown() +select x, x.getExpr() diff --git a/rust/schema/ast.py b/rust/schema/ast.py index d987cbb26a6..6617749258c 100644 --- a/rust/schema/ast.py +++ b/rust/schema/ast.py @@ -535,6 +535,7 @@ class RecordExprFieldList(AstNode, ): class RecordField(AstNode, ): attrs: list["Attr"] | child + expr: optional["Expr"] | child name: optional["Name"] | child type_repr: optional["TypeRepr"] | child visibility: optional["Visibility"] | child