extern crate proc_macro;
use cglue_gen::ext::{ext_abs_remap, prelude_remap_with_ident};
use cglue_gen::forward::gen_forward;
use cglue_gen::generics::{GenericCastType, GenericType};
use cglue_gen::trait_groups::*;
use proc_macro::TokenStream;
use quote::ToTokens;
use quote::{format_ident, quote};
use syn::*;
#[proc_macro_attribute]
pub fn cglue_trait(_args: TokenStream, input: TokenStream) -> TokenStream {
let tr = parse_macro_input!(input as ItemTrait);
let trait_def = cglue_gen::traits::gen_trait(tr, None);
trait_def.into()
}
#[proc_macro_attribute]
pub fn cglue_trait_ext(_args: TokenStream, input: TokenStream) -> TokenStream {
let tr = parse_macro_input!(input as ItemTrait);
let ext_ident = format_ident!("{}Ext", tr.ident);
let trait_def = cglue_gen::traits::gen_trait(tr, Some(&ext_ident));
trait_def.into()
}
#[proc_macro]
pub fn trait_obj(args: TokenStream) -> TokenStream {
let crate_path = cglue_gen::util::crate_path();
let GenericCastType {
ident,
target:
GenericType {
path,
target,
generics,
..
},
} = parse_macro_input!(args as GenericCastType);
let path = if let Ok(ident) = parse2::<Ident>(target.clone()) {
ext_abs_remap(prelude_remap_with_ident(path, &ident))
} else {
path
};
let target = format_ident!("{}Base", target.to_token_stream().to_string());
let gen = quote! {
#crate_path::trait_group::Opaquable::into_opaque({
use #crate_path::from2::From2;
#path #target :: <#generics>::from2(#ident)
})
};
gen.into()
}
#[proc_macro]
pub fn cglue_trait_group(args: TokenStream) -> TokenStream {
let args = parse_macro_input!(args as TraitGroup);
args.create_group().into()
}
#[proc_macro]
#[cfg_attr(feature = "unstable", allow(unused))]
pub fn cglue_impl_group(args: TokenStream) -> TokenStream {
#[cfg(not(feature = "unstable"))]
{
let args = parse_macro_input!(args as TraitGroupImpl);
args.implement_group().into()
}
#[cfg(feature = "unstable")]
TokenStream::new()
}
#[proc_macro]
pub fn group_obj(args: TokenStream) -> TokenStream {
let crate_path = cglue_gen::util::crate_path();
let GenericCastType {
ident,
target:
GenericType {
path,
target,
generics,
..
},
} = parse_macro_input!(args as GenericCastType);
let path = if let Ok(ident) = parse2::<Ident>(target.clone()) {
ext_abs_remap(prelude_remap_with_ident(path, &ident))
} else {
path
};
let gen = quote! {
#crate_path::trait_group::Opaquable::into_opaque({
use #crate_path::from2::From2;
#path #target :: <#generics>::from2(#ident)
})
};
gen.into()
}
#[proc_macro]
pub fn cast(args: TokenStream) -> TokenStream {
let cast = parse_macro_input!(args as TraitCastGroup);
cast.cast_group(CastType::Cast).into()
}
#[proc_macro]
pub fn as_ref(args: TokenStream) -> TokenStream {
let cast = parse_macro_input!(args as TraitCastGroup);
cast.cast_group(CastType::AsRef).into()
}
#[proc_macro]
pub fn as_mut(args: TokenStream) -> TokenStream {
let cast = parse_macro_input!(args as TraitCastGroup);
cast.cast_group(CastType::AsMut).into()
}
#[proc_macro]
pub fn into(args: TokenStream) -> TokenStream {
let cast = parse_macro_input!(args as TraitCastGroup);
cast.cast_group(CastType::Into).into()
}
#[proc_macro]
pub fn check(args: TokenStream) -> TokenStream {
let cast = parse_macro_input!(args as TraitCastGroup);
cast.cast_group(CastType::OnlyCheck).into()
}
#[proc_macro]
pub fn cglue_builtin_ext_traits(_: TokenStream) -> TokenStream {
cglue_gen::ext::impl_store().into()
}
#[proc_macro_attribute]
pub fn cglue_forward(_: TokenStream, input: TokenStream) -> TokenStream {
let tr = parse_macro_input!(input as ItemTrait);
gen_forward(tr, None).into()
}
#[proc_macro_attribute]
pub fn cglue_forward_ext(args: TokenStream, input: TokenStream) -> TokenStream {
let path = parse_macro_input!(args as proc_macro2::TokenStream);
let tr = parse_macro_input!(input as ItemTrait);
gen_forward(tr, Some(path)).into()
}
#[proc_macro]
pub fn cglue_builtin_ext_forward(_: TokenStream) -> TokenStream {
cglue_gen::ext::impl_ext_forward().into()
}
#[proc_macro_attribute]
pub fn int_result(_: TokenStream, input: TokenStream) -> TokenStream {
input
}
#[proc_macro_attribute]
pub fn no_int_result(_: TokenStream, input: TokenStream) -> TokenStream {
input
}
#[proc_macro_attribute]
pub fn skip_func(_: TokenStream, input: TokenStream) -> TokenStream {
input
}
#[proc_macro_attribute]
pub fn wrap_with(_: TokenStream, input: TokenStream) -> TokenStream {
input
}
#[proc_macro_attribute]
pub fn return_wrap(_: TokenStream, input: TokenStream) -> TokenStream {
input
}
#[proc_macro_attribute]
pub fn wrap_with_obj(_: TokenStream, input: TokenStream) -> TokenStream {
input
}
#[proc_macro_attribute]
pub fn wrap_with_obj_ref(_: TokenStream, input: TokenStream) -> TokenStream {
input
}
#[proc_macro_attribute]
pub fn wrap_with_obj_mut(_: TokenStream, input: TokenStream) -> TokenStream {
input
}
#[proc_macro_attribute]
pub fn wrap_with_group(_: TokenStream, input: TokenStream) -> TokenStream {
input
}
#[proc_macro_attribute]
pub fn wrap_with_group_ref(_: TokenStream, input: TokenStream) -> TokenStream {
input
}
#[proc_macro_attribute]
pub fn wrap_with_group_mut(_: TokenStream, input: TokenStream) -> TokenStream {
input
}
#[proc_macro_attribute]
pub fn vtbl_only(_: TokenStream, input: TokenStream) -> TokenStream {
input
}