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    /// Pushes the name and field accessor payload with the
63    /// `<name><field_accessor_payload>;` format.
64    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}