abi_stable_derive/stable_abi/
tl_field.rs
1use crate::{
2 composite_collections::SmallStartLen as StartLen,
3 lifetimes::{LifetimeIndex, LifetimeRange},
4};
5
6use super::{
7 reflection::{CompFieldAccessor, FieldAccessor},
8 shared_vars::SharedVars,
9 tl_multi_tl::TypeLayoutIndex,
10};
11
12use proc_macro2::TokenStream as TokenStream2;
13use quote::ToTokens;
14
15abi_stable_shared::declare_comp_tl_field! {
16 attrs=[]
17}
18
19impl CompTLField {
20 pub(crate) fn from_expanded<'a, I>(
21 name: &syn::Ident,
22 lifetime_indices: I,
23 field_accessor: FieldAccessor<'a>,
24 layout: TypeLayoutIndex,
25 is_function: bool,
26 shared_vars: &mut SharedVars<'a>,
27 ) -> Self
28 where
29 I: IntoIterator<Item = LifetimeIndex>,
30 {
31 let (name_range, comp_field_accessor) =
32 Self::push_name_field_accessor(name, field_accessor, shared_vars);
33
34 Self::new(
35 name_range,
36 shared_vars.extend_with_lifetime_indices(lifetime_indices),
37 comp_field_accessor,
38 layout,
39 is_function,
40 )
41 }
42
43 pub(crate) fn from_expanded_std_field<'a, I>(
44 name: &syn::Ident,
45 lifetime_indices: I,
46 layout: TypeLayoutIndex,
47 shared_vars: &mut SharedVars<'a>,
48 ) -> Self
49 where
50 I: IntoIterator<Item = LifetimeIndex>,
51 {
52 Self::from_expanded(
53 name,
54 lifetime_indices,
55 FieldAccessor::Direct,
56 layout,
57 false,
58 shared_vars,
59 )
60 }
61
62 fn push_name_field_accessor<'a>(
65 name: &syn::Ident,
66 field_accessor: FieldAccessor<'a>,
67 shared_vars: &mut SharedVars<'a>,
68 ) -> (StartLen, CompFieldAccessor) {
69 let name_range = shared_vars.push_ident(name);
70 shared_vars.combine_err(name_range.check_ident_length(name.span()));
71
72 let comp_field_accessor = field_accessor.compress(shared_vars);
73 shared_vars.push_str(";", None);
74 (name_range, comp_field_accessor)
75 }
76}
77
78impl CompTLField {
79 pub(crate) fn type_<'a>(&self, shared_vars: &SharedVars<'a>) -> &'a syn::Type {
80 shared_vars.get_type(self.type_layout_index()).unwrap()
81 }
82}
83
84impl ToTokens for CompTLField {
85 fn to_tokens(&self, ts: &mut TokenStream2) {
86 self.bits0.to_tokens(ts);
87 }
88}