From 9cac89f37fc6a0895683b6424ab7ff17696f5b00 Mon Sep 17 00:00:00 2001 From: Soares Chen Date: Sat, 28 Feb 2026 10:25:35 +0100 Subject: [PATCH 1/4] Use Copy instead of Clone for owned getter field values --- .../src/derive_getter/getter_field.rs | 2 +- .../cgp-macro-lib/src/derive_getter/method.rs | 4 ++-- .../cgp-macro-lib/src/derive_getter/parse.rs | 2 +- crates/cgp-tests/tests/cgp_fn_tests/extend.rs | 2 +- .../tests/cgp_fn_tests/foreign_type.rs | 2 +- .../cgp-tests/tests/cgp_fn_tests/generics.rs | 2 +- .../tests/cgp_fn_tests/nested_foreign_type.rs | 2 +- .../cgp-tests/tests/cgp_fn_tests/use_type.rs | 2 +- .../tests/cgp_fn_tests/use_type_alias.rs | 2 +- .../component_tests/abstract_types/basic.rs | 2 +- .../component_tests/abstract_types/extend.rs | 2 +- .../component_tests/abstract_types/foreign.rs | 2 +- .../cgp_impl/implicit_args/generics.rs | 21 ++++++++++++------- .../getter_tests/abstract_type/import.rs | 2 +- .../getter_tests/abstract_type/use_type.rs | 2 +- crates/cgp-tests/tests/getter_tests/clone.rs | 20 +++++++----------- 16 files changed, 36 insertions(+), 35 deletions(-) diff --git a/crates/cgp-macro-lib/src/derive_getter/getter_field.rs b/crates/cgp-macro-lib/src/derive_getter/getter_field.rs index 547b9c17..d300d81c 100644 --- a/crates/cgp-macro-lib/src/derive_getter/getter_field.rs +++ b/crates/cgp-macro-lib/src/derive_getter/getter_field.rs @@ -17,7 +17,7 @@ pub enum FieldMode { OptionRef, MRef, Str, - Clone, + Copy, Slice, } diff --git a/crates/cgp-macro-lib/src/derive_getter/method.rs b/crates/cgp-macro-lib/src/derive_getter/method.rs index 899ca29e..e41f12bc 100644 --- a/crates/cgp-macro-lib/src/derive_getter/method.rs +++ b/crates/cgp-macro-lib/src/derive_getter/method.rs @@ -117,9 +117,9 @@ pub fn extend_call_expr( } } } - FieldMode::Clone => { + FieldMode::Copy => { quote! { - #call_expr .clone() + * #call_expr } } FieldMode::Slice => { diff --git a/crates/cgp-macro-lib/src/derive_getter/parse.rs b/crates/cgp-macro-lib/src/derive_getter/parse.rs index 8f272b94..bfac7468 100644 --- a/crates/cgp-macro-lib/src/derive_getter/parse.rs +++ b/crates/cgp-macro-lib/src/derive_getter/parse.rs @@ -302,7 +302,7 @@ pub fn parse_field_type( } else if let (Some(field_type), None) = (try_parse_mref(type_path), receiver_mut) { Ok((field_type.clone(), FieldMode::MRef)) } else { - Ok((return_type.clone(), FieldMode::Clone)) + Ok((return_type.clone(), FieldMode::Copy)) } } _ => Err(Error::new( diff --git a/crates/cgp-tests/tests/cgp_fn_tests/extend.rs b/crates/cgp-tests/tests/cgp_fn_tests/extend.rs index d8d52697..172729fa 100644 --- a/crates/cgp-tests/tests/cgp_fn_tests/extend.rs +++ b/crates/cgp-tests/tests/cgp_fn_tests/extend.rs @@ -15,7 +15,7 @@ pub fn rectangle_area( #[implicit] height: Self::Scalar, ) -> Self::Scalar where - Self::Scalar: Mul + Clone, + Self::Scalar: Mul + Copy, { width * height } diff --git a/crates/cgp-tests/tests/cgp_fn_tests/foreign_type.rs b/crates/cgp-tests/tests/cgp_fn_tests/foreign_type.rs index 91ef75ec..162b10d5 100644 --- a/crates/cgp-tests/tests/cgp_fn_tests/foreign_type.rs +++ b/crates/cgp-tests/tests/cgp_fn_tests/foreign_type.rs @@ -15,7 +15,7 @@ pub fn rectangle_area( #[implicit] height: Scalar, ) -> Scalar where - Scalar: Mul + Clone, + Scalar: Mul + Copy, { let res: Scalar = width * height; res diff --git a/crates/cgp-tests/tests/cgp_fn_tests/generics.rs b/crates/cgp-tests/tests/cgp_fn_tests/generics.rs index 367289d8..baaae9f7 100644 --- a/crates/cgp-tests/tests/cgp_fn_tests/generics.rs +++ b/crates/cgp-tests/tests/cgp_fn_tests/generics.rs @@ -9,7 +9,7 @@ pub fn rectangle_area( #[implicit] height: Scalar, ) -> Scalar where - Scalar: Mul + Clone, + Scalar: Mul + Copy, { width * height } diff --git a/crates/cgp-tests/tests/cgp_fn_tests/nested_foreign_type.rs b/crates/cgp-tests/tests/cgp_fn_tests/nested_foreign_type.rs index 5da55e01..31da2d1b 100644 --- a/crates/cgp-tests/tests/cgp_fn_tests/nested_foreign_type.rs +++ b/crates/cgp-tests/tests/cgp_fn_tests/nested_foreign_type.rs @@ -17,7 +17,7 @@ pub trait HasTypes { #[extend_where(Types: HasScalarType)] pub fn rectangle_area(&self, #[implicit] width: Scalar, #[implicit] height: Scalar) -> Scalar where - Scalar: Mul + Clone, + Scalar: Mul + Copy, { let res: Scalar = width * height; res diff --git a/crates/cgp-tests/tests/cgp_fn_tests/use_type.rs b/crates/cgp-tests/tests/cgp_fn_tests/use_type.rs index 8f43135c..95ccfec5 100644 --- a/crates/cgp-tests/tests/cgp_fn_tests/use_type.rs +++ b/crates/cgp-tests/tests/cgp_fn_tests/use_type.rs @@ -5,7 +5,7 @@ use cgp::prelude::*; #[cgp_type] pub trait HasScalarType { - type Scalar: Mul + Clone; + type Scalar: Mul + Copy; } #[cgp_fn] diff --git a/crates/cgp-tests/tests/cgp_fn_tests/use_type_alias.rs b/crates/cgp-tests/tests/cgp_fn_tests/use_type_alias.rs index ac48070f..a22706e3 100644 --- a/crates/cgp-tests/tests/cgp_fn_tests/use_type_alias.rs +++ b/crates/cgp-tests/tests/cgp_fn_tests/use_type_alias.rs @@ -11,7 +11,7 @@ pub trait HasScalarType { #[use_type(HasScalarType::{Scalar as S})] pub fn rectangle_area(&self, #[implicit] width: S, #[implicit] height: S) -> S where - S: Mul + Clone, + S: Mul + Copy, { let res: S = width * height; res diff --git a/crates/cgp-tests/tests/component_tests/abstract_types/basic.rs b/crates/cgp-tests/tests/component_tests/abstract_types/basic.rs index da5e7537..cf0a495a 100644 --- a/crates/cgp-tests/tests/component_tests/abstract_types/basic.rs +++ b/crates/cgp-tests/tests/component_tests/abstract_types/basic.rs @@ -19,7 +19,7 @@ pub trait CanCalculateArea { #[use_type(HasScalarType::Scalar, HasErrorType::Error)] impl AreaCalculator where - Scalar: Mul + Clone, + Scalar: Mul + Copy, { fn area(&self, #[implicit] width: Scalar, #[implicit] height: Scalar) -> Result { Ok(width * height) diff --git a/crates/cgp-tests/tests/component_tests/abstract_types/extend.rs b/crates/cgp-tests/tests/component_tests/abstract_types/extend.rs index ae550963..5c275841 100644 --- a/crates/cgp-tests/tests/component_tests/abstract_types/extend.rs +++ b/crates/cgp-tests/tests/component_tests/abstract_types/extend.rs @@ -19,7 +19,7 @@ pub trait CanCalculateArea { #[uses(HasScalarType, HasErrorType)] impl AreaCalculator where - Self::Scalar: Mul + Clone, + Self::Scalar: Mul + Copy, { fn area( &self, diff --git a/crates/cgp-tests/tests/component_tests/abstract_types/foreign.rs b/crates/cgp-tests/tests/component_tests/abstract_types/foreign.rs index 5d745098..7fe7bbde 100644 --- a/crates/cgp-tests/tests/component_tests/abstract_types/foreign.rs +++ b/crates/cgp-tests/tests/component_tests/abstract_types/foreign.rs @@ -19,7 +19,7 @@ pub trait CanCalculateArea { #[use_type(@Types::HasScalarType::Scalar, HasErrorType::Error)] impl AreaCalculator where - Scalar: Mul + Clone, + Scalar: Mul + Copy, { fn area(&self, #[implicit] width: Scalar, #[implicit] height: Scalar) -> Result { Ok(width * height) diff --git a/crates/cgp-tests/tests/component_tests/cgp_impl/implicit_args/generics.rs b/crates/cgp-tests/tests/component_tests/cgp_impl/implicit_args/generics.rs index 7cd76684..2eb47f51 100644 --- a/crates/cgp-tests/tests/component_tests/cgp_impl/implicit_args/generics.rs +++ b/crates/cgp-tests/tests/component_tests/cgp_impl/implicit_args/generics.rs @@ -3,17 +3,17 @@ use core::ops::Mul; use cgp::prelude::*; #[cgp_component(AreaCalculator)] -pub trait CanCalculateArea { - fn area(&self) -> f64; +pub trait CanCalculateArea { + fn area(&self) -> Scalar; } #[cgp_impl(new RectangleArea)] -impl AreaCalculator +impl AreaCalculator where - Scalar: Mul + Clone + Into, + Scalar: Mul + Copy, { - fn area(&self, #[implicit] width: Scalar, #[implicit] height: Scalar) -> f64 { - (width * height).into() + fn area(&self, #[implicit] width: Scalar, #[implicit] height: Scalar) -> Scalar { + width * height } } @@ -23,10 +23,15 @@ pub struct Rectangle { pub height: f64, } -delegate_and_check_components! { - CanUseRectangle for Rectangle; +delegate_components! { Rectangle { AreaCalculatorComponent: RectangleArea, } } + +check_components! { + CanUseRectangle for Rectangle { + AreaCalculatorComponent: f64, + } +} diff --git a/crates/cgp-tests/tests/getter_tests/abstract_type/import.rs b/crates/cgp-tests/tests/getter_tests/abstract_type/import.rs index 43a1dfaa..87e1c178 100644 --- a/crates/cgp-tests/tests/getter_tests/abstract_type/import.rs +++ b/crates/cgp-tests/tests/getter_tests/abstract_type/import.rs @@ -2,7 +2,7 @@ use cgp::prelude::*; #[cgp_type] pub trait HasScalarType { - type Scalar: Clone; + type Scalar: Copy; } #[cgp_auto_getter] diff --git a/crates/cgp-tests/tests/getter_tests/abstract_type/use_type.rs b/crates/cgp-tests/tests/getter_tests/abstract_type/use_type.rs index acbce19d..bee751e3 100644 --- a/crates/cgp-tests/tests/getter_tests/abstract_type/use_type.rs +++ b/crates/cgp-tests/tests/getter_tests/abstract_type/use_type.rs @@ -2,7 +2,7 @@ use cgp::prelude::*; #[cgp_type] pub trait HasScalarType { - type Scalar: Clone; + type Scalar: Copy; } #[cgp_auto_getter] diff --git a/crates/cgp-tests/tests/getter_tests/clone.rs b/crates/cgp-tests/tests/getter_tests/clone.rs index 75a35a2a..d01b2118 100644 --- a/crates/cgp-tests/tests/getter_tests/clone.rs +++ b/crates/cgp-tests/tests/getter_tests/clone.rs @@ -8,25 +8,23 @@ pub fn test_clone_getter() { } #[cgp_getter] - pub trait HasName: HasNameType { + pub trait HasName: HasNameType { fn name(&self) -> Self::Name; } #[derive(HasField)] pub struct App { - pub name: String, + pub name: &'static str, } delegate_components! { App { - NameTypeProviderComponent: UseType, + NameTypeProviderComponent: UseType<&'static str>, NameGetterComponent: UseField, } } - let context = App { - name: "Alice".to_owned(), - }; + let context = App { name: "Alice" }; assert_eq!(context.name(), "Alice"); } @@ -39,24 +37,22 @@ pub fn test_clone_auto_getter() { } #[cgp_auto_getter] - pub trait HasName: HasNameType { + pub trait HasName: HasNameType { fn name(&self) -> Self::Name; } #[derive(HasField)] pub struct App { - pub name: String, + pub name: &'static str, } delegate_components! { App { - NameTypeProviderComponent: UseType, + NameTypeProviderComponent: UseType<&'static str>, } } - let context = App { - name: "Alice".to_owned(), - }; + let context = App { name: "Alice" }; assert_eq!(context.name(), "Alice"); } From b4dfb41f3966e904e724ba406a226dbf25cf2577 Mon Sep 17 00:00:00 2001 From: Soares Chen Date: Sat, 28 Feb 2026 10:56:37 +0100 Subject: [PATCH 2/4] Wrap the `*` copying inside parenthesis to avoid ambiguity --- crates/cgp-macro-lib/src/derive_getter/method.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/crates/cgp-macro-lib/src/derive_getter/method.rs b/crates/cgp-macro-lib/src/derive_getter/method.rs index e41f12bc..2d46069f 100644 --- a/crates/cgp-macro-lib/src/derive_getter/method.rs +++ b/crates/cgp-macro-lib/src/derive_getter/method.rs @@ -119,7 +119,7 @@ pub fn extend_call_expr( } FieldMode::Copy => { quote! { - * #call_expr + (* #call_expr) } } FieldMode::Slice => { From 657ddf763986b79b013cb05754521f9693c385cc Mon Sep 17 00:00:00 2001 From: Soares Chen Date: Sat, 28 Feb 2026 10:59:55 +0100 Subject: [PATCH 3/4] Use back `.clone()`, since `Clone` is a supertrait of `Copy` --- crates/cgp-macro-lib/src/derive_getter/method.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/crates/cgp-macro-lib/src/derive_getter/method.rs b/crates/cgp-macro-lib/src/derive_getter/method.rs index 2d46069f..0ec82fce 100644 --- a/crates/cgp-macro-lib/src/derive_getter/method.rs +++ b/crates/cgp-macro-lib/src/derive_getter/method.rs @@ -119,7 +119,7 @@ pub fn extend_call_expr( } FieldMode::Copy => { quote! { - (* #call_expr) + #call_expr .clone() } } FieldMode::Slice => { From 6adf6e59f7cd858be71fd30233ec3d3696803d83 Mon Sep 17 00:00:00 2001 From: Soares Chen Date: Sat, 28 Feb 2026 11:09:53 +0100 Subject: [PATCH 4/4] Fix formatting --- crates/cgp-extra/src/lib.rs | 11 +++++++---- crates/cgp-field/src/types/product.rs | 3 ++- crates/cgp-field/src/types/sum.rs | 3 ++- 3 files changed, 11 insertions(+), 6 deletions(-) diff --git a/crates/cgp-extra/src/lib.rs b/crates/cgp-extra/src/lib.rs index f394a398..a345812f 100644 --- a/crates/cgp-extra/src/lib.rs +++ b/crates/cgp-extra/src/lib.rs @@ -2,7 +2,10 @@ pub mod prelude; -pub use { - cgp_dispatch as dispatch, cgp_error_extra as error, cgp_field_extra as field, - cgp_handler as handler, cgp_monad as monad, cgp_run as run, cgp_runtime as runtime, -}; +pub use cgp_dispatch as dispatch; +pub use cgp_error_extra as error; +pub use cgp_field_extra as field; +pub use cgp_handler as handler; +pub use cgp_monad as monad; +pub use cgp_run as run; +pub use cgp_runtime as runtime; diff --git a/crates/cgp-field/src/types/product.rs b/crates/cgp-field/src/types/product.rs index 04e197a2..218aaec2 100644 --- a/crates/cgp-field/src/types/product.rs +++ b/crates/cgp-field/src/types/product.rs @@ -47,4 +47,5 @@ pub struct π(pub Head, pub Tail); #[allow(non_camel_case_types)] pub struct ε; -pub use {ε as Nil, π as Cons}; +pub use ε as Nil; +pub use π as Cons; diff --git a/crates/cgp-field/src/types/sum.rs b/crates/cgp-field/src/types/sum.rs index 5f045144..3aab93f5 100644 --- a/crates/cgp-field/src/types/sum.rs +++ b/crates/cgp-field/src/types/sum.rs @@ -59,4 +59,5 @@ pub enum σ { #[derive(Eq, PartialEq, Debug, Clone)] pub enum θ {} -pub use {θ as Void, σ as Either}; +pub use θ as Void; +pub use σ as Either;