abi_stable_derive/sabi_trait/
common_tokens.rs

1//! This module defines the CommonTokens type,
2//! used to pass constants of type from `syn` to
3//! many functions in the `abi_stable_derive_lib::sabi_trait` module.
4
5use proc_macro2::{Span, TokenStream};
6
7use std::cmp::{Eq, Ord, Ordering, PartialEq, PartialOrd};
8
9macro_rules! declare_common_tokens {
10    (
11        abi[ $( $field_abi:ident = $abi_str:expr , )* ]
12        type_param_bound[ $( $field_ty_param_bound:ident = $ty_param_bound_str:expr , )* ]
13        token_streams[ $( $field_ts:ident = $ts_str:expr , )* ]
14        types[ $( $field_ty:ident = $ty_str:expr , )* ]
15        idents[ $( $field_ident:ident = $ident_str:expr , )* ]
16        lifetime[ $( $lifetime_ident:ident = $lifetime_str:expr , )* ]
17        str_lits[ $( $strlit_ident:ident = $strlit_str:expr , )* ]
18        patterns[ $( $pat_ident:ident = $pat_str:expr , )* ]
19        token[ $( $token_ident:ident = $token_path:ident , )* ]
20    ) => {
21        #[derive(Debug)]
22        pub(crate) struct CommonTokens{
23            $( pub(crate) $field_abi : ::syn::Abi , )*
24            $( pub(crate) $field_ty_param_bound : ::syn::TypeParamBound , )*
25            $( pub(crate) $field_ts : TokenStream , )*
26            $( pub(crate) $field_ty : ::syn::Type , )*
27            $( pub(crate) $field_ident : ::syn::Ident , )*
28            $( pub(crate) $lifetime_ident : ::syn::Lifetime , )*
29            $( pub(crate) $strlit_ident : ::syn::LitStr , )*
30            $( pub(crate) $pat_ident : ::syn::Pat , )*
31            $( pub(crate) $token_ident : ::syn::token::$token_path , )*
32        }
33
34        impl CommonTokens{
35            #[allow(unused_variables)]
36            pub(crate) fn new()->Self{
37                let span=Span::call_site();
38                Self{
39                    $( $field_abi : ::syn::parse_str($abi_str).unwrap(), )*
40                    $( $field_ty_param_bound : ::syn::parse_str($ty_param_bound_str).unwrap(), )*
41                    $( $field_ts : ::syn::parse_str($ts_str).unwrap() , )*
42                    $( $field_ty : ::syn::parse_str($ty_str).unwrap() , )*
43                    $( $field_ident : ::syn::Ident::new($ident_str,span) , )*
44                    $( $lifetime_ident : ::syn::parse_str($lifetime_str).unwrap() , )*
45                    $( $strlit_ident : ::syn::LitStr::new($strlit_str,span) , )*
46                    $( $pat_ident : ::syn::parse_str($pat_str).unwrap() , )*
47                    $( $token_ident : Default::default() , )*
48                }
49            }
50        }
51    }
52}
53
54impl Eq for CommonTokens {}
55impl PartialEq for CommonTokens {
56    fn eq(&self, _other: &Self) -> bool {
57        true
58    }
59}
60
61impl PartialOrd for CommonTokens {
62    fn partial_cmp(&self, _other: &Self) -> Option<Ordering> {
63        Some(Ordering::Equal)
64    }
65}
66
67impl Ord for CommonTokens {
68    fn cmp(&self, _other: &Self) -> Ordering {
69        Ordering::Equal
70    }
71}
72
73declare_common_tokens! {
74    abi[
75        extern_c=r#"extern "C" "#,
76    ]
77
78    type_param_bound[
79        sized_bound="Sized",
80        // ref_self_ty="&self",
81        // mut_self_ty="&mut Self",
82        // val_self_ty="Self",
83        // ref_uself_ty="&__ErasedObject<_Self>",
84        // mut_uself_ty="&mut __ErasedObject<_Self>",
85        // val_uself_ty="__sabi_re::MovePtr<'_,_Self>",
86    ]
87
88    token_streams[
89        self_sized="Self:Sized,",
90
91        ptr_ref_bound=
92            "_ErasedPtr: __sabi_re::AsPtr<PtrTarget=()>,",
93        ptr_mut_bound=
94            "_ErasedPtr: __sabi_re::AsMutPtr<PtrTarget=()>,",
95        ptr_ref_val_bound=
96            "_ErasedPtr: __sabi_re::OwnedPointer<PtrTarget=()>,",
97        ptr_mut_val_bound=
98            "_ErasedPtr: __sabi_re::OwnedPointer<PtrTarget=()>,",
99        ptr_val_bound=
100            "_ErasedPtr: __sabi_re::OwnedPointer<PtrTarget=()>,",
101
102        empty_ts="",
103        ts_empty="",
104
105        ts_self_colon2 ="Self::",
106        ts_uself_colon2="_Self::",
107
108        ts_make_vtable_args="Downcasting,_OrigPtr::PtrTarget,_OrigPtr::TransmutedPtr,_OrigPtr,",
109        ts_make_vtable_args_const="Downcasting,_Self,__sabi_re::RRef<'_sub, ()>, &'_sub _Self,",
110        ts_erasedptr_and2="_ErasedPtr,_ErasedPtr2,",
111        ts_self_erasedptr="_Self,_ErasedPtr,",
112        ts_unit_erasedptr="(),_ErasedPtr,",
113
114        ts_getvtable_params="'lt,'_sub,IA,_Self,_ErasedPtr,_OrigPtr,",
115        ts_getvtable_dummy_struct_fields="&'lt(),&'_sub(),IA,_Self,_ErasedPtr,_OrigPtr,",
116        missing_field_option="#[sabi(missing_field(option))]",
117    ]
118
119    types[
120        self_ty="Self",
121    ]
122
123    idents[
124        u_capself="_Self",
125    ]
126
127    lifetime[
128        static_lifetime="'static",
129    ]
130
131    str_lits[]
132
133    patterns[]
134
135    token[
136        unsafe_=Unsafe,
137    ]
138}
139
140////////////////////////////////////////////////////////
141
142macro_rules! declare_lifetime_tokens {
143    (
144        lifetime_tokens=[ $( $ident:ident = $expr:expr ,)* ]
145        one_lifetime_tokens=[ $( $one_ident:ident = $one_expr:expr ,)* ]
146        static_lifetime_tokens=[ $( $static_ident:ident = $static_expr:expr ,)* ]
147    ) => (
148
149        #[derive(Debug,Clone,Copy)]
150        pub(crate) enum IsStaticTrait{
151            Yes,
152            No,
153        }
154
155        #[derive(Debug,Clone)]
156        pub(crate) struct LifetimeTokens{
157            $(
158                pub(crate) $ident:TokenStream,
159            )*
160            $(
161                pub(crate) $static_ident:TokenStream,
162            )*
163            $(
164                pub(crate) $one_ident:TokenStream,
165            )*
166            pub(crate) plus_lt:TokenStream,
167        }
168
169        impl LifetimeTokens{
170            pub(crate) fn new(is_it:IsStaticTrait)->Self{
171                let is_static=matches!(is_it, IsStaticTrait::Yes);
172                let lt=if is_static { "" }else{ "'lt," };
173                let static_lt=if is_static { "" }else{ "'static," };
174                let one_lt=if is_static { "'static," }else{ "'lt," };
175
176                LifetimeTokens{
177                    $(
178                        $ident: {
179                            let s=format!("{}{}",lt,$expr);
180                            syn::parse_str::<TokenStream>(&s).unwrap()
181                        },
182                    )*
183                    $(
184                        $one_ident: {
185                            let s=format!("{}{}",one_lt,$one_expr);
186                            syn::parse_str::<TokenStream>(&s).unwrap()
187                        },
188                    )*
189                    $(
190                        $static_ident: {
191                            let s=format!("{}{}",static_lt,$static_expr);
192                            syn::parse_str::<TokenStream>(&s).unwrap()
193                        },
194                    )*
195                    plus_lt: syn::parse_str(if is_static { "" }else{ "+ 'lt" }).unwrap(),
196                }
197            }
198        }
199
200    )
201}
202
203declare_lifetime_tokens! {
204    lifetime_tokens=[
205        lt="",
206        lt_erasedptr="_ErasedPtr,",
207        lt_rbox="__sabi_re::RBox<()>,",
208        lt_rref="__sabi_re::RRef<'_sub,()>,",
209        lt_rmut="__sabi_re::RMut<'_sub,()>,",
210        lt_sub_lt="'_sub,",
211    ]
212    one_lifetime_tokens=[
213        one_lt="",
214    ]
215    static_lifetime_tokens=[
216        staticlt_erasedptr2="_ErasedPtr2,",
217        staticlt_erasedptr="_ErasedPtr,",
218    ]
219}