diff --git a/derive/src/derive_bit_packed.rs b/derive/src/derive_bit_packed.rs index 85f5982..3afcd11 100644 --- a/derive/src/derive_bit_packed.rs +++ b/derive/src/derive_bit_packed.rs @@ -1,5 +1,6 @@ use crate::attribute::ContainerAttributes; use crate::attribute::FieldAttributes; +use crate::stream_builder_ext::StreamBuilderExt; use virtue::prelude::*; pub(crate) struct DeriveBitPacked { @@ -421,7 +422,7 @@ impl DeriveBitPackedEnum { for (variant_index, variant) in self.variants.iter().enumerate() { match_body.ident_str("Self"); match_body.puncts("::"); - match_body.ident(variant.name.clone()); + match_body.ident_ref(&variant.name); if let Some(fields) = variant.fields.as_ref() { let delimiter = fields.delimiter(); @@ -576,7 +577,7 @@ impl DeriveBitPackedEnum { if idx != 0 { allowed_slice.punct(','); } - allowed_slice.ident(variant.name.clone()); + allowed_slice.ident_ref(&variant.name); } Ok(()) })?; @@ -723,7 +724,7 @@ impl DeriveBitPackedEnum { arm_body.group(Delimiter::Parenthesis, |variant_case_body| { variant_case_body.ident_str("Self"); variant_case_body.puncts("::"); - variant_case_body.ident(variant.name.clone()); + variant_case_body.ident_ref(&variant.name); if let Some(fields) = variant.fields.as_ref() { let is_tuple = matches!(fields, Fields::Tuple(_)); @@ -732,7 +733,7 @@ impl DeriveBitPackedEnum { |variant_body| { for field in fields.names() { if !is_tuple { - variant_body.ident(field.unwrap_ident().clone()); + variant_body.ident_ref(&field.unwrap_ident()); variant_body.punct(':'); } variant_body.push_parsed(format!("__{},", field.to_string_with_prefix("field_")))?; @@ -781,7 +782,7 @@ impl DeriveBitPackedEnum { arm_body.group(Delimiter::Parenthesis, |variant_case_body| { variant_case_body.ident_str("Self"); variant_case_body.puncts("::"); - variant_case_body.ident(variant.name.clone()); + variant_case_body.ident_ref(&variant.name); if let Some(fields) = variant.fields.as_ref() { let is_tuple = matches!(fields, Fields::Tuple(_)); @@ -790,7 +791,7 @@ impl DeriveBitPackedEnum { |variant_body| { for field in fields.names() { if !is_tuple { - variant_body.ident(field.unwrap_ident().clone()); + variant_body.ident_ref(&field.unwrap_ident()); variant_body.punct(':'); } variant_body.push_parsed(format!("__{},", field.to_string_with_prefix("field_")))?; @@ -946,7 +947,7 @@ impl DeriveBitPackedEnum { arm_body.group(Delimiter::Parenthesis, |variant_case_body| { variant_case_body.ident_str("Self"); variant_case_body.puncts("::"); - variant_case_body.ident(variant.name.clone()); + variant_case_body.ident_ref(&variant.name); if let Some(fields) = variant.fields.as_ref() { let is_tuple = matches!(fields, Fields::Tuple(_)); @@ -955,7 +956,7 @@ impl DeriveBitPackedEnum { |variant_body| { for field in fields.names() { if !is_tuple { - variant_body.ident(field.unwrap_ident().clone()); + variant_body.ident_ref(&field.unwrap_ident()); variant_body.punct(':'); } variant_body.push_parsed(format!("__{},", field.to_string_with_prefix("field_")))?; @@ -1004,7 +1005,7 @@ impl DeriveBitPackedEnum { arm_body.group(Delimiter::Parenthesis, |variant_case_body| { variant_case_body.ident_str("Self"); variant_case_body.puncts("::"); - variant_case_body.ident(variant.name.clone()); + variant_case_body.ident_ref(&variant.name); if let Some(fields) = variant.fields.as_ref() { let is_tuple = matches!(fields, Fields::Tuple(_)); @@ -1013,7 +1014,7 @@ impl DeriveBitPackedEnum { |variant_body| { for field in fields.names() { if !is_tuple { - variant_body.ident(field.unwrap_ident().clone()); + variant_body.ident_ref(&field.unwrap_ident()); variant_body.punct(':'); } variant_body.push_parsed(format!("__{},", field.to_string_with_prefix("field_")))?; diff --git a/derive/src/derive_enum.rs b/derive/src/derive_enum.rs index de0991a..9fa5162 100644 --- a/derive/src/derive_enum.rs +++ b/derive/src/derive_enum.rs @@ -1,5 +1,6 @@ use crate::attribute::ContainerAttributes; use crate::attribute::FieldAttributes; +use crate::stream_builder_ext::StreamBuilderExt; use virtue::prelude::*; const TUPLE_FIELD_PREFIX: &str = "field_"; @@ -61,7 +62,7 @@ impl DeriveEnum { // Self::Variant match_body.ident_str("Self"); match_body.puncts("::"); - match_body.ident(variant.name.clone()); + match_body.ident_ref(&variant.name); // if we have any fields, declare them here // Self::Variant { a, b, c } @@ -280,7 +281,7 @@ impl DeriveEnum { arm_body.group(Delimiter::Parenthesis, |variant_case_body| { variant_case_body.ident_str("Self"); variant_case_body.puncts("::"); - variant_case_body.ident(variant.name.clone()); + variant_case_body.ident_ref(&variant.name); variant_case_body.group(Delimiter::Brace, |variant_body| { if let Some(fields) = variant.fields.as_ref() { @@ -290,7 +291,7 @@ impl DeriveEnum { if is_tuple { variant_body.lit_usize(idx); } else { - variant_body.ident(field.unwrap_ident().clone()); + variant_body.ident_ref(&field.unwrap_ident()); } variant_body.punct(':'); let attributes = field.attributes().get_attribute::()?.unwrap_or_default(); @@ -401,7 +402,7 @@ impl DeriveEnum { arm_body.group(Delimiter::Parenthesis, |variant_case_body| { variant_case_body.ident_str("Self"); variant_case_body.puncts("::"); - variant_case_body.ident(variant.name.clone()); + variant_case_body.ident_ref(&variant.name); variant_case_body.group(Delimiter::Brace, |variant_body| { if let Some(fields) = variant.fields.as_ref() { @@ -411,7 +412,7 @@ impl DeriveEnum { if is_tuple { variant_body.lit_usize(idx); } else { - variant_body.ident(field.unwrap_ident().clone()); + variant_body.ident_ref(&field.unwrap_ident()); } variant_body.punct(':'); let attributes = field.attributes().get_attribute::()?.unwrap_or_default(); diff --git a/derive/src/lib.rs b/derive/src/lib.rs index 0ff1dfa..fae061a 100644 --- a/derive/src/lib.rs +++ b/derive/src/lib.rs @@ -6,6 +6,7 @@ #![allow(unused_must_use)] mod attribute; +mod stream_builder_ext; mod derive_bit_packed; mod derive_enum; mod derive_fingerprint; diff --git a/derive/src/stream_builder_ext.rs b/derive/src/stream_builder_ext.rs new file mode 100644 index 0000000..bdf2588 --- /dev/null +++ b/derive/src/stream_builder_ext.rs @@ -0,0 +1,13 @@ +use virtue::prelude::Ident; +use virtue::generate::StreamBuilder; + +pub(crate) trait StreamBuilderExt { + fn ident_ref(&mut self, ident: &Ident) -> &mut Self; +} + +impl StreamBuilderExt for StreamBuilder { + fn ident_ref(&mut self, ident: &Ident) -> &mut Self { + self.ident(ident.clone()); + self + } +}