Skip to content

Commit 56d91c2

Browse files
[PLATFORM-831]: Fix generics syntax in derive macro (#56)
* Fix generics syntax in derive macro * Add tests for generic bounds syntax Co-authored-by: William Venner <14863743+WilliamVenner@users.noreply.github.com>
1 parent 1bf256b commit 56d91c2

File tree

4 files changed

+33
-4
lines changed

4 files changed

+33
-4
lines changed

veil-macros/src/enums.rs

+3-1
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@ struct EnumVariantFieldFlags {
1515

1616
pub(super) fn derive_redact(
1717
e: syn::DataEnum,
18+
generics: syn::Generics,
1819
attrs: Vec<syn::Attribute>,
1920
name_ident: syn::Ident,
2021
unused: &mut UnusedDiagnostic,
@@ -178,8 +179,9 @@ pub(super) fn derive_redact(
178179
});
179180
}
180181

182+
let (impl_generics, ty_generics, where_clause) = generics.split_for_impl();
181183
Ok(quote! {
182-
impl ::std::fmt::Debug for #name_ident {
184+
impl #impl_generics ::std::fmt::Debug for #name_ident #ty_generics #where_clause {
183185
fn fmt(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
184186
let debug_alternate = f.alternate();
185187
match self {

veil-macros/src/lib.rs

+2-2
Original file line numberDiff line numberDiff line change
@@ -58,8 +58,8 @@ pub fn derive_redact(item: TokenStream) -> TokenStream {
5858
let item_span = item.span();
5959

6060
let result = match item.data {
61-
syn::Data::Struct(s) => structs::derive_redact(s, item.attrs, item.ident, &mut unused),
62-
syn::Data::Enum(e) => enums::derive_redact(e, item.attrs, item.ident, &mut unused),
61+
syn::Data::Struct(s) => structs::derive_redact(s, item.generics, item.attrs, item.ident, &mut unused),
62+
syn::Data::Enum(e) => enums::derive_redact(e, item.generics, item.attrs, item.ident, &mut unused),
6363
syn::Data::Union(_) => Err(syn::Error::new(item_span, "this trait cannot be derived for unions")),
6464
};
6565

veil-macros/src/structs.rs

+3-1
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ use syn::spanned::Spanned;
55

66
pub(super) fn derive_redact(
77
s: syn::DataStruct,
8+
generics: syn::Generics,
89
attrs: Vec<syn::Attribute>,
910
name_ident: syn::Ident,
1011
unused: &mut UnusedDiagnostic,
@@ -57,8 +58,9 @@ pub(super) fn derive_redact(
5758
}
5859
};
5960

61+
let (impl_generics, ty_generics, where_clause) = generics.split_for_impl();
6062
Ok(quote! {
61-
impl ::std::fmt::Debug for #name_ident {
63+
impl #impl_generics ::std::fmt::Debug for #name_ident #ty_generics #where_clause {
6264
fn fmt(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
6365
let debug_alternate = f.alternate();
6466
#impl_debug;

veil-tests/src/compile_tests.rs

+25
Original file line numberDiff line numberDiff line change
@@ -98,6 +98,31 @@ enum Country {
9898
#[derive(Redact)]
9999
struct TupleStruct(#[redact] u32, #[redact(partial)] u32);
100100

101+
#[derive(Redact)]
102+
struct GenericStruct<Foo: std::fmt::Debug, Bar: std::fmt::Debug>(Foo, #[redact] Bar);
103+
104+
#[derive(Redact)]
105+
struct GenericWhereStruct<Foo, Bar>(Foo, #[redact] Bar)
106+
where
107+
Foo: std::fmt::Debug,
108+
Bar: std::fmt::Debug;
109+
110+
#[derive(Redact)]
111+
enum GenericWhereEnum<Foo, Bar>
112+
where
113+
Foo: std::fmt::Debug,
114+
Bar: std::fmt::Debug,
115+
{
116+
FooVariant(Foo),
117+
BarVariant(#[redact] Bar),
118+
}
119+
120+
#[derive(Redact)]
121+
enum GenericEnum<Foo: std::fmt::Debug, Bar: std::fmt::Debug> {
122+
FooVariant(Foo),
123+
BarVariant(#[redact] Bar),
124+
}
125+
101126
#[test]
102127
fn test_credit_card_redacting() {
103128
println!(

0 commit comments

Comments
 (0)