41 lines
1.1 KiB
Rust
41 lines
1.1 KiB
Rust
//@ force-host
|
|
//@ no-prefer-dynamic
|
|
|
|
#![feature(proc_macro_quote)]
|
|
|
|
#![crate_type = "proc-macro"]
|
|
|
|
extern crate proc_macro;
|
|
use proc_macro::*;
|
|
|
|
#[proc_macro]
|
|
pub fn proc_macro_rules(input: TokenStream) -> TokenStream {
|
|
if input.is_empty() {
|
|
let id = |s| TokenTree::from(Ident::new(s, Span::mixed_site()));
|
|
let item_def = id("ItemDef");
|
|
let local_def = id("local_def");
|
|
let item_use = id("ItemUse");
|
|
let local_use = id("local_use");
|
|
let mut single_quote = Punct::new('\'', Spacing::Joint);
|
|
single_quote.set_span(Span::mixed_site());
|
|
let label_use: TokenStream = [
|
|
TokenTree::from(single_quote),
|
|
id("label_use"),
|
|
].iter().cloned().collect();
|
|
quote!(
|
|
struct $item_def;
|
|
let $local_def = 0;
|
|
|
|
$item_use; // OK
|
|
$local_use; // ERROR
|
|
break $label_use; // ERROR
|
|
)
|
|
} else {
|
|
let mut dollar_crate = input.into_iter().next().unwrap();
|
|
dollar_crate.set_span(Span::mixed_site());
|
|
quote!(
|
|
type A = $dollar_crate::ItemUse;
|
|
)
|
|
}
|
|
}
|