mirror of
https://github.com/github/codeql.git
synced 2025-12-16 16:53:25 +01:00
Rust: fix duplicate asm! expressions
This commit is contained in:
@@ -82,6 +82,7 @@ fn should_enum_be_skipped(name: &str) -> bool {
|
||||
|
||||
fn should_node_be_skipped(name: &str) -> bool {
|
||||
name == "TypeAnchor" // we flatten TypeAnchor into PathSegment in the extractor
|
||||
|| name == "MacroStmts" // we workaround a getter bug in the extractor
|
||||
}
|
||||
|
||||
fn should_node_be_skipped_in_extractor(name: &str) -> bool {
|
||||
|
||||
2
rust/extractor/src/generated/.generated.list
generated
2
rust/extractor/src/generated/.generated.list
generated
@@ -1,2 +1,2 @@
|
||||
mod.rs 4bcb9def847469aae9d8649461546b7c21ec97cf6e63d3cf394e339915ce65d7 4bcb9def847469aae9d8649461546b7c21ec97cf6e63d3cf394e339915ce65d7
|
||||
top.rs a2b836f6f4c1332cdc2bcf7a4201765f22635f976892725aa424d7b306b6b586 a2b836f6f4c1332cdc2bcf7a4201765f22635f976892725aa424d7b306b6b586
|
||||
top.rs cf4f3f6b3fd0dee0d8b35f346695cfd3e080ca328ca1726ce851f6abfbabc631 cf4f3f6b3fd0dee0d8b35f346695cfd3e080ca328ca1726ce851f6abfbabc631
|
||||
|
||||
8
rust/extractor/src/generated/top.rs
generated
8
rust/extractor/src/generated/top.rs
generated
@@ -6148,8 +6148,8 @@ impl From<trap::Label<LiteralPat>> for trap::Label<Element> {
|
||||
#[derive(Debug)]
|
||||
pub struct MacroBlockExpr {
|
||||
pub id: trap::TrapId<MacroBlockExpr>,
|
||||
pub tail_expr: Option<trap::Label<Expr>>,
|
||||
pub statements: Vec<trap::Label<Stmt>>,
|
||||
pub tail_expr: Option<trap::Label<Expr>>,
|
||||
}
|
||||
|
||||
impl trap::TrapEntry for MacroBlockExpr {
|
||||
@@ -6159,12 +6159,12 @@ impl trap::TrapEntry for MacroBlockExpr {
|
||||
|
||||
fn emit(self, id: trap::Label<Self>, out: &mut trap::Writer) {
|
||||
out.add_tuple("macro_block_exprs", vec![id.into()]);
|
||||
if let Some(v) = self.tail_expr {
|
||||
out.add_tuple("macro_block_expr_tail_exprs", vec![id.into(), v.into()]);
|
||||
}
|
||||
for (i, v) in self.statements.into_iter().enumerate() {
|
||||
out.add_tuple("macro_block_expr_statements", vec![id.into(), i.into(), v.into()]);
|
||||
}
|
||||
if let Some(v) = self.tail_expr {
|
||||
out.add_tuple("macro_block_expr_tail_exprs", vec![id.into(), v.into()]);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -834,6 +834,38 @@ impl<'a> Translator<'a> {
|
||||
}
|
||||
}
|
||||
|
||||
pub(crate) fn emit_macro_stmts(
|
||||
&mut self,
|
||||
node: &ast::MacroStmts,
|
||||
) -> Option<Label<generated::MacroBlockExpr>> {
|
||||
// not generated to work around a bug in rust-analyzer AST generation machinery.
|
||||
// Because an Expr can also be a Stmt (AsmExpr: Expr and AsmExpr: Item: Stmt)
|
||||
// then such an element will be returned by both `expr()` and `statements()`
|
||||
let mut statements = node.statements().collect::<Vec<_>>();
|
||||
let tail_expr = node.expr();
|
||||
if tail_expr
|
||||
.as_ref()
|
||||
.is_some_and(|e| statements.last().is_some_and(|s| s.syntax() == e.syntax()))
|
||||
{
|
||||
// if the expression matched as both the tail_expr and the last of the statements,
|
||||
// only take it as tail_expr
|
||||
statements.pop();
|
||||
}
|
||||
let tail_expr = tail_expr.and_then(|e| self.emit_expr(&e));
|
||||
let statements = statements
|
||||
.iter()
|
||||
.filter_map(|x| self.emit_stmt(x))
|
||||
.collect();
|
||||
let label = self.trap.emit(generated::MacroBlockExpr {
|
||||
id: TrapId::Star,
|
||||
tail_expr,
|
||||
statements,
|
||||
});
|
||||
self.emit_location(label, node);
|
||||
self.emit_tokens(node, label.into(), node.syntax().children_with_tokens());
|
||||
Some(label)
|
||||
}
|
||||
|
||||
fn is_attribute_macro_target(&self, node: &ast::Item) -> bool {
|
||||
// rust-analyzer considers as an `attr_macro_call` also a plain macro call, but we want to
|
||||
// process that differently (in `extract_macro_call_expanded`)
|
||||
|
||||
18
rust/extractor/src/translate/generated.rs
generated
18
rust/extractor/src/translate/generated.rs
generated
@@ -1600,24 +1600,6 @@ impl Translator<'_> {
|
||||
self.emit_tokens(node, label.into(), node.syntax().children_with_tokens());
|
||||
Some(label)
|
||||
}
|
||||
pub(crate) fn emit_macro_stmts(
|
||||
&mut self,
|
||||
node: &ast::MacroStmts,
|
||||
) -> Option<Label<generated::MacroBlockExpr>> {
|
||||
let tail_expr = node.expr().and_then(|x| self.emit_expr(&x));
|
||||
let statements = node
|
||||
.statements()
|
||||
.filter_map(|x| self.emit_stmt(&x))
|
||||
.collect();
|
||||
let label = self.trap.emit(generated::MacroBlockExpr {
|
||||
id: TrapId::Star,
|
||||
tail_expr,
|
||||
statements,
|
||||
});
|
||||
self.emit_location(label, node);
|
||||
self.emit_tokens(node, label.into(), node.syntax().children_with_tokens());
|
||||
Some(label)
|
||||
}
|
||||
pub(crate) fn emit_macro_type(
|
||||
&mut self,
|
||||
node: &ast::MacroType,
|
||||
|
||||
14
rust/ql/.generated.list
generated
14
rust/ql/.generated.list
generated
@@ -1,4 +1,4 @@
|
||||
lib/codeql/rust/controlflow/internal/generated/CfgNodes.qll 6a103a6d04c951ca2f0c2989bed737cdbac56dd5ea9432b858da3416412bbf79 cf2bc67b65a1555de58bbd0a35b834b8867112a2f7c1951307c9416400ce70d0
|
||||
lib/codeql/rust/controlflow/internal/generated/CfgNodes.qll 06394c1314f09d65b8ade88732f1114202e1896ebeb8d687f8ee230cea01127b 7a9223854ec30cae886b237d7930120ce073ab49af486b0d3bc971df2a039e62
|
||||
lib/codeql/rust/elements/Abi.qll 485a2e79f6f7bfd1c02a6e795a71e62dede3c3e150149d5f8f18b761253b7208 6159ba175e7ead0dd2e3f2788f49516c306ee11b1a443bd4bdc00b7017d559bd
|
||||
lib/codeql/rust/elements/Addressable.qll 13011bfd2e1556694c3d440cc34af8527da4df49ad92b62f2939d3699ff2cea5 ddb25935f7553a1a384b1abe2e4b4fa90ab50b952dadec32fd867afcb054f4be
|
||||
lib/codeql/rust/elements/Adt.qll c2afed4ac2e17039ccd98f74ea22111f4d765c4e232c50ccd3128da0d26da837 1380bde2eb667c6ec2ef5f8710aa24e926851c9e321ebc72ba514fa92c369dc3
|
||||
@@ -90,7 +90,7 @@ lib/codeql/rust/elements/LiteralPat.qll daffb5f380a47543669c8cc92628b0e0de478c3a
|
||||
lib/codeql/rust/elements/Locatable.qll 2855efa4a469b54e0ca85daa89309a8b991cded6f3f10db361010831ba1e11d3 00c3406d14603f90abea11bf074eaf2c0b623a30e29cf6afc3a247cb58b92f0f
|
||||
lib/codeql/rust/elements/LoopExpr.qll ee171177650fa23eef102a9580765f4b6073a1cc41bab1ec31ad4f84ffe6c2c9 bfcf0cca4dc944270d9748a202829a38c64dfae167c0d3a4202788ceb9daf5f6
|
||||
lib/codeql/rust/elements/LoopingExpr.qll 7ad7d4bbfd05adc0bb9b4ca90ff3377b8298121ca5360ffb45d5a7a1e20fe37a 964168b2045ee9bad827bba53f10a64d649b3513f2d1e3c17a1b1f11d0fc7f3a
|
||||
lib/codeql/rust/elements/MacroBlockExpr.qll fb81f067a142053b122e2875a15719565024cfb09326faf12e0f1017307deb58 3ee94ef7e56bd07a8f9304869b0a7b69971b02abbee46d0bebcacb4031760282
|
||||
lib/codeql/rust/elements/MacroBlockExpr.qll 077c968da099c10456be4b594675a074e9a4e43b5c5145e1b1ae1fa47ae6d570 99586e3766ee0c80364998128e067cab2639ac25c1dcbe13e0247d629490af6f
|
||||
lib/codeql/rust/elements/MacroCall.qll 452aee152b655cdd5a69bf973977072f000a6451f626469a3f7313f0468ffc18 a8652d0de1c6c2118d683d5465ba4115dd4c65031896440269a2a0522d90fceb
|
||||
lib/codeql/rust/elements/MacroDef.qll 5bcf2bba7ba40879fe47370bfeb65b23c67c463be20535327467338a1e2e04bb c3d28416fc08e5d79149fccd388fea2bc3097bce074468a323383056404926db
|
||||
lib/codeql/rust/elements/MacroExpr.qll 640554f4964def19936a16ce88a03fb12f74ec2bcfe38b88d32742b79f85d909 a284fb66e012664a33a4e9c8fd3e38d3ffd588fccd6b16b02270da55fc025f7a
|
||||
@@ -306,7 +306,7 @@ lib/codeql/rust/elements/internal/LiteralPatConstructor.qll b660cb428a0cba0b713f
|
||||
lib/codeql/rust/elements/internal/LoopExprConstructor.qll 45f3f8f7441fcab6adc58831421679ee07bac68ac0417f3cbc90c97426cc805b f7ab3361b4a11e898126378ea277d76949466946762cd6cb5e9e9b4bb9860420
|
||||
lib/codeql/rust/elements/internal/LoopingExprImpl.qll 17885c1bcf7b5a3f9c7bbad3d4d55e24372af0dedd5e7fc0efcfc0a8b2cdad70 104dc45ca399b9f6e8227ad561679f728d60170398a52b31fc90cb2a2dd3c33c
|
||||
lib/codeql/rust/elements/internal/MacroBlockExprConstructor.qll 90097c0d2c94083e997396e01cf24349af5eb1788060368dc21ae8cd8ce90d93 e067904a734356e38fbadbc4277629c5987adce6d8f7737f7458ac07e9b264af
|
||||
lib/codeql/rust/elements/internal/MacroBlockExprImpl.qll f7a8dd1dcde2355353e17d06bb197e2d6e321ea64a39760a074d1887e68d63d6 8d429be9b6aa9f711e050b6b07f35637de22e8635a559e06dd9153a8b7947274
|
||||
lib/codeql/rust/elements/internal/MacroBlockExprImpl.qll 323c0695ab1d8ee7d88a678eabdb6ac9d92293b9ae0846ec2c7ed8d76a591369 7b662b77cf2d885423d8734ff322c199650c1ea59a2c3371a1370efd7966e0c9
|
||||
lib/codeql/rust/elements/internal/MacroCallConstructor.qll 707fee4fba1fd632cd00128f493e8919eaaea552ad653af4c1b7a138e362907d b49e7e36bf9306199f2326af042740ff858871b5c79f6aeddf3d5037044dbf1f
|
||||
lib/codeql/rust/elements/internal/MacroDefConstructor.qll 382a3bdf46905d112ee491620cc94f87d584d72f49e01eb1483f749e4709c055 eb61b90d8d8d655c2b00ff576ae20c8da9709eeef754212bc64d8e1558ad05ce
|
||||
lib/codeql/rust/elements/internal/MacroDefImpl.qll 73db95ff82834e0063699c7d31349b65e95ba7436fe0a8914dbdd3a383f8b1c9 cd2f078f84ce73fdc88b207df105b297f2cd3b780428968214443af3a2719e8f
|
||||
@@ -546,7 +546,7 @@ lib/codeql/rust/elements/internal/generated/LiteralPat.qll f36b09cf39330019c111e
|
||||
lib/codeql/rust/elements/internal/generated/Locatable.qll c897dc1bdd4dfcb6ded83a4a93332ca3d8f421bae02493ea2a0555023071775e b32d242f8c9480dc9b53c1e13a5cb8dcfce575b0373991c082c1db460a3e37b8
|
||||
lib/codeql/rust/elements/internal/generated/LoopExpr.qll db6bc87e795c9852426ec661fa2c2c54106805897408b43a67f5b82fb4657afd 1492866ccf8213469be85bbdbcae0142f4e2a39df305d4c0d664229ecd1ebdb9
|
||||
lib/codeql/rust/elements/internal/generated/LoopingExpr.qll 0792c38d84b8c68114da2bbdfef32ef803b696cb0fd06e10e101756d5c46976c 111fe961fad512722006323c3f2a075fddf59bd3eb5c7afc349835fcec8eb102
|
||||
lib/codeql/rust/elements/internal/generated/MacroBlockExpr.qll 778376cdfa4caaa9df0b9c21bda5ff0f1037b730aa43efb9fb0a08998ef3999b 6df39efe7823ce590ef6f4bdfa60957ba067205a77d94ac089b2c6a7f6b7b561
|
||||
lib/codeql/rust/elements/internal/generated/MacroBlockExpr.qll 7705de831e797c8742726a3c28dd8f87f6c1b9e2cccd20f01839d161f7ca37c7 ac79c5c95befc82f53b620ccc8a28fd9cc0f9e00c585ed4032bd75f99e0935fa
|
||||
lib/codeql/rust/elements/internal/generated/MacroCall.qll 1a7ee9c782ebc9ab0a807762aabebc9e0a7ef10c6eb945679737598630b20af2 782a437654cb316355c020e89d50b07c93ba7817715fa5d42a9e807cf12d1a43
|
||||
lib/codeql/rust/elements/internal/generated/MacroDef.qll 90393408d9e10ff6167789367c30f9bfe1d3e8ac3b83871c6cb30a8ae37eef47 f022d1df45bc9546cb9fd7059f20e16a3acfaae2053bbd10075fe467c96e2379
|
||||
lib/codeql/rust/elements/internal/generated/MacroExpr.qll 5a86ae36a28004ce5e7eb30addf763eef0f1c614466f4507a3935b0dab2c7ce3 11c15e8ebd36455ec9f6b7819134f6b22a15a3644678ca96b911ed0eb1181873
|
||||
@@ -574,7 +574,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 389ee1eea791f9d2a5eb9ae49d2aa61607f8cdb3f3d5752d5c067122029de66a 50875ace3751c001acc11fa596ea1cd8c8b17dd925344c2d91d338b3f864df0d
|
||||
lib/codeql/rust/elements/internal/generated/ParentChild.qll d43d7486ed04a3930fa476694fc74d972f4413992968de425573ccf823343c87 3d4245aee40a38bff658f2c0cb220d5276ae751194c5b728b65054ec98c841e4
|
||||
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
|
||||
@@ -589,7 +589,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 1578a58b7115fed2bfdaf65c3a9e6ef8318660b11a9c8f1cc334114f9c38e0af a8ea88419f42be7a40d7419d07a0469380ba3c4706e6a580554a4c28e216fc00
|
||||
lib/codeql/rust/elements/internal/generated/Raw.qll a608725b53de8509b1b5f2a29e1636bda2e6baaa5d4218397f690f43f3c89011 6c09465d83f71e9e54917f2d4436eeb865c9abaf7a941e8a8cfc2faf29c794f4
|
||||
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
|
||||
@@ -724,7 +724,7 @@ test/extractor-tests/generated/LifetimeParam/LifetimeParam.ql a96f586af332969878
|
||||
test/extractor-tests/generated/LiteralExpr/LiteralExpr.ql 00570642966d233a10ec3106ae65e6ea865c29d0776fdbc452815f528301117c adb286ad3bd763f1b1b350cac91bc2615869dcb9b0faf29276ace9a99d31f0cc
|
||||
test/extractor-tests/generated/LiteralPat/LiteralPat.ql 863d4902e7e22de3176398cbb908e6f5f487b3d22c0f9f7a5498a1ebc112c0fd 47e3f70c5c32f17050d3ca8c8b42d94ecd38e378627880d8100b7ca182cfa793
|
||||
test/extractor-tests/generated/LoopExpr/LoopExpr.ql a178e25f63b4d517482ec63e5dfb6903dd41dadd8db39be2dd2a831e8456811f f34165f78179960cc7e5876dac26a1d0f6f67933eff9a015b92ca0e2872b63e8
|
||||
test/extractor-tests/generated/MacroBlockExpr/MacroBlockExpr.ql 62859a25b88c93db1d47055f682f1b8ed97ef227c870bc14041af106cb9593fd 14c5831920249ef2e0799ddacca62805e2e2d8b8a6cbd244acb3a20c4542bf7b
|
||||
test/extractor-tests/generated/MacroBlockExpr/MacroBlockExpr.ql 936920b5b609b1e62b201004055bbce449d2d7c1f8016f57d9b27d3ea8107f07 21493009ed3b1810aa4fd8af4d8c7b7794982da032dfb6b7e9048445d651eecb
|
||||
test/extractor-tests/generated/MacroCall/MacroCall.ql f98017f6070e2a5e4b191d5380cc0491d7358c456e8459b313235e44eb368794 437129210d9b7f6850adf4d2c8ef7d0644193418645d631b8edf229656fc57ac
|
||||
test/extractor-tests/generated/MacroDef/MacroDef.ql 9e3647a92713d32f87e876f37d703081855ea88a7a3104757f90bd94eb382fa9 b50e9797c1b8ea5491267ddb6778862f0541617ee60bd8e167cc23a499e36733
|
||||
test/extractor-tests/generated/MacroExpr/MacroExpr.ql 83fadb88fd8f913bb1b1cda26d21b173bdc94bb6682a74eaddce650ebf72aa41 1c502cde6a95ec637e43d348c613be3dec4092b69d2c8692abdc5a9377e37f5f
|
||||
|
||||
@@ -1797,9 +1797,15 @@ module MakeCfgNodes<LocationSig Loc, InputSig<Loc> Input> {
|
||||
/**
|
||||
* A sequence of statements generated by a `MacroCall`. For example:
|
||||
* ```rust
|
||||
* fn main() {
|
||||
* println!("Hello, world!"); // This macro expands into a list of statements
|
||||
* macro_rules! my_macro {
|
||||
* () => {
|
||||
* let mut x = 40;
|
||||
* x += 2;
|
||||
* x
|
||||
* };
|
||||
* }
|
||||
*
|
||||
* my_macro!(); // this macro expands to a sequence of statements (and an expression)
|
||||
* ```
|
||||
*/
|
||||
final class MacroBlockExprCfgNode extends CfgNodeFinal, ExprCfgNode {
|
||||
@@ -1810,18 +1816,6 @@ module MakeCfgNodes<LocationSig Loc, InputSig<Loc> Input> {
|
||||
/** Gets the underlying `MacroBlockExpr`. */
|
||||
MacroBlockExpr getMacroBlockExpr() { result = node }
|
||||
|
||||
/**
|
||||
* Gets the tail expression of this macro block expression, if it exists.
|
||||
*/
|
||||
ExprCfgNode getTailExpr() {
|
||||
any(ChildMapping mapping).hasCfgChild(node, node.getTailExpr(), this, result)
|
||||
}
|
||||
|
||||
/**
|
||||
* Holds if `getTailExpr()` exists.
|
||||
*/
|
||||
predicate hasTailExpr() { exists(this.getTailExpr()) }
|
||||
|
||||
/**
|
||||
* Gets the `index`th statement of this macro block expression (0-based).
|
||||
*/
|
||||
@@ -1836,6 +1830,18 @@ module MakeCfgNodes<LocationSig Loc, InputSig<Loc> Input> {
|
||||
* Gets the number of statements of this macro block expression.
|
||||
*/
|
||||
int getNumberOfStatements() { result = count(int i | exists(this.getStatement(i))) }
|
||||
|
||||
/**
|
||||
* Gets the tail expression of this macro block expression, if it exists.
|
||||
*/
|
||||
ExprCfgNode getTailExpr() {
|
||||
any(ChildMapping mapping).hasCfgChild(node, node.getTailExpr(), this, result)
|
||||
}
|
||||
|
||||
/**
|
||||
* Holds if `getTailExpr()` exists.
|
||||
*/
|
||||
predicate hasTailExpr() { exists(this.getTailExpr()) }
|
||||
}
|
||||
|
||||
final private class ParentMacroCall extends ParentAstNode, MacroCall {
|
||||
|
||||
10
rust/ql/lib/codeql/rust/elements/MacroBlockExpr.qll
generated
10
rust/ql/lib/codeql/rust/elements/MacroBlockExpr.qll
generated
@@ -10,9 +10,15 @@ import codeql.rust.elements.Stmt
|
||||
/**
|
||||
* A sequence of statements generated by a `MacroCall`. For example:
|
||||
* ```rust
|
||||
* fn main() {
|
||||
* println!("Hello, world!"); // This macro expands into a list of statements
|
||||
* macro_rules! my_macro {
|
||||
* () => {
|
||||
* let mut x = 40;
|
||||
* x += 2;
|
||||
* x
|
||||
* };
|
||||
* }
|
||||
*
|
||||
* my_macro!(); // this macro expands to a sequence of statements (and an expression)
|
||||
* ```
|
||||
*/
|
||||
final class MacroBlockExpr = Impl::MacroBlockExpr;
|
||||
|
||||
@@ -15,9 +15,15 @@ module Impl {
|
||||
/**
|
||||
* A sequence of statements generated by a `MacroCall`. For example:
|
||||
* ```rust
|
||||
* fn main() {
|
||||
* println!("Hello, world!"); // This macro expands into a list of statements
|
||||
* macro_rules! my_macro {
|
||||
* () => {
|
||||
* let mut x = 40;
|
||||
* x += 2;
|
||||
* x
|
||||
* };
|
||||
* }
|
||||
*
|
||||
* my_macro!(); // this macro expands to a sequence of statements (and an expression)
|
||||
* ```
|
||||
*/
|
||||
class MacroBlockExpr extends Generated::MacroBlockExpr { }
|
||||
|
||||
@@ -18,9 +18,15 @@ module Generated {
|
||||
/**
|
||||
* A sequence of statements generated by a `MacroCall`. For example:
|
||||
* ```rust
|
||||
* fn main() {
|
||||
* println!("Hello, world!"); // This macro expands into a list of statements
|
||||
* macro_rules! my_macro {
|
||||
* () => {
|
||||
* let mut x = 40;
|
||||
* x += 2;
|
||||
* x
|
||||
* };
|
||||
* }
|
||||
*
|
||||
* my_macro!(); // this macro expands to a sequence of statements (and an expression)
|
||||
* ```
|
||||
* INTERNAL: Do not reference the `Generated::MacroBlockExpr` class directly.
|
||||
* Use the subclass `MacroBlockExpr`, where the following predicates are available.
|
||||
@@ -28,21 +34,6 @@ module Generated {
|
||||
class MacroBlockExpr extends Synth::TMacroBlockExpr, ExprImpl::Expr {
|
||||
override string getAPrimaryQlClass() { result = "MacroBlockExpr" }
|
||||
|
||||
/**
|
||||
* Gets the tail expression of this macro block expression, if it exists.
|
||||
*/
|
||||
Expr getTailExpr() {
|
||||
result =
|
||||
Synth::convertExprFromRaw(Synth::convertMacroBlockExprToRaw(this)
|
||||
.(Raw::MacroBlockExpr)
|
||||
.getTailExpr())
|
||||
}
|
||||
|
||||
/**
|
||||
* Holds if `getTailExpr()` exists.
|
||||
*/
|
||||
final predicate hasTailExpr() { exists(this.getTailExpr()) }
|
||||
|
||||
/**
|
||||
* Gets the `index`th statement of this macro block expression (0-based).
|
||||
*/
|
||||
@@ -62,5 +53,20 @@ module Generated {
|
||||
* Gets the number of statements of this macro block expression.
|
||||
*/
|
||||
final int getNumberOfStatements() { result = count(int i | exists(this.getStatement(i))) }
|
||||
|
||||
/**
|
||||
* Gets the tail expression of this macro block expression, if it exists.
|
||||
*/
|
||||
Expr getTailExpr() {
|
||||
result =
|
||||
Synth::convertExprFromRaw(Synth::convertMacroBlockExprToRaw(this)
|
||||
.(Raw::MacroBlockExpr)
|
||||
.getTailExpr())
|
||||
}
|
||||
|
||||
/**
|
||||
* Holds if `getTailExpr()` exists.
|
||||
*/
|
||||
final predicate hasTailExpr() { exists(this.getTailExpr()) }
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1489,17 +1489,17 @@ private module Impl {
|
||||
private Element getImmediateChildOfMacroBlockExpr(
|
||||
MacroBlockExpr e, int index, string partialPredicateCall
|
||||
) {
|
||||
exists(int n, int nTailExpr, int nStatement |
|
||||
exists(int n, int nStatement, int nTailExpr |
|
||||
n = 0 and
|
||||
nTailExpr = n + 1 and
|
||||
nStatement = nTailExpr + 1 + max(int i | i = -1 or exists(e.getStatement(i)) | i) and
|
||||
nStatement = n + 1 + max(int i | i = -1 or exists(e.getStatement(i)) | i) and
|
||||
nTailExpr = nStatement + 1 and
|
||||
(
|
||||
none()
|
||||
or
|
||||
index = n and result = e.getTailExpr() and partialPredicateCall = "TailExpr()"
|
||||
result = e.getStatement(index - n) and
|
||||
partialPredicateCall = "Statement(" + (index - n).toString() + ")"
|
||||
or
|
||||
result = e.getStatement(index - nTailExpr) and
|
||||
partialPredicateCall = "Statement(" + (index - nTailExpr).toString() + ")"
|
||||
index = nStatement and result = e.getTailExpr() and partialPredicateCall = "TailExpr()"
|
||||
)
|
||||
)
|
||||
}
|
||||
|
||||
@@ -2619,23 +2619,29 @@ module Raw {
|
||||
* INTERNAL: Do not use.
|
||||
* A sequence of statements generated by a `MacroCall`. For example:
|
||||
* ```rust
|
||||
* fn main() {
|
||||
* println!("Hello, world!"); // This macro expands into a list of statements
|
||||
* macro_rules! my_macro {
|
||||
* () => {
|
||||
* let mut x = 40;
|
||||
* x += 2;
|
||||
* x
|
||||
* };
|
||||
* }
|
||||
*
|
||||
* my_macro!(); // this macro expands to a sequence of statements (and an expression)
|
||||
* ```
|
||||
*/
|
||||
class MacroBlockExpr extends @macro_block_expr, Expr {
|
||||
override string toString() { result = "MacroBlockExpr" }
|
||||
|
||||
/**
|
||||
* Gets the tail expression of this macro block expression, if it exists.
|
||||
*/
|
||||
Expr getTailExpr() { macro_block_expr_tail_exprs(this, result) }
|
||||
|
||||
/**
|
||||
* Gets the `index`th statement of this macro block expression (0-based).
|
||||
*/
|
||||
Stmt getStatement(int index) { macro_block_expr_statements(this, index, result) }
|
||||
|
||||
/**
|
||||
* Gets the tail expression of this macro block expression, if it exists.
|
||||
*/
|
||||
Expr getTailExpr() { macro_block_expr_tail_exprs(this, result) }
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
@@ -2049,12 +2049,6 @@ macro_block_exprs(
|
||||
unique int id: @macro_block_expr
|
||||
);
|
||||
|
||||
#keyset[id]
|
||||
macro_block_expr_tail_exprs(
|
||||
int id: @macro_block_expr ref,
|
||||
int tail_expr: @expr ref
|
||||
);
|
||||
|
||||
#keyset[id, index]
|
||||
macro_block_expr_statements(
|
||||
int id: @macro_block_expr ref,
|
||||
@@ -2062,6 +2056,12 @@ macro_block_expr_statements(
|
||||
int statement: @stmt ref
|
||||
);
|
||||
|
||||
#keyset[id]
|
||||
macro_block_expr_tail_exprs(
|
||||
int id: @macro_block_expr ref,
|
||||
int tail_expr: @expr ref
|
||||
);
|
||||
|
||||
macro_exprs(
|
||||
unique int id: @macro_expr
|
||||
);
|
||||
|
||||
@@ -67,7 +67,7 @@ LifetimeParam/gen_lifetime_param.rs e3f9a417ae7a88a4d81d9cb747b361a3246d270d142f
|
||||
LiteralExpr/gen_literal_expr.rs 2db01ad390e5c0c63a957c043230a462cb4cc25715eea6ede15d43c55d35976d 2db01ad390e5c0c63a957c043230a462cb4cc25715eea6ede15d43c55d35976d
|
||||
LiteralPat/gen_literal_pat.rs a471b481b6989001817a3988696f445d9a4dea784e543c346536dacbee1e96f3 a471b481b6989001817a3988696f445d9a4dea784e543c346536dacbee1e96f3
|
||||
LoopExpr/gen_loop_expr.rs 35deaf35e765db4ae3124a11284266d8f341d1ce7b700030efada0dda8878619 35deaf35e765db4ae3124a11284266d8f341d1ce7b700030efada0dda8878619
|
||||
MacroBlockExpr/gen_macro_block_expr.rs 2e45dcf44bf2e8404b49ce9abeee4931572693174b5d96f3fd81eb40ea8e7b4b 2e45dcf44bf2e8404b49ce9abeee4931572693174b5d96f3fd81eb40ea8e7b4b
|
||||
MacroBlockExpr/gen_macro_block_expr.rs 4284a6e6ad81827d8616a00fec7f5bc21104eed40d93e3acc2b933ee22cb8577 4284a6e6ad81827d8616a00fec7f5bc21104eed40d93e3acc2b933ee22cb8577
|
||||
MacroCall/gen_macro_call.rs c30added613d9edb3cb1321ae46fc6a088a2f22d2cc979119466ec02f6e09ed6 c30added613d9edb3cb1321ae46fc6a088a2f22d2cc979119466ec02f6e09ed6
|
||||
MacroDef/gen_macro_def.rs 6f895ecab8c13a73c28ce67fcee39baf7928745a80fb440811014f6d31b22378 6f895ecab8c13a73c28ce67fcee39baf7928745a80fb440811014f6d31b22378
|
||||
MacroExpr/gen_macro_expr.rs 5e1748356f431eea343a2aad2798c22073151940ea2cda0f0cce78c3d96104f0 5e1748356f431eea343a2aad2798c22073151940ea2cda0f0cce78c3d96104f0
|
||||
|
||||
@@ -1,2 +1 @@
|
||||
| gen_asm_clobber_abi.rs:8:14:8:29 | AsmClobberAbi |
|
||||
| gen_asm_clobber_abi.rs:8:14:8:29 | AsmClobberAbi |
|
||||
|
||||
@@ -1,6 +1,4 @@
|
||||
instances
|
||||
| gen_asm_const.rs:8:30:8:37 | AsmConst | isConst: | yes |
|
||||
| gen_asm_const.rs:8:30:8:37 | AsmConst | isConst: | yes |
|
||||
getExpr
|
||||
| gen_asm_const.rs:8:30:8:37 | AsmConst | gen_asm_const.rs:8:36:8:37 | 42 |
|
||||
| gen_asm_const.rs:8:30:8:37 | AsmConst | gen_asm_const.rs:8:36:8:37 | 42 |
|
||||
|
||||
@@ -1,4 +1,2 @@
|
||||
| gen_asm_dir_spec.rs:8:47:8:49 | AsmDirSpec |
|
||||
| gen_asm_dir_spec.rs:8:47:8:49 | AsmDirSpec |
|
||||
| gen_asm_dir_spec.rs:8:67:8:68 | AsmDirSpec |
|
||||
| gen_asm_dir_spec.rs:8:67:8:68 | AsmDirSpec |
|
||||
|
||||
@@ -1,6 +1,4 @@
|
||||
instances
|
||||
| gen_asm_label.rs:10:9:10:47 | AsmLabel |
|
||||
| gen_asm_label.rs:10:9:10:47 | AsmLabel |
|
||||
getBlockExpr
|
||||
| gen_asm_label.rs:10:9:10:47 | AsmLabel | gen_asm_label.rs:10:15:10:47 | { ... } |
|
||||
| gen_asm_label.rs:10:9:10:47 | AsmLabel | gen_asm_label.rs:10:15:10:47 | { ... } |
|
||||
|
||||
@@ -1,15 +1,9 @@
|
||||
instances
|
||||
| gen_asm_operand_expr.rs:8:35:8:35 | AsmOperandExpr |
|
||||
| gen_asm_operand_expr.rs:8:35:8:35 | AsmOperandExpr |
|
||||
| gen_asm_operand_expr.rs:8:46:8:46 | AsmOperandExpr |
|
||||
| gen_asm_operand_expr.rs:8:46:8:46 | AsmOperandExpr |
|
||||
getInExpr
|
||||
| gen_asm_operand_expr.rs:8:35:8:35 | AsmOperandExpr | gen_asm_operand_expr.rs:8:35:8:35 | x |
|
||||
| gen_asm_operand_expr.rs:8:35:8:35 | AsmOperandExpr | gen_asm_operand_expr.rs:8:35:8:35 | x |
|
||||
| gen_asm_operand_expr.rs:8:46:8:46 | AsmOperandExpr | gen_asm_operand_expr.rs:8:46:8:46 | y |
|
||||
| gen_asm_operand_expr.rs:8:46:8:46 | AsmOperandExpr | gen_asm_operand_expr.rs:8:46:8:46 | y |
|
||||
getOutExpr
|
||||
| gen_asm_operand_expr.rs:8:35:8:35 | AsmOperandExpr | gen_asm_operand_expr.rs:8:35:8:35 | x |
|
||||
| gen_asm_operand_expr.rs:8:35:8:35 | AsmOperandExpr | gen_asm_operand_expr.rs:8:35:8:35 | x |
|
||||
| gen_asm_operand_expr.rs:8:46:8:46 | AsmOperandExpr | gen_asm_operand_expr.rs:8:46:8:46 | y |
|
||||
| gen_asm_operand_expr.rs:8:46:8:46 | AsmOperandExpr | gen_asm_operand_expr.rs:8:46:8:46 | y |
|
||||
|
||||
@@ -1,13 +1,8 @@
|
||||
instances
|
||||
| gen_asm_operand_named.rs:8:34:8:43 | AsmOperandNamed |
|
||||
| gen_asm_operand_named.rs:8:34:8:43 | AsmOperandNamed |
|
||||
| gen_asm_operand_named.rs:8:46:8:62 | AsmOperandNamed |
|
||||
| gen_asm_operand_named.rs:8:46:8:62 | AsmOperandNamed |
|
||||
getAsmOperand
|
||||
| gen_asm_operand_named.rs:8:34:8:43 | AsmOperandNamed | gen_asm_operand_named.rs:8:34:8:43 | AsmRegOperand |
|
||||
| gen_asm_operand_named.rs:8:34:8:43 | AsmOperandNamed | gen_asm_operand_named.rs:8:34:8:43 | AsmRegOperand |
|
||||
| gen_asm_operand_named.rs:8:46:8:62 | AsmOperandNamed | gen_asm_operand_named.rs:8:54:8:62 | AsmRegOperand |
|
||||
| gen_asm_operand_named.rs:8:46:8:62 | AsmOperandNamed | gen_asm_operand_named.rs:8:54:8:62 | AsmRegOperand |
|
||||
getName
|
||||
| gen_asm_operand_named.rs:8:46:8:62 | AsmOperandNamed | gen_asm_operand_named.rs:8:46:8:50 | input |
|
||||
| gen_asm_operand_named.rs:8:46:8:62 | AsmOperandNamed | gen_asm_operand_named.rs:8:46:8:50 | input |
|
||||
|
||||
@@ -1,4 +1,2 @@
|
||||
| gen_asm_option.rs:8:22:8:28 | AsmOption | isRaw: | no |
|
||||
| gen_asm_option.rs:8:22:8:28 | AsmOption | isRaw: | no |
|
||||
| gen_asm_option.rs:8:31:8:35 | AsmOption | isRaw: | no |
|
||||
| gen_asm_option.rs:8:31:8:35 | AsmOption | isRaw: | no |
|
||||
|
||||
@@ -1,8 +1,5 @@
|
||||
instances
|
||||
| gen_asm_options_list.rs:8:14:8:36 | AsmOptionsList |
|
||||
| gen_asm_options_list.rs:8:14:8:36 | AsmOptionsList |
|
||||
getAsmOption
|
||||
| gen_asm_options_list.rs:8:14:8:36 | AsmOptionsList | 0 | gen_asm_options_list.rs:8:22:8:28 | AsmOption |
|
||||
| gen_asm_options_list.rs:8:14:8:36 | AsmOptionsList | 0 | gen_asm_options_list.rs:8:22:8:28 | AsmOption |
|
||||
| gen_asm_options_list.rs:8:14:8:36 | AsmOptionsList | 1 | gen_asm_options_list.rs:8:31:8:35 | AsmOption |
|
||||
| gen_asm_options_list.rs:8:14:8:36 | AsmOptionsList | 1 | gen_asm_options_list.rs:8:31:8:35 | AsmOption |
|
||||
|
||||
@@ -1,20 +1,12 @@
|
||||
instances
|
||||
| gen_asm_reg_operand.rs:8:26:8:35 | AsmRegOperand |
|
||||
| gen_asm_reg_operand.rs:8:26:8:35 | AsmRegOperand |
|
||||
| gen_asm_reg_operand.rs:8:38:8:46 | AsmRegOperand |
|
||||
| gen_asm_reg_operand.rs:8:38:8:46 | AsmRegOperand |
|
||||
getAsmDirSpec
|
||||
| gen_asm_reg_operand.rs:8:26:8:35 | AsmRegOperand | gen_asm_reg_operand.rs:8:26:8:28 | AsmDirSpec |
|
||||
| gen_asm_reg_operand.rs:8:26:8:35 | AsmRegOperand | gen_asm_reg_operand.rs:8:26:8:28 | AsmDirSpec |
|
||||
| gen_asm_reg_operand.rs:8:38:8:46 | AsmRegOperand | gen_asm_reg_operand.rs:8:38:8:39 | AsmDirSpec |
|
||||
| gen_asm_reg_operand.rs:8:38:8:46 | AsmRegOperand | gen_asm_reg_operand.rs:8:38:8:39 | AsmDirSpec |
|
||||
getAsmOperandExpr
|
||||
| gen_asm_reg_operand.rs:8:26:8:35 | AsmRegOperand | gen_asm_reg_operand.rs:8:35:8:35 | AsmOperandExpr |
|
||||
| gen_asm_reg_operand.rs:8:26:8:35 | AsmRegOperand | gen_asm_reg_operand.rs:8:35:8:35 | AsmOperandExpr |
|
||||
| gen_asm_reg_operand.rs:8:38:8:46 | AsmRegOperand | gen_asm_reg_operand.rs:8:46:8:46 | AsmOperandExpr |
|
||||
| gen_asm_reg_operand.rs:8:38:8:46 | AsmRegOperand | gen_asm_reg_operand.rs:8:46:8:46 | AsmOperandExpr |
|
||||
getAsmRegSpec
|
||||
| gen_asm_reg_operand.rs:8:26:8:35 | AsmRegOperand | gen_asm_reg_operand.rs:8:30:8:32 | AsmRegSpec |
|
||||
| gen_asm_reg_operand.rs:8:26:8:35 | AsmRegOperand | gen_asm_reg_operand.rs:8:30:8:32 | AsmRegSpec |
|
||||
| gen_asm_reg_operand.rs:8:38:8:46 | AsmRegOperand | gen_asm_reg_operand.rs:8:41:8:43 | AsmRegSpec |
|
||||
| gen_asm_reg_operand.rs:8:38:8:46 | AsmRegOperand | gen_asm_reg_operand.rs:8:41:8:43 | AsmRegSpec |
|
||||
|
||||
@@ -1,8 +1,5 @@
|
||||
instances
|
||||
| gen_asm_reg_spec.rs:8:30:8:34 | AsmRegSpec |
|
||||
| gen_asm_reg_spec.rs:8:30:8:34 | AsmRegSpec |
|
||||
| gen_asm_reg_spec.rs:8:43:8:45 | AsmRegSpec |
|
||||
| gen_asm_reg_spec.rs:8:43:8:45 | AsmRegSpec |
|
||||
getIdentifier
|
||||
| gen_asm_reg_spec.rs:8:43:8:45 | AsmRegSpec | gen_asm_reg_spec.rs:8:43:8:45 | EBX |
|
||||
| gen_asm_reg_spec.rs:8:43:8:45 | AsmRegSpec | gen_asm_reg_spec.rs:8:43:8:45 | EBX |
|
||||
|
||||
@@ -1,6 +1,4 @@
|
||||
instances
|
||||
| gen_asm_sym.rs:8:30:8:44 | AsmSym |
|
||||
| gen_asm_sym.rs:8:30:8:44 | AsmSym |
|
||||
getPath
|
||||
| gen_asm_sym.rs:8:30:8:44 | AsmSym | gen_asm_sym.rs:8:34:8:44 | my_function |
|
||||
| gen_asm_sym.rs:8:30:8:44 | AsmSym | gen_asm_sym.rs:8:34:8:44 | my_function |
|
||||
|
||||
@@ -1,5 +1,7 @@
|
||||
instances
|
||||
| gen_macro_block_expr.rs:5:14:5:28 | MacroBlockExpr |
|
||||
getTailExpr
|
||||
| gen_macro_block_expr.rs:5:14:5:28 | MacroBlockExpr | gen_macro_block_expr.rs:5:14:5:28 | { ... } |
|
||||
| gen_macro_block_expr.rs:13:5:13:13 | MacroBlockExpr |
|
||||
getStatement
|
||||
| gen_macro_block_expr.rs:13:5:13:13 | MacroBlockExpr | 0 | gen_macro_block_expr.rs:13:5:13:13 | let ... = 40 |
|
||||
| gen_macro_block_expr.rs:13:5:13:13 | MacroBlockExpr | 1 | gen_macro_block_expr.rs:13:5:13:13 | ExprStmt |
|
||||
getTailExpr
|
||||
| gen_macro_block_expr.rs:13:5:13:13 | MacroBlockExpr | gen_macro_block_expr.rs:13:5:13:13 | x |
|
||||
|
||||
@@ -4,10 +4,10 @@ import TestUtils
|
||||
|
||||
query predicate instances(MacroBlockExpr x) { toBeTested(x) and not x.isUnknown() }
|
||||
|
||||
query predicate getTailExpr(MacroBlockExpr x, Expr getTailExpr) {
|
||||
toBeTested(x) and not x.isUnknown() and getTailExpr = x.getTailExpr()
|
||||
}
|
||||
|
||||
query predicate getStatement(MacroBlockExpr x, int index, Stmt getStatement) {
|
||||
toBeTested(x) and not x.isUnknown() and getStatement = x.getStatement(index)
|
||||
}
|
||||
|
||||
query predicate getTailExpr(MacroBlockExpr x, Expr getTailExpr) {
|
||||
toBeTested(x) and not x.isUnknown() and getTailExpr = x.getTailExpr()
|
||||
}
|
||||
|
||||
@@ -1,6 +1,14 @@
|
||||
// generated by codegen, do not edit
|
||||
|
||||
// A sequence of statements generated by a `MacroCall`. For example:
|
||||
fn main() {
|
||||
println!("Hello, world!"); // This macro expands into a list of statements
|
||||
fn test_macro_block_expr() -> () {
|
||||
// A sequence of statements generated by a `MacroCall`. For example:
|
||||
macro_rules! my_macro {
|
||||
() => {
|
||||
let mut x = 40;
|
||||
x += 2;
|
||||
x
|
||||
};
|
||||
}
|
||||
|
||||
my_macro!(); // this macro expands to a sequence of statements (and an expression)
|
||||
}
|
||||
|
||||
@@ -1404,17 +1404,25 @@ class _:
|
||||
"""
|
||||
|
||||
|
||||
@annotate(MacroBlockExpr, replace_bases={AstNode: Expr}, cfg=True)
|
||||
@rust.doc_test_signature(None)
|
||||
class _:
|
||||
class MacroBlockExpr(Expr):
|
||||
"""
|
||||
A sequence of statements generated by a `MacroCall`. For example:
|
||||
```rust
|
||||
fn main() {
|
||||
println!("Hello, world!"); // This macro expands into a list of statements
|
||||
macro_rules! my_macro {
|
||||
() => {
|
||||
let mut x = 40;
|
||||
x += 2;
|
||||
x
|
||||
};
|
||||
}
|
||||
|
||||
my_macro!(); // this macro expands to a sequence of statements (and an expression)
|
||||
```
|
||||
"""
|
||||
__cfg__ = True
|
||||
|
||||
statements: list[Stmt] | child
|
||||
tail_expr: optional[Expr] | child
|
||||
|
||||
|
||||
@annotate(MacroTypeRepr)
|
||||
|
||||
4
rust/schema/ast.py
generated
4
rust/schema/ast.py
generated
@@ -399,10 +399,6 @@ class MacroRules(Item, ):
|
||||
token_tree: optional["TokenTree"] | child
|
||||
visibility: optional["Visibility"] | child
|
||||
|
||||
class MacroBlockExpr(AstNode, ):
|
||||
tail_expr: optional["Expr"] | child
|
||||
statements: list["Stmt"] | child
|
||||
|
||||
class MacroTypeRepr(TypeRepr, ):
|
||||
macro_call: optional["MacroCall"] | child
|
||||
|
||||
|
||||
Reference in New Issue
Block a user