MCPcopy Index your code
hub / github.com/SoftbearStudios/bitcode / derive

Method derive

bitcode_derive/src/shared.rs:92–152  ·  view source on GitHub ↗
(&self, mut input: DeriveInput)

Source from the content-addressed store, hash-verified

90 }
91
92 fn derive(&self, mut input: DeriveInput) -> Result<TokenStream> {
93 let attrs = BitcodeAttrs::parse_derive(&input.attrs)?;
94 let ident = input.ident;
95 syn::visit_mut::visit_data_mut(&mut ReplaceSelves(&ident), &mut input.data);
96 let mut bounds = FieldBounds::default();
97
98 let output = match input.data {
99 Data::Struct(DataStruct { ref fields, .. }) => {
100 // Only used for adding `bounds`. Would be used by `#[bitcode(with_serde)]`.
101 let field_attrs = self.field_attrs(fields, &attrs, &mut bounds)?;
102 let _ = field_attrs;
103
104 let destructure_fields = &destructure_fields(fields);
105 Self::ALL.map(|item| {
106 let field_impls = item.field_impls(None, fields);
107 item.struct_impl(&ident, destructure_fields, &field_impls)
108 })
109 }
110 Data::Enum(data_enum) => {
111 let max_variants = VariantIndex::MAX as usize + 1;
112 if data_enum.variants.len() > max_variants {
113 return err(
114 &ident,
115 &format!("enums with more than {max_variants} variants are not supported"),
116 );
117 }
118
119 // Only used for adding `bounds`. Would be used by `#[bitcode(with_serde)]`.
120 let variant_attrs = data_enum
121 .variants
122 .iter()
123 .map(|variant| {
124 let attrs = BitcodeAttrs::parse_variant(&variant.attrs, &attrs)?;
125 self.field_attrs(&variant.fields, &attrs, &mut bounds)
126 })
127 .collect::<Result<Vec<_>>>()?;
128 let _ = variant_attrs;
129
130 Self::ALL.map(|item| {
131 item.enum_impl(
132 data_enum.variants.len(),
133 |i| {
134 let variant = &data_enum.variants[i];
135 let variant_name = &variant.ident;
136 let destructure_fields = destructure_fields(&variant.fields);
137 quote! {
138 #ident::#variant_name #destructure_fields
139 }
140 },
141 |item, i| {
142 let variant = &data_enum.variants[i];
143 let global_prefix = format!("{}_", &variant.ident);
144 item.field_impls(Some(&global_prefix), &variant.fields)
145 },
146 )
147 })
148 }
149 Data::Union(_) => err(&ident, "unions are not supported")?,

Callers

nothing calls this directly

Implementers 2

encode.rsbitcode_derive/src/encode.rs
decode.rsbitcode_derive/src/decode.rs

Calls 10

ReplaceSelvesClass · 0.85
destructure_fieldsFunction · 0.85
field_attrsMethod · 0.80
field_implsMethod · 0.80
added_toMethod · 0.80
errFunction · 0.70
struct_implMethod · 0.45
lenMethod · 0.45
enum_implMethod · 0.45
derive_implMethod · 0.45

Tested by

no test coverage detected