#![doc = include_str!("../README.md")]
use quote::ToTokens;
use syn::punctuated::Punctuated;
use syn::token;
use syn::{parse_macro_input, ItemImpl};
mod change_self;
mod dummy;
mod mac;
mod transform;
struct IdentList(Punctuated<syn::Ident, token::Comma>);
impl syn::parse::Parse for IdentList {
fn parse(input: syn::parse::ParseStream) -> syn::Result<Self> {
Ok(IdentList(
input.parse_terminated(syn::Ident::parse, token::Comma)?,
))
}
}
#[proc_macro_attribute]
pub fn abstract_impl(
_attr: proc_macro::TokenStream,
item: proc_macro::TokenStream,
) -> proc_macro::TokenStream {
let parsed = parse_macro_input!(item as ItemImpl);
let IdentList(attrs) = parse_macro_input!(_attr);
let res = match transform::transform(
parsed,
attrs.iter().all(|attr| attr.to_string() != "no_dummy"),
attrs.iter().all(|attr| attr.to_string() != "no_macro"),
attrs.iter().any(|attr| attr.to_string() == "legacy_order"),
) {
Ok(res) => res,
Err(e) => return e.into_compile_error().into(),
};
res.to_token_stream().into()
}