extern crate proc_macro;
use proc_macro::*;
use syn::{parse_macro_input, Expr};
use quote::{quote};
fn is_conservatively_const(expr: &Expr) -> bool {
match expr {
Expr::Lit(lit) => {
lit.attrs.is_empty()
}
Expr::Group(group) => {
is_conservatively_const(&group.expr)
}
_ => false,
}
}
#[proc_macro]
pub fn try_js_intern(input: TokenStream) -> TokenStream {
let orig = input.clone();
let expr = parse_macro_input!(input as Expr);
if is_conservatively_const(&expr) {
quote!({
use js_intern::js_intern;
js_intern!(#expr)
}).into()
} else {
orig
}
}