use proc_macro2::TokenStream;
use quote::quote;
use syn::ItemFn;
pub(crate) fn expand_extern_abi(input_fn: ItemFn) -> TokenStream {
let fn_name = &input_fn.sig.ident;
let fn_inputs = &input_fn.sig.inputs;
let fn_output = &input_fn.sig.output;
let fn_block = &input_fn.block;
let fn_generics = &input_fn.sig.generics;
let fn_where_clause = &input_fn.sig.generics.where_clause;
let fn_vis = &input_fn.vis;
let fn_attrs = &input_fn.attrs;
if input_fn.sig.abi.is_some() {
return quote! {
compile_error!("Function already has an extern ABI specification. Remove it to use #[extern_abi].");
};
}
quote! {
#(#fn_attrs)*
#[cfg(target_family = "wasm")]
#fn_vis extern "C" fn #fn_name #fn_generics(#fn_inputs) #fn_output #fn_where_clause #fn_block
#(#fn_attrs)*
#[cfg(not(target_family = "wasm"))]
#fn_vis extern "C-unwind" fn #fn_name #fn_generics(#fn_inputs) #fn_output #fn_where_clause #fn_block
}
}