rdc_macros/targets/
java.rs

1use proc_macro2::{Ident, TokenStream};
2use quote::{quote};
3use syn::{Generics, WhereClause, GenericParam};
4
5pub fn implement_java_types(name: &Ident, generics: &Generics, where_clause: &Option<WhereClause>) -> TokenStream {
6    let type_name = match generics.params.len() {
7        0 => quote!(
8            stringify!(#name).to_string()
9        ),
10        _ => {
11            let generic_types = generics.params.iter().map(|param: &GenericParam| {
12                quote!(rdc::ir::TypeTarget::Java.resolve_type::<#param>().type_name())
13            });
14            quote!({
15                let mut type_string = stringify!(#name).to_string();
16                #(type_string.push_str(#generic_types);)*
17                type_string
18            })
19        }
20    };
21    quote!(
22        impl #generics rdc::targets::java::type_resolver::JavaCustomType for #name #generics #where_clause {
23            fn java_custom_type() -> rdc::ir::CustomType {
24                rdc::ir::CustomType::new(#type_name)
25            }
26        }
27
28        impl #generics rdc::targets::java::type_resolver::JavaType for #name #generics #where_clause {
29            fn java_type() -> rdc::ir::Type {
30                rdc::ir::Type::new(#type_name)
31            }
32        }
33
34    )
35}