]>
git.proxmox.com Git - rustc.git/blob - src/test/ui/proc-macro/auxiliary/cond_plugin.rs
4 #![crate_type = "proc-macro"]
5 #![feature(proc_macro_quote)]
7 extern crate proc_macro
;
12 pub fn cond(input
: TokenStream
) -> TokenStream
{
13 let mut conds
= Vec
::new();
14 let mut input
= input
.into_iter().peekable();
15 while let Some(tree
) = input
.next() {
16 let cond
= match tree
{
17 TokenTree
::Group(tt
) => tt
.stream(),
18 _
=> panic
!("Invalid input"),
20 let mut cond_trees
= cond
.clone().into_iter();
21 let test
= cond_trees
.next().expect("Unexpected empty condition in `cond!`");
22 let rhs
= cond_trees
.collect
::<TokenStream
>();
24 panic
!("Invalid macro usage in cond: {}", cond
);
26 let is_else
= match test
{
27 TokenTree
::Ident(ref word
) => &*word
.to_string() == "else",
30 conds
.push(if is_else
|| input
.peek().is_none() {
33 quote
!(if $test { $rhs }
else)
37 conds
.into_iter().flat_map(|x
| x
.into_iter()).collect()