From 35df1c73575ce56fd11c95a2cb78f030feae30ab Mon Sep 17 00:00:00 2001 From: Techassi Date: Mon, 28 Sep 2026 17:15:37 +0200 Subject: [PATCH 1/2] feat(versioned): Emit generics in plain From impl --- .../src/codegen/container/struct/mod.rs | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/crates/stackable-versioned-macros/src/codegen/container/struct/mod.rs b/crates/stackable-versioned-macros/src/codegen/container/struct/mod.rs index 8b4896a5a..61f435e73 100644 --- a/crates/stackable-versioned-macros/src/codegen/container/struct/mod.rs +++ b/crates/stackable-versioned-macros/src/codegen/container/struct/mod.rs @@ -478,6 +478,8 @@ impl Struct { ) -> TokenStream { // TODO (@Techassi): A bunch this stuff is duplicated in self.generate_tracking_from_impl. // Ideally we remove that duplication. + let (impl_generics, type_generics, where_clause) = self.generics.split_for_impl(); + let from_struct_ident = &self.common.idents.parameter; let struct_ident = &self.common.idents.original; @@ -521,8 +523,12 @@ impl Struct { quote! { #automatically_derived #allow_attribute - impl ::core::convert::From<#from_module_ident::#struct_ident> for #for_module_ident::#struct_ident { - fn from(#from_struct_ident: #from_module_ident::#struct_ident) -> Self { + impl #impl_generics + ::core::convert::From<#from_module_ident::#struct_ident #type_generics> + for #for_module_ident::#struct_ident #type_generics + #where_clause + { + fn from(#from_struct_ident: #from_module_ident::#struct_ident #type_generics) -> Self { Self { #fields } From 38dc5840c9f4aced8967813c699c4c727ee3a05a Mon Sep 17 00:00:00 2001 From: Techassi Date: Tue, 29 Sep 2026 09:20:49 +0200 Subject: [PATCH 2/2] test(versioned): Add snapshot test for generics --- .../tests/inputs/pass/generics.rs | 16 ++++++ ...d_macros__snapshots__pass@generics.rs.snap | 57 +++++++++++++++++++ .../tests/trybuild.rs | 1 + 3 files changed, 74 insertions(+) create mode 100644 crates/stackable-versioned-macros/tests/inputs/pass/generics.rs create mode 100644 crates/stackable-versioned-macros/tests/snapshots/stackable_versioned_macros__snapshots__pass@generics.rs.snap diff --git a/crates/stackable-versioned-macros/tests/inputs/pass/generics.rs b/crates/stackable-versioned-macros/tests/inputs/pass/generics.rs new file mode 100644 index 000000000..97619f14a --- /dev/null +++ b/crates/stackable-versioned-macros/tests/inputs/pass/generics.rs @@ -0,0 +1,16 @@ +use stackable_versioned::versioned; +// --- +#[versioned(version(name = "v1alpha1"), version(name = "v1alpha2"))] +// --- +pub(crate) mod versioned { + struct FooSpec + where + Bar: Default, + Baz: Clone, + { + bar: Bar, + baz: Baz, + } +} +// --- +fn main() {} diff --git a/crates/stackable-versioned-macros/tests/snapshots/stackable_versioned_macros__snapshots__pass@generics.rs.snap b/crates/stackable-versioned-macros/tests/snapshots/stackable_versioned_macros__snapshots__pass@generics.rs.snap new file mode 100644 index 000000000..c587a5e7f --- /dev/null +++ b/crates/stackable-versioned-macros/tests/snapshots/stackable_versioned_macros__snapshots__pass@generics.rs.snap @@ -0,0 +1,57 @@ +--- +source: crates/stackable-versioned-macros/src/lib.rs +expression: formatted +input_file: crates/stackable-versioned-macros/tests/inputs/pass/generics.rs +--- +#[automatically_derived] +pub(crate) mod v1alpha1 { + use super::*; + pub struct FooSpec + where + Bar: Default, + Baz: Clone, + { + pub bar: Bar, + pub baz: Baz, + } +} +#[automatically_derived] +impl ::core::convert::From> +for v1alpha2::FooSpec +where + Bar: Default, + Baz: Clone, +{ + fn from(__sv_foospec: v1alpha1::FooSpec) -> Self { + Self { + bar: __sv_foospec.bar.into(), + baz: __sv_foospec.baz.into(), + } + } +} +#[automatically_derived] +impl ::core::convert::From> +for v1alpha1::FooSpec +where + Bar: Default, + Baz: Clone, +{ + fn from(__sv_foospec: v1alpha2::FooSpec) -> Self { + Self { + bar: __sv_foospec.bar.into(), + baz: __sv_foospec.baz.into(), + } + } +} +#[automatically_derived] +pub(crate) mod v1alpha2 { + use super::*; + pub struct FooSpec + where + Bar: Default, + Baz: Clone, + { + pub bar: Bar, + pub baz: Baz, + } +} diff --git a/crates/stackable-versioned-macros/tests/trybuild.rs b/crates/stackable-versioned-macros/tests/trybuild.rs index 90ec9b20a..c252bb572 100644 --- a/crates/stackable-versioned-macros/tests/trybuild.rs +++ b/crates/stackable-versioned-macros/tests/trybuild.rs @@ -28,6 +28,7 @@ mod inputs { // mod docs; // mod downgrade_with; // mod enum_fields; + // mod generics; // mod module; // mod module_preserve; // mod renamed_field;