#![doc = include_str!("../README.md")]
#![deny(missing_debug_implementations)]
#![deny(missing_docs)]
use proc_macro::TokenStream;
struct SignatureWithSemicolon {
attrs: Vec<syn::Attribute>,
vis: syn::Visibility,
sig: syn::Signature,
_semicolon_token: syn::Token![;],
}
impl syn::parse::Parse for SignatureWithSemicolon {
fn parse(input: syn::parse::ParseStream) -> syn::Result<Self> {
let outer_attrs = input.call(syn::Attribute::parse_outer)?;
let vis = input.parse()?;
let sig = input.parse()?;
Ok(Self {
attrs: outer_attrs,
vis,
sig,
_semicolon_token: input.parse()?,
})
}
}
#[proc_macro_attribute]
pub fn unimpl(_attr: TokenStream, item: TokenStream) -> TokenStream {
let input = syn::parse_macro_input!(item as SignatureWithSemicolon);
let fn_name = input.sig.ident.to_string();
let attrs = input.attrs;
let signature = input.sig;
let vis = input.vis;
let output = quote::quote! {
#(#attrs)*
#vis
#signature
{
unimplemented!(#fn_name);
}
};
output.into()
}