]> git.proxmox.com Git - rustc.git/blob - src/test/ui/proc-macro/auxiliary/cond_plugin.rs
New upstream version 1.58.1+dfsg1
[rustc.git] / src / test / ui / proc-macro / auxiliary / cond_plugin.rs
1 // force-host
2 // no-prefer-dynamic
3
4 #![crate_type = "proc-macro"]
5 #![feature(proc_macro_quote)]
6
7 extern crate proc_macro;
8
9 use proc_macro::*;
10
11 #[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"),
19 };
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>();
23 if rhs.is_empty() {
24 panic!("Invalid macro usage in cond: {}", cond);
25 }
26 let is_else = match test {
27 TokenTree::Ident(ref word) => &*word.to_string() == "else",
28 _ => false,
29 };
30 conds.push(if is_else || input.peek().is_none() {
31 quote!({ $rhs })
32 } else {
33 quote!(if $test { $rhs } else)
34 });
35 }
36
37 conds.into_iter().flat_map(|x| x.into_iter()).collect()
38 }