1#![feature(proc_macro_expand)]
4
5extern crate proc_macro;
6use proc_macro::TokenStream;
7
8#[proc_macro_attribute]
24pub fn cfg_(attr: TokenStream, item: TokenStream) -> TokenStream {
25 let attr = proc_macro2::TokenStream::from(attr);
26 let item = proc_macro2::TokenStream::from(item);
27
28 let attr_text = attr.to_string();
29
30 let to_expand: proc_macro2::TokenStream = quote::quote! {
31 ::core::cfg!( #attr )
32 };
33 let to_expand: TokenStream = to_expand.into();
34 let expanded = to_expand.expand_expr().unwrap();
35
36 let enabled = expanded.to_string() == "true";
37
38 if enabled {
39 quote::quote! {
40 #![feature(prelude_import)]
41 #![allow(internal_features)]
42 #![allow(unused_imports)]
43
44 #item
45 }
46 .into()
47 } else {
48 quote::quote! {
49 #![feature(prelude_import)]
52 #![allow(internal_features)]
53 #![allow(missing_docs)]
54
55 #[macro_use]
56 extern crate std;
57
58 #[prelude_import]
59 use std::prelude::v1::*;
60
61 fn main() {
63 unimplemented!(#attr_text);
64 }
65 }
66 .into()
67 }
68}