abi_stable_derive/sabi_trait/
common_tokens.rs
1use 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 ]
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
140macro_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}