Unnamed repository; edit this file 'description' to name the repository.
Diffstat (limited to 'crates/base_db/src/fixture.rs')
| -rw-r--r-- | crates/base_db/src/fixture.rs | 34 |
1 files changed, 34 insertions, 0 deletions
diff --git a/crates/base_db/src/fixture.rs b/crates/base_db/src/fixture.rs index 900032b4cb..27be3746b7 100644 --- a/crates/base_db/src/fixture.rs +++ b/crates/base_db/src/fixture.rs @@ -262,6 +262,10 @@ pub fn identity(_attr: TokenStream, item: TokenStream) -> TokenStream { pub fn input_replace(attr: TokenStream, _item: TokenStream) -> TokenStream { attr } +#[proc_macro] +pub fn mirror(input: TokenStream) -> TokenStream { + input +} "#; let proc_macros = std::array::IntoIter::new([ ProcMacro { @@ -274,6 +278,11 @@ pub fn input_replace(attr: TokenStream, _item: TokenStream) -> TokenStream { kind: crate::ProcMacroKind::Attr, expander: Arc::new(AttributeInputReplaceProcMacroExpander), }, + ProcMacro { + name: "mirror".into(), + kind: crate::ProcMacroKind::FuncLike, + expander: Arc::new(MirrorProcMacroExpander), + }, ]) .filter(|pm| proc_macros.iter().any(|name| name == pm.name)) .collect(); @@ -348,3 +357,28 @@ impl ProcMacroExpander for AttributeInputReplaceProcMacroExpander { .ok_or_else(|| ProcMacroExpansionError::Panic("Expected attribute input".into())) } } + +#[derive(Debug)] +struct MirrorProcMacroExpander; +impl ProcMacroExpander for MirrorProcMacroExpander { + fn expand( + &self, + input: &Subtree, + _: Option<&Subtree>, + _: &Env, + ) -> Result<Subtree, ProcMacroExpansionError> { + fn traverse(input: &Subtree) -> Subtree { + let mut res = Subtree::default(); + res.delimiter = input.delimiter; + for tt in input.token_trees.iter().rev() { + let tt = match tt { + tt::TokenTree::Leaf(leaf) => tt::TokenTree::Leaf(leaf.clone()), + tt::TokenTree::Subtree(sub) => tt::TokenTree::Subtree(traverse(sub)), + }; + res.token_trees.push(tt); + } + res + } + Ok(traverse(input)) + } +} |