(&self, mut input: DeriveInput)
| 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")?, |
nothing calls this directly
no test coverage detected