]> git.lizzy.rs Git - rust.git/blob - src/test/ui/auxiliary/cond_plugin.rs
Merge commit 'cd4810de42c57b64b74dae09c530a4c3a41f87b9' into libgccjit-codegen
[rust.git] / src / test / ui / 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 }