rdc-macros 0.1.0

Macros for rdc crate
Documentation
use proc_macro2::{Ident, TokenStream};
use quote::{quote};
use syn::{Generics, WhereClause, GenericParam};

pub fn implement_java_types(name: &Ident, generics: &Generics, where_clause: &Option<WhereClause>) -> TokenStream {
    let type_name = match generics.params.len() {
        0 => quote!(
            stringify!(#name).to_string()
        ),
        _ => {
            let generic_types = generics.params.iter().map(|param: &GenericParam| {
                quote!(rdc::ir::TypeTarget::Java.resolve_type::<#param>().type_name())
            });
            quote!({
                let mut type_string = stringify!(#name).to_string();
                #(type_string.push_str(#generic_types);)*
                type_string
            })
        }
    };
    quote!(
        impl #generics rdc::targets::java::type_resolver::JavaCustomType for #name #generics #where_clause {
            fn java_custom_type() -> rdc::ir::CustomType {
                rdc::ir::CustomType::new(#type_name)
            }
        }

        impl #generics rdc::targets::java::type_resolver::JavaType for #name #generics #where_clause {
            fn java_type() -> rdc::ir::Type {
                rdc::ir::Type::new(#type_name)
            }
        }

    )
}