xref: /DragonOS/kernel/crates/intertrait/macros/src/item_type.rs (revision bd70d2d1f490aabd570a5301b858bd5eb04149fa)
1*bd70d2d1SLoGin use hashbrown::HashSet;
2*bd70d2d1SLoGin use proc_macro2::TokenStream;
3*bd70d2d1SLoGin use syn::spanned::Spanned;
4*bd70d2d1SLoGin use syn::{DeriveInput, Path};
5*bd70d2d1SLoGin 
6*bd70d2d1SLoGin use quote::{quote, quote_spanned};
7*bd70d2d1SLoGin 
8*bd70d2d1SLoGin use crate::args::Flag;
9*bd70d2d1SLoGin use crate::gen_caster::generate_caster;
10*bd70d2d1SLoGin 
process(flags: &HashSet<Flag>, paths: Vec<Path>, input: DeriveInput) -> TokenStream11*bd70d2d1SLoGin pub fn process(flags: &HashSet<Flag>, paths: Vec<Path>, input: DeriveInput) -> TokenStream {
12*bd70d2d1SLoGin     let DeriveInput {
13*bd70d2d1SLoGin         ref ident,
14*bd70d2d1SLoGin         ref generics,
15*bd70d2d1SLoGin         ..
16*bd70d2d1SLoGin     } = input;
17*bd70d2d1SLoGin     let generated = if generics.lt_token.is_some() {
18*bd70d2d1SLoGin         quote_spanned! {
19*bd70d2d1SLoGin             generics.span() => compile_error!("#[cast_to(..)] can't be used on a generic type definition");
20*bd70d2d1SLoGin         }
21*bd70d2d1SLoGin     } else {
22*bd70d2d1SLoGin         paths
23*bd70d2d1SLoGin             .into_iter()
24*bd70d2d1SLoGin             .flat_map(|t| generate_caster(ident, &t, flags.contains(&Flag::Sync)))
25*bd70d2d1SLoGin             .collect()
26*bd70d2d1SLoGin     };
27*bd70d2d1SLoGin     quote! {
28*bd70d2d1SLoGin         #input
29*bd70d2d1SLoGin         #generated
30*bd70d2d1SLoGin     }
31*bd70d2d1SLoGin }
32