From bfefdb673e3425771d1aef6b0df4b50a6a92e2ed Mon Sep 17 00:00:00 2001 From: Soares Chen Date: Sun, 14 Jun 2026 14:56:46 +0200 Subject: [PATCH 01/18] Move GetterField --- .../src/types/cgp_getter}/getter_field.rs | 3 ++- .../macros/cgp-macro-core/src/types/cgp_getter/item.rs | 10 ++++++++++ .../macros/cgp-macro-core/src/types/cgp_getter/mod.rs | 5 +++++ crates/macros/cgp-macro-core/src/types/mod.rs | 1 + .../macros/cgp-macro-lib/src/derive_getter/blanket.rs | 4 ++-- .../macros/cgp-macro-lib/src/derive_getter/method.rs | 3 +-- crates/macros/cgp-macro-lib/src/derive_getter/mod.rs | 2 -- crates/macros/cgp-macro-lib/src/derive_getter/parse.rs | 4 +--- .../cgp-macro-lib/src/derive_getter/use_field.rs | 4 ++-- .../cgp-macro-lib/src/derive_getter/use_fields.rs | 4 ++-- .../cgp-macro-lib/src/derive_getter/with_provider.rs | 4 ++-- .../macros/cgp-macro-lib/src/entrypoints/cgp_getter.rs | 10 +++++----- 12 files changed, 33 insertions(+), 21 deletions(-) rename crates/macros/{cgp-macro-lib/src/derive_getter => cgp-macro-core/src/types/cgp_getter}/getter_field.rs (88%) create mode 100644 crates/macros/cgp-macro-core/src/types/cgp_getter/item.rs create mode 100644 crates/macros/cgp-macro-core/src/types/cgp_getter/mod.rs diff --git a/crates/macros/cgp-macro-lib/src/derive_getter/getter_field.rs b/crates/macros/cgp-macro-core/src/types/cgp_getter/getter_field.rs similarity index 88% rename from crates/macros/cgp-macro-lib/src/derive_getter/getter_field.rs rename to crates/macros/cgp-macro-core/src/types/cgp_getter/getter_field.rs index e4758654..523b8836 100644 --- a/crates/macros/cgp-macro-lib/src/derive_getter/getter_field.rs +++ b/crates/macros/cgp-macro-core/src/types/cgp_getter/getter_field.rs @@ -1,7 +1,8 @@ -use cgp_macro_core::types::getter::FieldMode; use syn::token::Mut; use syn::{Ident, Type}; +use crate::types::getter::FieldMode; + pub struct GetterField { pub field_name: Ident, pub field_type: Type, diff --git a/crates/macros/cgp-macro-core/src/types/cgp_getter/item.rs b/crates/macros/cgp-macro-core/src/types/cgp_getter/item.rs new file mode 100644 index 00000000..1e7e6933 --- /dev/null +++ b/crates/macros/cgp-macro-core/src/types/cgp_getter/item.rs @@ -0,0 +1,10 @@ +use syn::TraitItemType; + +use crate::types::cgp_component::EvaluatedCgpComponent; +use crate::types::cgp_getter::GetterField; + +pub struct ItemCgpGetter { + pub item_component: EvaluatedCgpComponent, + pub fields: Vec, + pub field_assoc_type: Option, +} diff --git a/crates/macros/cgp-macro-core/src/types/cgp_getter/mod.rs b/crates/macros/cgp-macro-core/src/types/cgp_getter/mod.rs new file mode 100644 index 00000000..a03353a5 --- /dev/null +++ b/crates/macros/cgp-macro-core/src/types/cgp_getter/mod.rs @@ -0,0 +1,5 @@ +mod getter_field; +mod item; + +pub use getter_field::*; +pub use item::*; diff --git a/crates/macros/cgp-macro-core/src/types/mod.rs b/crates/macros/cgp-macro-core/src/types/mod.rs index 73c90edc..50405e03 100644 --- a/crates/macros/cgp-macro-core/src/types/mod.rs +++ b/crates/macros/cgp-macro-core/src/types/mod.rs @@ -1,5 +1,6 @@ pub mod attributes; pub mod cgp_component; +pub mod cgp_getter; pub mod cgp_impl; pub mod cgp_provider; pub mod delegate_component; diff --git a/crates/macros/cgp-macro-lib/src/derive_getter/blanket.rs b/crates/macros/cgp-macro-lib/src/derive_getter/blanket.rs index 777b2ef9..a0404fc9 100644 --- a/crates/macros/cgp-macro-lib/src/derive_getter/blanket.rs +++ b/crates/macros/cgp-macro-lib/src/derive_getter/blanket.rs @@ -1,10 +1,10 @@ +use cgp_macro_core::types::cgp_getter::{GetterField, ReceiverMode}; use cgp_macro_core::types::field::{FieldName, HasFieldBound}; use proc_macro2::TokenStream; use quote::{ToTokens, quote}; use syn::{Ident, ItemImpl, ItemTrait, TraitItemType, parse_quote, parse2}; -use crate::derive_getter::getter_field::GetterField; -use crate::derive_getter::{ContextArg, ReceiverMode, derive_getter_method}; +use crate::derive_getter::{ContextArg, derive_getter_method}; use crate::type_component::get_bounds_and_replace_self_assoc_type; pub fn derive_blanket_impl( diff --git a/crates/macros/cgp-macro-lib/src/derive_getter/method.rs b/crates/macros/cgp-macro-lib/src/derive_getter/method.rs index 23b804c4..fee39814 100644 --- a/crates/macros/cgp-macro-lib/src/derive_getter/method.rs +++ b/crates/macros/cgp-macro-lib/src/derive_getter/method.rs @@ -1,11 +1,10 @@ +use cgp_macro_core::types::cgp_getter::GetterField; use cgp_macro_core::types::getter::FieldMode; use proc_macro2::TokenStream; use quote::quote; use syn::Ident; use syn::token::Mut; -use crate::derive_getter::GetterField; - pub enum ContextArg { SelfArg, Ident(TokenStream), diff --git a/crates/macros/cgp-macro-lib/src/derive_getter/mod.rs b/crates/macros/cgp-macro-lib/src/derive_getter/mod.rs index 8b66cfa1..f3407a2d 100644 --- a/crates/macros/cgp-macro-lib/src/derive_getter/mod.rs +++ b/crates/macros/cgp-macro-lib/src/derive_getter/mod.rs @@ -1,5 +1,4 @@ mod blanket; -mod getter_field; mod method; mod parse; mod use_field; @@ -7,7 +6,6 @@ mod use_fields; mod with_provider; pub use blanket::*; -pub use getter_field::*; pub use method::*; pub use parse::*; pub use use_field::*; diff --git a/crates/macros/cgp-macro-lib/src/derive_getter/parse.rs b/crates/macros/cgp-macro-lib/src/derive_getter/parse.rs index 76aab53b..d3d558f3 100644 --- a/crates/macros/cgp-macro-lib/src/derive_getter/parse.rs +++ b/crates/macros/cgp-macro-lib/src/derive_getter/parse.rs @@ -1,6 +1,7 @@ use alloc::vec::Vec; use cgp_macro_core::functions::{parse_field_type, parse_single_segment_type_path}; +use cgp_macro_core::types::cgp_getter::{GetterField, ReceiverMode}; use cgp_macro_core::visitors::ReplaceSelfTypeVisitor; use syn::punctuated::Punctuated; use syn::spanned::Spanned; @@ -11,9 +12,6 @@ use syn::{ Signature, TraitItem, TraitItemFn, TraitItemType, Type, parse_quote, }; -use crate::derive_getter::ReceiverMode; -use crate::derive_getter::getter_field::GetterField; - pub fn parse_getter_fields( context_type: &Ident, consumer_trait: &ItemTrait, diff --git a/crates/macros/cgp-macro-lib/src/derive_getter/use_field.rs b/crates/macros/cgp-macro-lib/src/derive_getter/use_field.rs index c6572164..a11cab52 100644 --- a/crates/macros/cgp-macro-lib/src/derive_getter/use_field.rs +++ b/crates/macros/cgp-macro-lib/src/derive_getter/use_field.rs @@ -1,4 +1,5 @@ use cgp_macro_core::types::cgp_component::CgpComponentArgs; +use cgp_macro_core::types::cgp_getter::{GetterField, ReceiverMode}; use cgp_macro_core::types::field::HasFieldBound; use proc_macro2::TokenStream; use quote::{ToTokens, quote}; @@ -8,8 +9,7 @@ use syn::{ Generics, ItemImpl, ItemTrait, TraitItemType, Type, TypeParamBound, parse_quote, parse2, }; -use crate::derive_getter::getter_field::GetterField; -use crate::derive_getter::{ContextArg, ReceiverMode, derive_getter_method}; +use crate::derive_getter::{ContextArg, derive_getter_method}; use crate::type_component::get_bounds_and_replace_self_assoc_type; pub fn derive_use_field_impl( diff --git a/crates/macros/cgp-macro-lib/src/derive_getter/use_fields.rs b/crates/macros/cgp-macro-lib/src/derive_getter/use_fields.rs index e993be54..cfe40b48 100644 --- a/crates/macros/cgp-macro-lib/src/derive_getter/use_fields.rs +++ b/crates/macros/cgp-macro-lib/src/derive_getter/use_fields.rs @@ -1,11 +1,11 @@ use cgp_macro_core::types::cgp_component::CgpComponentArgs; +use cgp_macro_core::types::cgp_getter::{GetterField, ReceiverMode}; use cgp_macro_core::types::field::{HasFieldBound, Symbol}; use proc_macro2::TokenStream; use quote::{ToTokens, quote}; use syn::{ItemImpl, ItemTrait, TraitItemType, Type, parse_quote, parse2}; -use crate::derive_getter::getter_field::GetterField; -use crate::derive_getter::{ContextArg, ReceiverMode, derive_getter_method}; +use crate::derive_getter::{ContextArg, derive_getter_method}; use crate::type_component::get_bounds_and_replace_self_assoc_type; pub fn derive_use_fields_impl( diff --git a/crates/macros/cgp-macro-lib/src/derive_getter/with_provider.rs b/crates/macros/cgp-macro-lib/src/derive_getter/with_provider.rs index ce008acb..bdb520d4 100644 --- a/crates/macros/cgp-macro-lib/src/derive_getter/with_provider.rs +++ b/crates/macros/cgp-macro-lib/src/derive_getter/with_provider.rs @@ -1,11 +1,11 @@ use cgp_macro_core::types::cgp_component::CgpComponentArgs; +use cgp_macro_core::types::cgp_getter::{GetterField, ReceiverMode}; use cgp_macro_core::types::getter::FieldMode; use proc_macro2::{Span, TokenStream}; use quote::{ToTokens, quote}; use syn::{Generics, Ident, ItemImpl, ItemTrait, TraitItemType, parse_quote, parse2}; -use crate::derive_getter::getter_field::GetterField; -use crate::derive_getter::{ContextArg, ReceiverMode, derive_getter_method}; +use crate::derive_getter::{ContextArg, derive_getter_method}; use crate::type_component::get_bounds_and_replace_self_assoc_type; pub fn derive_with_provider_impl( diff --git a/crates/macros/cgp-macro-lib/src/entrypoints/cgp_getter.rs b/crates/macros/cgp-macro-lib/src/entrypoints/cgp_getter.rs index f8fc4dcd..a23856b8 100644 --- a/crates/macros/cgp-macro-lib/src/entrypoints/cgp_getter.rs +++ b/crates/macros/cgp-macro-lib/src/entrypoints/cgp_getter.rs @@ -1,14 +1,14 @@ use cgp_macro_core::types::cgp_component::{ CgpComponentRawArgs, EvaluatedCgpComponent, ItemCgpComponent, }; +use cgp_macro_core::types::cgp_getter::GetterField; use cgp_macro_core::types::provider_impl::derive_is_provider_for; use proc_macro2::TokenStream; use quote::quote; use syn::{Ident, ItemTrait, Type, parse_quote, parse2}; use crate::derive_getter::{ - GetterField, derive_use_field_impl, derive_use_fields_impl, derive_with_provider_impl, - parse_getter_fields, + derive_use_field_impl, derive_use_fields_impl, derive_with_provider_impl, parse_getter_fields, }; pub fn cgp_getter(attr: TokenStream, body: TokenStream) -> syn::Result { @@ -31,16 +31,16 @@ pub fn cgp_getter(attr: TokenStream, body: TokenStream) -> syn::Result Date: Sun, 14 Jun 2026 14:59:12 +0200 Subject: [PATCH 02/18] Move parse_getter_fields --- .../cgp-macro-core/src/functions/getter/mod.rs | 3 +++ .../src/functions/getter}/parse.rs | 13 ++++++------- crates/macros/cgp-macro-core/src/functions/mod.rs | 2 ++ .../macros/cgp-macro-lib/src/derive_getter/mod.rs | 2 -- .../src/entrypoints/cgp_auto_getter.rs | 3 ++- .../cgp-macro-lib/src/entrypoints/cgp_getter.rs | 3 ++- 6 files changed, 15 insertions(+), 11 deletions(-) create mode 100644 crates/macros/cgp-macro-core/src/functions/getter/mod.rs rename crates/macros/{cgp-macro-lib/src/derive_getter => cgp-macro-core/src/functions/getter}/parse.rs (96%) diff --git a/crates/macros/cgp-macro-core/src/functions/getter/mod.rs b/crates/macros/cgp-macro-core/src/functions/getter/mod.rs new file mode 100644 index 00000000..4f42021d --- /dev/null +++ b/crates/macros/cgp-macro-core/src/functions/getter/mod.rs @@ -0,0 +1,3 @@ +mod parse; + +pub use parse::*; diff --git a/crates/macros/cgp-macro-lib/src/derive_getter/parse.rs b/crates/macros/cgp-macro-core/src/functions/getter/parse.rs similarity index 96% rename from crates/macros/cgp-macro-lib/src/derive_getter/parse.rs rename to crates/macros/cgp-macro-core/src/functions/getter/parse.rs index d3d558f3..e2040109 100644 --- a/crates/macros/cgp-macro-lib/src/derive_getter/parse.rs +++ b/crates/macros/cgp-macro-core/src/functions/getter/parse.rs @@ -1,8 +1,3 @@ -use alloc::vec::Vec; - -use cgp_macro_core::functions::{parse_field_type, parse_single_segment_type_path}; -use cgp_macro_core::types::cgp_getter::{GetterField, ReceiverMode}; -use cgp_macro_core::visitors::ReplaceSelfTypeVisitor; use syn::punctuated::Punctuated; use syn::spanned::Spanned; use syn::token::{Comma, Mut}; @@ -12,6 +7,10 @@ use syn::{ Signature, TraitItem, TraitItemFn, TraitItemType, Type, parse_quote, }; +use crate::functions::{parse_field_type, parse_single_segment_type_path}; +use crate::types::cgp_getter::{GetterField, ReceiverMode}; +use crate::visitors::ReplaceSelfTypeVisitor; + pub fn parse_getter_fields( context_type: &Ident, consumer_trait: &ItemTrait, @@ -89,7 +88,7 @@ pub fn parse_getter_fields( Ok((fields, field_assoc_type)) } -pub fn parse_getter_method( +fn parse_getter_method( context_type: &Ident, method: &TraitItemFn, field_assoc_type: &Option, @@ -119,7 +118,7 @@ pub fn parse_getter_method( }) } -pub fn validate_getter_method_signature(signature: &Signature) -> syn::Result<()> { +fn validate_getter_method_signature(signature: &Signature) -> syn::Result<()> { if signature.constness.is_some() { return Err(Error::new( signature.constness.span(), diff --git a/crates/macros/cgp-macro-core/src/functions/mod.rs b/crates/macros/cgp-macro-core/src/functions/mod.rs index 48701505..fe41ece1 100644 --- a/crates/macros/cgp-macro-core/src/functions/mod.rs +++ b/crates/macros/cgp-macro-core/src/functions/mod.rs @@ -1,6 +1,7 @@ mod delegated_impls; mod field; mod generics; +mod getter; mod implicits; mod is_provider_params; mod snake_case; @@ -8,6 +9,7 @@ mod snake_case; pub use delegated_impls::*; pub use field::*; pub use generics::*; +pub use getter::*; pub use implicits::*; pub use is_provider_params::*; pub use snake_case::*; diff --git a/crates/macros/cgp-macro-lib/src/derive_getter/mod.rs b/crates/macros/cgp-macro-lib/src/derive_getter/mod.rs index f3407a2d..114dc4b7 100644 --- a/crates/macros/cgp-macro-lib/src/derive_getter/mod.rs +++ b/crates/macros/cgp-macro-lib/src/derive_getter/mod.rs @@ -1,13 +1,11 @@ mod blanket; mod method; -mod parse; mod use_field; mod use_fields; mod with_provider; pub use blanket::*; pub use method::*; -pub use parse::*; pub use use_field::*; pub use use_fields::*; pub use with_provider::*; diff --git a/crates/macros/cgp-macro-lib/src/entrypoints/cgp_auto_getter.rs b/crates/macros/cgp-macro-lib/src/entrypoints/cgp_auto_getter.rs index 487ba436..19bcc7de 100644 --- a/crates/macros/cgp-macro-lib/src/entrypoints/cgp_auto_getter.rs +++ b/crates/macros/cgp-macro-lib/src/entrypoints/cgp_auto_getter.rs @@ -1,9 +1,10 @@ +use cgp_macro_core::functions::parse_getter_fields; use cgp_macro_core::types::attributes::CgpComponentAttributes; use proc_macro2::{Span, TokenStream}; use quote::quote; use syn::{Error, Ident, ItemTrait}; -use crate::derive_getter::{derive_blanket_impl, parse_getter_fields}; +use crate::derive_getter::derive_blanket_impl; pub fn cgp_auto_getter(attr: TokenStream, body: TokenStream) -> syn::Result { if !attr.is_empty() { diff --git a/crates/macros/cgp-macro-lib/src/entrypoints/cgp_getter.rs b/crates/macros/cgp-macro-lib/src/entrypoints/cgp_getter.rs index a23856b8..c4832ecd 100644 --- a/crates/macros/cgp-macro-lib/src/entrypoints/cgp_getter.rs +++ b/crates/macros/cgp-macro-lib/src/entrypoints/cgp_getter.rs @@ -1,3 +1,4 @@ +use cgp_macro_core::functions::parse_getter_fields; use cgp_macro_core::types::cgp_component::{ CgpComponentRawArgs, EvaluatedCgpComponent, ItemCgpComponent, }; @@ -8,7 +9,7 @@ use quote::quote; use syn::{Ident, ItemTrait, Type, parse_quote, parse2}; use crate::derive_getter::{ - derive_use_field_impl, derive_use_fields_impl, derive_with_provider_impl, parse_getter_fields, + derive_use_field_impl, derive_use_fields_impl, derive_with_provider_impl, }; pub fn cgp_getter(attr: TokenStream, body: TokenStream) -> syn::Result { From 4aeddb146be228e9b36e5ddffb36f94c544a12b8 Mon Sep 17 00:00:00 2001 From: Soares Chen Date: Sun, 14 Jun 2026 15:03:41 +0200 Subject: [PATCH 03/18] Implement ItemCgpGetter::try_from --- .../src/types/cgp_getter/item.rs | 19 ++++++++++++++- .../src/entrypoints/cgp_getter.rs | 23 +++++++++++-------- 2 files changed, 31 insertions(+), 11 deletions(-) diff --git a/crates/macros/cgp-macro-core/src/types/cgp_getter/item.rs b/crates/macros/cgp-macro-core/src/types/cgp_getter/item.rs index 1e7e6933..be750f71 100644 --- a/crates/macros/cgp-macro-core/src/types/cgp_getter/item.rs +++ b/crates/macros/cgp-macro-core/src/types/cgp_getter/item.rs @@ -1,5 +1,6 @@ -use syn::TraitItemType; +use syn::{Error, TraitItemType}; +use crate::functions::parse_getter_fields; use crate::types::cgp_component::EvaluatedCgpComponent; use crate::types::cgp_getter::GetterField; @@ -8,3 +9,19 @@ pub struct ItemCgpGetter { pub fields: Vec, pub field_assoc_type: Option, } + +impl TryFrom for ItemCgpGetter { + type Error = Error; + + fn try_from(item_component: EvaluatedCgpComponent) -> Result { + let (fields, field_assoc_type) = parse_getter_fields( + &item_component.args.context_ident, + &item_component.consumer_trait, + )?; + Ok(Self { + item_component, + fields, + field_assoc_type, + }) + } +} diff --git a/crates/macros/cgp-macro-lib/src/entrypoints/cgp_getter.rs b/crates/macros/cgp-macro-lib/src/entrypoints/cgp_getter.rs index c4832ecd..11beba09 100644 --- a/crates/macros/cgp-macro-lib/src/entrypoints/cgp_getter.rs +++ b/crates/macros/cgp-macro-lib/src/entrypoints/cgp_getter.rs @@ -1,8 +1,7 @@ -use cgp_macro_core::functions::parse_getter_fields; use cgp_macro_core::types::cgp_component::{ CgpComponentRawArgs, EvaluatedCgpComponent, ItemCgpComponent, }; -use cgp_macro_core::types::cgp_getter::GetterField; +use cgp_macro_core::types::cgp_getter::{GetterField, ItemCgpGetter}; use cgp_macro_core::types::provider_impl::derive_is_provider_for; use proc_macro2::TokenStream; use quote::quote; @@ -36,14 +35,18 @@ pub fn cgp_getter(attr: TokenStream, body: TokenStream) -> syn::Result Date: Sun, 14 Jun 2026 15:11:08 +0200 Subject: [PATCH 04/18] Move get_bounds_and_replace_self_assoc_type --- .../src/types/cgp_getter/mod.rs | 1 + .../types/cgp_getter/to_use_fields_impl.rs | 95 +++++++++++++++++++ .../macros/cgp-macro-core/src/visitors/mod.rs | 2 + .../src/visitors/self_assoc_type.rs} | 0 .../src/derive_getter/blanket.rs | 2 +- .../src/derive_getter/use_field.rs | 2 +- .../src/derive_getter/use_fields.rs | 2 +- .../src/derive_getter/with_provider.rs | 2 +- .../src/type_component/derive.rs | 3 +- .../cgp-macro-lib/src/type_component/mod.rs | 2 - 10 files changed, 103 insertions(+), 8 deletions(-) create mode 100644 crates/macros/cgp-macro-core/src/types/cgp_getter/to_use_fields_impl.rs rename crates/macros/{cgp-macro-lib/src/type_component/replace.rs => cgp-macro-core/src/visitors/self_assoc_type.rs} (100%) diff --git a/crates/macros/cgp-macro-core/src/types/cgp_getter/mod.rs b/crates/macros/cgp-macro-core/src/types/cgp_getter/mod.rs index a03353a5..50adae36 100644 --- a/crates/macros/cgp-macro-core/src/types/cgp_getter/mod.rs +++ b/crates/macros/cgp-macro-core/src/types/cgp_getter/mod.rs @@ -1,5 +1,6 @@ mod getter_field; mod item; +// mod to_use_fields_impl; pub use getter_field::*; pub use item::*; diff --git a/crates/macros/cgp-macro-core/src/types/cgp_getter/to_use_fields_impl.rs b/crates/macros/cgp-macro-core/src/types/cgp_getter/to_use_fields_impl.rs new file mode 100644 index 00000000..b3941a11 --- /dev/null +++ b/crates/macros/cgp-macro-core/src/types/cgp_getter/to_use_fields_impl.rs @@ -0,0 +1,95 @@ +use proc_macro2::TokenStream; +use quote::{ToTokens, quote}; +use syn::{Type, parse_quote, parse2}; + +use crate::types::cgp_getter::{ItemCgpGetter, ReceiverMode}; +use crate::types::field::Symbol; +use crate::types::provider_impl::ItemProviderImpl; +use crate::visitors::get_bounds_and_replace_self_assoc_type; + + +impl ItemCgpGetter { + pub fn to_use_fields_impl(&self) -> syn::Result { + let provider_trait = &self.item_component.provider_trait; + + let context_type = &self.item_component.args.context_ident; + + let provider_name = &self.item_component.args.provider_ident; + + let mut items: TokenStream = TokenStream::new(); + + let mut provider_generics = provider_trait.generics.clone(); + + if let Some(field_assoc_type) = &self.field_assoc_type { + let field_assoc_type_ident = &field_assoc_type.ident; + + provider_generics + .params + .push(parse2(field_assoc_type_ident.to_token_stream())?); + + items.extend(quote! { + type #field_assoc_type_ident = #field_assoc_type_ident; + }); + + let field_constraints = get_bounds_and_replace_self_assoc_type(field_assoc_type); + + provider_generics + .make_where_clause() + .predicates + .push(parse2(quote! { + #field_assoc_type_ident: #field_constraints + })?); + } + + let where_clause = provider_generics.make_where_clause(); + + for field in &self.fields { + let receiver_type = match &field.receiver_mode { + ReceiverMode::SelfReceiver => context_type.to_token_stream(), + ReceiverMode::Type(ty) => ty.to_token_stream(), + }; + + let field_name = Symbol::new(field.field_name.clone()); + let tag_type: Type = parse_quote!(#field_name); + + let method = derive_getter_method( + &ContextArg::Ident(receiver_type.clone()), + field, + Some(quote! { ::< #field_name > }), + None, + ); + + items.extend(method); + + let field_type = if let Some(trait_item) = &field_assoc_type { + let trait_item_ident = &trait_item.ident; + parse_quote!(#trait_item_ident) + } else { + field.field_type.clone() + }; + + let constraint = HasFieldBound { + field_type, + field_mut: field.receiver_mut, + field_mode: field.field_mode.clone(), + tag_type: tag_type.clone(), + }; + + where_clause + .predicates + .push(parse2(quote! { #receiver_type: #constraint })?); + } + + let (_, type_generics, _) = provider_trait.generics.split_for_impl(); + let (impl_generics, _, where_clause) = provider_generics.split_for_impl(); + + let out = parse2(quote! { + impl #impl_generics #provider_name #type_generics for UseFields + #where_clause + { + #items + } + })?; + todo!() + } +} diff --git a/crates/macros/cgp-macro-core/src/visitors/mod.rs b/crates/macros/cgp-macro-core/src/visitors/mod.rs index 8a4dbdcd..773cb309 100644 --- a/crates/macros/cgp-macro-core/src/visitors/mod.rs +++ b/crates/macros/cgp-macro-core/src/visitors/mod.rs @@ -1,7 +1,9 @@ mod replace_provider; mod replace_self; +mod self_assoc_type; mod substitute_abstract_type; pub use replace_provider::*; pub use replace_self::*; +pub use self_assoc_type::*; pub use substitute_abstract_type::*; diff --git a/crates/macros/cgp-macro-lib/src/type_component/replace.rs b/crates/macros/cgp-macro-core/src/visitors/self_assoc_type.rs similarity index 100% rename from crates/macros/cgp-macro-lib/src/type_component/replace.rs rename to crates/macros/cgp-macro-core/src/visitors/self_assoc_type.rs diff --git a/crates/macros/cgp-macro-lib/src/derive_getter/blanket.rs b/crates/macros/cgp-macro-lib/src/derive_getter/blanket.rs index a0404fc9..982ff7d2 100644 --- a/crates/macros/cgp-macro-lib/src/derive_getter/blanket.rs +++ b/crates/macros/cgp-macro-lib/src/derive_getter/blanket.rs @@ -1,11 +1,11 @@ use cgp_macro_core::types::cgp_getter::{GetterField, ReceiverMode}; use cgp_macro_core::types::field::{FieldName, HasFieldBound}; +use cgp_macro_core::visitors::get_bounds_and_replace_self_assoc_type; use proc_macro2::TokenStream; use quote::{ToTokens, quote}; use syn::{Ident, ItemImpl, ItemTrait, TraitItemType, parse_quote, parse2}; use crate::derive_getter::{ContextArg, derive_getter_method}; -use crate::type_component::get_bounds_and_replace_self_assoc_type; pub fn derive_blanket_impl( context_type: &Ident, diff --git a/crates/macros/cgp-macro-lib/src/derive_getter/use_field.rs b/crates/macros/cgp-macro-lib/src/derive_getter/use_field.rs index a11cab52..a8bb2974 100644 --- a/crates/macros/cgp-macro-lib/src/derive_getter/use_field.rs +++ b/crates/macros/cgp-macro-lib/src/derive_getter/use_field.rs @@ -1,6 +1,7 @@ use cgp_macro_core::types::cgp_component::CgpComponentArgs; use cgp_macro_core::types::cgp_getter::{GetterField, ReceiverMode}; use cgp_macro_core::types::field::HasFieldBound; +use cgp_macro_core::visitors::get_bounds_and_replace_self_assoc_type; use proc_macro2::TokenStream; use quote::{ToTokens, quote}; use syn::punctuated::Punctuated; @@ -10,7 +11,6 @@ use syn::{ }; use crate::derive_getter::{ContextArg, derive_getter_method}; -use crate::type_component::get_bounds_and_replace_self_assoc_type; pub fn derive_use_field_impl( spec: &CgpComponentArgs, diff --git a/crates/macros/cgp-macro-lib/src/derive_getter/use_fields.rs b/crates/macros/cgp-macro-lib/src/derive_getter/use_fields.rs index cfe40b48..c9212ca2 100644 --- a/crates/macros/cgp-macro-lib/src/derive_getter/use_fields.rs +++ b/crates/macros/cgp-macro-lib/src/derive_getter/use_fields.rs @@ -1,12 +1,12 @@ use cgp_macro_core::types::cgp_component::CgpComponentArgs; use cgp_macro_core::types::cgp_getter::{GetterField, ReceiverMode}; use cgp_macro_core::types::field::{HasFieldBound, Symbol}; +use cgp_macro_core::visitors::get_bounds_and_replace_self_assoc_type; use proc_macro2::TokenStream; use quote::{ToTokens, quote}; use syn::{ItemImpl, ItemTrait, TraitItemType, Type, parse_quote, parse2}; use crate::derive_getter::{ContextArg, derive_getter_method}; -use crate::type_component::get_bounds_and_replace_self_assoc_type; pub fn derive_use_fields_impl( spec: &CgpComponentArgs, diff --git a/crates/macros/cgp-macro-lib/src/derive_getter/with_provider.rs b/crates/macros/cgp-macro-lib/src/derive_getter/with_provider.rs index bdb520d4..c10fda59 100644 --- a/crates/macros/cgp-macro-lib/src/derive_getter/with_provider.rs +++ b/crates/macros/cgp-macro-lib/src/derive_getter/with_provider.rs @@ -1,12 +1,12 @@ use cgp_macro_core::types::cgp_component::CgpComponentArgs; use cgp_macro_core::types::cgp_getter::{GetterField, ReceiverMode}; use cgp_macro_core::types::getter::FieldMode; +use cgp_macro_core::visitors::get_bounds_and_replace_self_assoc_type; use proc_macro2::{Span, TokenStream}; use quote::{ToTokens, quote}; use syn::{Generics, Ident, ItemImpl, ItemTrait, TraitItemType, parse_quote, parse2}; use crate::derive_getter::{ContextArg, derive_getter_method}; -use crate::type_component::get_bounds_and_replace_self_assoc_type; pub fn derive_with_provider_impl( spec: &CgpComponentArgs, diff --git a/crates/macros/cgp-macro-lib/src/type_component/derive.rs b/crates/macros/cgp-macro-lib/src/type_component/derive.rs index 5bb1e535..93eda744 100644 --- a/crates/macros/cgp-macro-lib/src/type_component/derive.rs +++ b/crates/macros/cgp-macro-lib/src/type_component/derive.rs @@ -2,12 +2,11 @@ use alloc::vec::Vec; use cgp_macro_core::types::cgp_component::CgpComponentArgs; use cgp_macro_core::types::provider_impl::derive_is_provider_for; +use cgp_macro_core::visitors::get_bounds_and_replace_self_assoc_type; use quote::{ToTokens, quote}; use syn::spanned::Spanned; use syn::{Error, Generics, ItemImpl, ItemTrait, TraitItem, TraitItemType, Type, parse2}; -use crate::type_component::replace::get_bounds_and_replace_self_assoc_type; - pub fn extract_item_type_from_trait(consumer_trait: &ItemTrait) -> syn::Result<&TraitItemType> { if consumer_trait.items.len() != 1 { return Err(Error::new( diff --git a/crates/macros/cgp-macro-lib/src/type_component/mod.rs b/crates/macros/cgp-macro-lib/src/type_component/mod.rs index 8eaf91af..61eca8a7 100644 --- a/crates/macros/cgp-macro-lib/src/type_component/mod.rs +++ b/crates/macros/cgp-macro-lib/src/type_component/mod.rs @@ -1,5 +1,3 @@ mod derive; -mod replace; pub use derive::*; -pub use replace::*; From 31ba1fdcda3eba677202554931ac05218ce2aaa8 Mon Sep 17 00:00:00 2001 From: Soares Chen Date: Sun, 14 Jun 2026 15:14:02 +0200 Subject: [PATCH 05/18] Make derive_getter_method return ItemFn --- .../cgp-macro-lib/src/derive_getter/blanket.rs | 4 ++-- .../cgp-macro-lib/src/derive_getter/method.rs | 8 ++++---- .../cgp-macro-lib/src/derive_getter/use_field.rs | 10 ++++------ .../cgp-macro-lib/src/derive_getter/use_fields.rs | 4 ++-- .../src/derive_getter/with_provider.rs | 15 +++++++++------ 5 files changed, 21 insertions(+), 20 deletions(-) diff --git a/crates/macros/cgp-macro-lib/src/derive_getter/blanket.rs b/crates/macros/cgp-macro-lib/src/derive_getter/blanket.rs index 982ff7d2..49220de5 100644 --- a/crates/macros/cgp-macro-lib/src/derive_getter/blanket.rs +++ b/crates/macros/cgp-macro-lib/src/derive_getter/blanket.rs @@ -68,9 +68,9 @@ pub fn derive_blanket_impl( field, Some(quote! { ::< #field_name > }), None, - ); + )?; - items.extend(method); + items.extend(method.to_token_stream()); let field_type = if let Some(trait_item) = &field_assoc_type { let trait_item_ident = &trait_item.ident; diff --git a/crates/macros/cgp-macro-lib/src/derive_getter/method.rs b/crates/macros/cgp-macro-lib/src/derive_getter/method.rs index fee39814..6bb11e31 100644 --- a/crates/macros/cgp-macro-lib/src/derive_getter/method.rs +++ b/crates/macros/cgp-macro-lib/src/derive_getter/method.rs @@ -2,8 +2,8 @@ use cgp_macro_core::types::cgp_getter::GetterField; use cgp_macro_core::types::getter::FieldMode; use proc_macro2::TokenStream; use quote::quote; -use syn::Ident; use syn::token::Mut; +use syn::{Ident, ItemFn, parse2}; pub enum ContextArg { SelfArg, @@ -15,7 +15,7 @@ pub fn derive_getter_method( spec: &GetterField, phantom_generics: Option, provider_ident: Option, -) -> TokenStream { +) -> syn::Result { let field_name = &spec.field_name; let phantom_arg = match &spec.phantom_arg_type { @@ -76,11 +76,11 @@ pub fn derive_getter_method( let return_type = &spec.return_type; - quote! { + parse2(quote! { fn #field_name( #context_fn_arg #phantom_arg ) -> #return_type { #call_expr } - } + }) } pub fn extend_call_expr( diff --git a/crates/macros/cgp-macro-lib/src/derive_getter/use_field.rs b/crates/macros/cgp-macro-lib/src/derive_getter/use_field.rs index a8bb2974..bc395cae 100644 --- a/crates/macros/cgp-macro-lib/src/derive_getter/use_field.rs +++ b/crates/macros/cgp-macro-lib/src/derive_getter/use_field.rs @@ -55,12 +55,10 @@ pub fn derive_use_field_impl( })?); } - items.extend(derive_getter_method( - &ContextArg::Ident(receiver_type.clone()), - field, - None, - None, - )); + items.extend( + derive_getter_method(&ContextArg::Ident(receiver_type.clone()), field, None, None)? + .to_token_stream(), + ); let field_type = if let Some(trait_item) = &field_assoc_type { let trait_item_ident = &trait_item.ident; diff --git a/crates/macros/cgp-macro-lib/src/derive_getter/use_fields.rs b/crates/macros/cgp-macro-lib/src/derive_getter/use_fields.rs index c9212ca2..6492ea3a 100644 --- a/crates/macros/cgp-macro-lib/src/derive_getter/use_fields.rs +++ b/crates/macros/cgp-macro-lib/src/derive_getter/use_fields.rs @@ -59,9 +59,9 @@ pub fn derive_use_fields_impl( field, Some(quote! { ::< #field_name > }), None, - ); + )?; - items.extend(method); + items.extend(method.to_token_stream()); let field_type = if let Some(trait_item) = &field_assoc_type { let trait_item_ident = &trait_item.ident; diff --git a/crates/macros/cgp-macro-lib/src/derive_getter/with_provider.rs b/crates/macros/cgp-macro-lib/src/derive_getter/with_provider.rs index c10fda59..84197fb5 100644 --- a/crates/macros/cgp-macro-lib/src/derive_getter/with_provider.rs +++ b/crates/macros/cgp-macro-lib/src/derive_getter/with_provider.rs @@ -75,12 +75,15 @@ pub fn derive_with_provider_impl( } }; - items.extend(derive_getter_method( - &ContextArg::Ident(receiver_type), - field, - None, - Some(provider_ident.clone()), - )); + items.extend( + derive_getter_method( + &ContextArg::Ident(receiver_type), + field, + None, + Some(provider_ident.clone()), + )? + .to_token_stream(), + ); let mut where_clause = provider_generics.make_where_clause().clone(); where_clause From 3bae1ce932a6c8e198b55c07999b58dae783e7e7 Mon Sep 17 00:00:00 2001 From: Soares Chen Date: Sun, 14 Jun 2026 15:22:43 +0200 Subject: [PATCH 06/18] Make `ContextArg` accept `Type` --- .../macros/cgp-macro-lib/src/derive_getter/blanket.rs | 5 +---- .../macros/cgp-macro-lib/src/derive_getter/method.rs | 10 +++++----- .../cgp-macro-lib/src/derive_getter/use_field.rs | 6 +++--- .../cgp-macro-lib/src/derive_getter/use_fields.rs | 6 +++--- .../cgp-macro-lib/src/derive_getter/with_provider.rs | 6 +++--- 5 files changed, 15 insertions(+), 18 deletions(-) diff --git a/crates/macros/cgp-macro-lib/src/derive_getter/blanket.rs b/crates/macros/cgp-macro-lib/src/derive_getter/blanket.rs index 49220de5..aa0ba66b 100644 --- a/crates/macros/cgp-macro-lib/src/derive_getter/blanket.rs +++ b/crates/macros/cgp-macro-lib/src/derive_getter/blanket.rs @@ -54,10 +54,7 @@ pub fn derive_blanket_impl( for field in fields { let (receiver_type, context_arg) = match &field.receiver_mode { ReceiverMode::SelfReceiver => (context_type.to_token_stream(), ContextArg::SelfArg), - ReceiverMode::Type(ty) => ( - ty.to_token_stream(), - ContextArg::Ident(ty.to_token_stream()), - ), + ReceiverMode::Type(ty) => (ty.to_token_stream(), ContextArg::Type(ty.as_ref().clone())), }; let field_name = FieldName::from(field.field_name.clone()); diff --git a/crates/macros/cgp-macro-lib/src/derive_getter/method.rs b/crates/macros/cgp-macro-lib/src/derive_getter/method.rs index 6bb11e31..76d4fff9 100644 --- a/crates/macros/cgp-macro-lib/src/derive_getter/method.rs +++ b/crates/macros/cgp-macro-lib/src/derive_getter/method.rs @@ -3,11 +3,11 @@ use cgp_macro_core::types::getter::FieldMode; use proc_macro2::TokenStream; use quote::quote; use syn::token::Mut; -use syn::{Ident, ItemFn, parse2}; +use syn::{Ident, ItemFn, Type, parse2}; pub enum ContextArg { SelfArg, - Ident(TokenStream), + Type(Type), } pub fn derive_getter_method( @@ -35,7 +35,7 @@ pub fn derive_getter_method( quote! { &mut self } } } - ContextArg::Ident(context_type) => { + ContextArg::Type(context_type) => { if spec.receiver_mut.is_none() { quote! { context: & #context_type} } else { @@ -54,7 +54,7 @@ pub fn derive_getter_method( ContextArg::SelfArg => { quote! { self } } - ContextArg::Ident(_) => { + ContextArg::Type(_) => { quote! { context } } }; @@ -83,7 +83,7 @@ pub fn derive_getter_method( }) } -pub fn extend_call_expr( +fn extend_call_expr( call_expr: TokenStream, field_mode: &FieldMode, field_mut: &Option, diff --git a/crates/macros/cgp-macro-lib/src/derive_getter/use_field.rs b/crates/macros/cgp-macro-lib/src/derive_getter/use_field.rs index bc395cae..90b93005 100644 --- a/crates/macros/cgp-macro-lib/src/derive_getter/use_field.rs +++ b/crates/macros/cgp-macro-lib/src/derive_getter/use_field.rs @@ -22,8 +22,8 @@ pub fn derive_use_field_impl( let provider_name = &provider_trait.ident; let receiver_type = match &field.receiver_mode { - ReceiverMode::SelfReceiver => context_type.to_token_stream(), - ReceiverMode::Type(ty) => ty.to_token_stream(), + ReceiverMode::SelfReceiver => parse_quote!(#context_type), + ReceiverMode::Type(ty) => ty.as_ref().clone(), }; let mut field_constraints: Punctuated = Punctuated::default(); @@ -56,7 +56,7 @@ pub fn derive_use_field_impl( } items.extend( - derive_getter_method(&ContextArg::Ident(receiver_type.clone()), field, None, None)? + derive_getter_method(&ContextArg::Type(receiver_type.clone()), field, None, None)? .to_token_stream(), ); diff --git a/crates/macros/cgp-macro-lib/src/derive_getter/use_fields.rs b/crates/macros/cgp-macro-lib/src/derive_getter/use_fields.rs index 6492ea3a..86dbd55d 100644 --- a/crates/macros/cgp-macro-lib/src/derive_getter/use_fields.rs +++ b/crates/macros/cgp-macro-lib/src/derive_getter/use_fields.rs @@ -47,15 +47,15 @@ pub fn derive_use_fields_impl( for field in fields { let receiver_type = match &field.receiver_mode { - ReceiverMode::SelfReceiver => context_type.to_token_stream(), - ReceiverMode::Type(ty) => ty.to_token_stream(), + ReceiverMode::SelfReceiver => parse_quote!(#context_type), + ReceiverMode::Type(ty) => ty.as_ref().clone(), }; let field_name = Symbol::new(field.field_name.clone()); let tag_type: Type = parse_quote!(#field_name); let method = derive_getter_method( - &ContextArg::Ident(receiver_type.clone()), + &ContextArg::Type(receiver_type.clone()), field, Some(quote! { ::< #field_name > }), None, diff --git a/crates/macros/cgp-macro-lib/src/derive_getter/with_provider.rs b/crates/macros/cgp-macro-lib/src/derive_getter/with_provider.rs index 84197fb5..1a746180 100644 --- a/crates/macros/cgp-macro-lib/src/derive_getter/with_provider.rs +++ b/crates/macros/cgp-macro-lib/src/derive_getter/with_provider.rs @@ -20,8 +20,8 @@ pub fn derive_with_provider_impl( let provider_name = &spec.provider_ident; let receiver_type = match &field.receiver_mode { - ReceiverMode::SelfReceiver => context_type.to_token_stream(), - ReceiverMode::Type(ty) => ty.to_token_stream(), + ReceiverMode::SelfReceiver => parse_quote!(#context_type), + ReceiverMode::Type(ty) => ty.as_ref().clone(), }; let field_type = match field_assoc_type { @@ -77,7 +77,7 @@ pub fn derive_with_provider_impl( items.extend( derive_getter_method( - &ContextArg::Ident(receiver_type), + &ContextArg::Type(receiver_type), field, None, Some(provider_ident.clone()), From d15e9316498c606b3911519286a237de7d6c0a64 Mon Sep 17 00:00:00 2001 From: Soares Chen Date: Sun, 14 Jun 2026 20:46:10 +0200 Subject: [PATCH 07/18] Accept tag type in derive_getter_method --- .../macros/cgp-macro-lib/src/derive_getter/blanket.rs | 7 +------ .../macros/cgp-macro-lib/src/derive_getter/method.rs | 10 +++++----- .../cgp-macro-lib/src/derive_getter/use_field.rs | 9 +++++++-- .../cgp-macro-lib/src/derive_getter/use_fields.rs | 2 +- .../cgp-macro-lib/src/derive_getter/with_provider.rs | 2 +- 5 files changed, 15 insertions(+), 15 deletions(-) diff --git a/crates/macros/cgp-macro-lib/src/derive_getter/blanket.rs b/crates/macros/cgp-macro-lib/src/derive_getter/blanket.rs index aa0ba66b..bc86cc5d 100644 --- a/crates/macros/cgp-macro-lib/src/derive_getter/blanket.rs +++ b/crates/macros/cgp-macro-lib/src/derive_getter/blanket.rs @@ -60,12 +60,7 @@ pub fn derive_blanket_impl( let field_name = FieldName::from(field.field_name.clone()); let tag_type = parse_quote!(#field_name); - let method = derive_getter_method( - &context_arg, - field, - Some(quote! { ::< #field_name > }), - None, - )?; + let method = derive_getter_method(&context_arg, field, &tag_type, None)?; items.extend(method.to_token_stream()); diff --git a/crates/macros/cgp-macro-lib/src/derive_getter/method.rs b/crates/macros/cgp-macro-lib/src/derive_getter/method.rs index 76d4fff9..73f23081 100644 --- a/crates/macros/cgp-macro-lib/src/derive_getter/method.rs +++ b/crates/macros/cgp-macro-lib/src/derive_getter/method.rs @@ -13,10 +13,10 @@ pub enum ContextArg { pub fn derive_getter_method( context_arg: &ContextArg, spec: &GetterField, - phantom_generics: Option, + tag_type: &Type, provider_ident: Option, ) -> syn::Result { - let field_name = &spec.field_name; + let getter_ident = &spec.field_name; let phantom_arg = match &spec.phantom_arg_type { Some(phantom) => { @@ -62,12 +62,12 @@ pub fn derive_getter_method( let call_expr = match provider_ident { Some(provider_ident) => { quote! { - #provider_ident :: #get_field_method ( #context_var, ::core::marker::PhantomData #phantom_generics ) + #provider_ident :: #get_field_method ( #context_var, ::core::marker::PhantomData::< #tag_type > ) } } None => { quote! { - #context_var . #get_field_method ( ::core::marker::PhantomData #phantom_generics ) + #context_var . #get_field_method ( ::core::marker::PhantomData::< #tag_type > ) } } }; @@ -77,7 +77,7 @@ pub fn derive_getter_method( let return_type = &spec.return_type; parse2(quote! { - fn #field_name( #context_fn_arg #phantom_arg ) -> #return_type { + fn #getter_ident( #context_fn_arg #phantom_arg ) -> #return_type { #call_expr } }) diff --git a/crates/macros/cgp-macro-lib/src/derive_getter/use_field.rs b/crates/macros/cgp-macro-lib/src/derive_getter/use_field.rs index 90b93005..0c1037c2 100644 --- a/crates/macros/cgp-macro-lib/src/derive_getter/use_field.rs +++ b/crates/macros/cgp-macro-lib/src/derive_getter/use_field.rs @@ -56,8 +56,13 @@ pub fn derive_use_field_impl( } items.extend( - derive_getter_method(&ContextArg::Type(receiver_type.clone()), field, None, None)? - .to_token_stream(), + derive_getter_method( + &ContextArg::Type(receiver_type.clone()), + field, + &tag_type, + None, + )? + .to_token_stream(), ); let field_type = if let Some(trait_item) = &field_assoc_type { diff --git a/crates/macros/cgp-macro-lib/src/derive_getter/use_fields.rs b/crates/macros/cgp-macro-lib/src/derive_getter/use_fields.rs index 86dbd55d..fcdce362 100644 --- a/crates/macros/cgp-macro-lib/src/derive_getter/use_fields.rs +++ b/crates/macros/cgp-macro-lib/src/derive_getter/use_fields.rs @@ -57,7 +57,7 @@ pub fn derive_use_fields_impl( let method = derive_getter_method( &ContextArg::Type(receiver_type.clone()), field, - Some(quote! { ::< #field_name > }), + &tag_type, None, )?; diff --git a/crates/macros/cgp-macro-lib/src/derive_getter/with_provider.rs b/crates/macros/cgp-macro-lib/src/derive_getter/with_provider.rs index 1a746180..90d5539d 100644 --- a/crates/macros/cgp-macro-lib/src/derive_getter/with_provider.rs +++ b/crates/macros/cgp-macro-lib/src/derive_getter/with_provider.rs @@ -79,7 +79,7 @@ pub fn derive_with_provider_impl( derive_getter_method( &ContextArg::Type(receiver_type), field, - None, + &component_name.to_type(), Some(provider_ident.clone()), )? .to_token_stream(), From 01ac83b38961f121e53bfcf0749e2af2d86d55ca Mon Sep 17 00:00:00 2001 From: Soares Chen Date: Sun, 14 Jun 2026 21:00:35 +0200 Subject: [PATCH 08/18] Move ContextArg --- .../cgp-macro-core/src/types/getter/context_arg.rs | 6 ++++++ .../macros/cgp-macro-core/src/types/getter/mod.rs | 2 ++ .../cgp-macro-lib/src/derive_getter/blanket.rs | 3 ++- .../cgp-macro-lib/src/derive_getter/method.rs | 13 ++++--------- .../cgp-macro-lib/src/derive_getter/use_field.rs | 3 ++- .../cgp-macro-lib/src/derive_getter/use_fields.rs | 3 ++- .../src/derive_getter/with_provider.rs | 4 ++-- 7 files changed, 20 insertions(+), 14 deletions(-) create mode 100644 crates/macros/cgp-macro-core/src/types/getter/context_arg.rs diff --git a/crates/macros/cgp-macro-core/src/types/getter/context_arg.rs b/crates/macros/cgp-macro-core/src/types/getter/context_arg.rs new file mode 100644 index 00000000..9e14977e --- /dev/null +++ b/crates/macros/cgp-macro-core/src/types/getter/context_arg.rs @@ -0,0 +1,6 @@ +use syn::Type; + +pub enum ContextArg { + SelfArg, + Type(Type), +} diff --git a/crates/macros/cgp-macro-core/src/types/getter/mod.rs b/crates/macros/cgp-macro-core/src/types/getter/mod.rs index 5d40e8a8..4bd6b578 100644 --- a/crates/macros/cgp-macro-core/src/types/getter/mod.rs +++ b/crates/macros/cgp-macro-core/src/types/getter/mod.rs @@ -1,7 +1,9 @@ +mod context_arg; mod field_mode; mod get_field_expr; mod get_field_with_mode_expr; +pub use context_arg::*; pub use field_mode::*; pub use get_field_expr::*; pub use get_field_with_mode_expr::*; diff --git a/crates/macros/cgp-macro-lib/src/derive_getter/blanket.rs b/crates/macros/cgp-macro-lib/src/derive_getter/blanket.rs index bc86cc5d..78a13699 100644 --- a/crates/macros/cgp-macro-lib/src/derive_getter/blanket.rs +++ b/crates/macros/cgp-macro-lib/src/derive_getter/blanket.rs @@ -1,11 +1,12 @@ use cgp_macro_core::types::cgp_getter::{GetterField, ReceiverMode}; use cgp_macro_core::types::field::{FieldName, HasFieldBound}; +use cgp_macro_core::types::getter::ContextArg; use cgp_macro_core::visitors::get_bounds_and_replace_self_assoc_type; use proc_macro2::TokenStream; use quote::{ToTokens, quote}; use syn::{Ident, ItemImpl, ItemTrait, TraitItemType, parse_quote, parse2}; -use crate::derive_getter::{ContextArg, derive_getter_method}; +use crate::derive_getter::derive_getter_method; pub fn derive_blanket_impl( context_type: &Ident, diff --git a/crates/macros/cgp-macro-lib/src/derive_getter/method.rs b/crates/macros/cgp-macro-lib/src/derive_getter/method.rs index 73f23081..6d8be38d 100644 --- a/crates/macros/cgp-macro-lib/src/derive_getter/method.rs +++ b/crates/macros/cgp-macro-lib/src/derive_getter/method.rs @@ -1,15 +1,10 @@ use cgp_macro_core::types::cgp_getter::GetterField; -use cgp_macro_core::types::getter::FieldMode; +use cgp_macro_core::types::getter::{ContextArg, FieldMode}; use proc_macro2::TokenStream; use quote::quote; use syn::token::Mut; use syn::{Ident, ItemFn, Type, parse2}; -pub enum ContextArg { - SelfArg, - Type(Type), -} - pub fn derive_getter_method( context_arg: &ContextArg, spec: &GetterField, @@ -37,9 +32,9 @@ pub fn derive_getter_method( } ContextArg::Type(context_type) => { if spec.receiver_mut.is_none() { - quote! { context: & #context_type} + quote! { __context__: & #context_type} } else { - quote! { context: &mut #context_type } + quote! { __context__: &mut #context_type } } } }; @@ -55,7 +50,7 @@ pub fn derive_getter_method( quote! { self } } ContextArg::Type(_) => { - quote! { context } + quote! { __context__ } } }; diff --git a/crates/macros/cgp-macro-lib/src/derive_getter/use_field.rs b/crates/macros/cgp-macro-lib/src/derive_getter/use_field.rs index 0c1037c2..df89935c 100644 --- a/crates/macros/cgp-macro-lib/src/derive_getter/use_field.rs +++ b/crates/macros/cgp-macro-lib/src/derive_getter/use_field.rs @@ -1,6 +1,7 @@ use cgp_macro_core::types::cgp_component::CgpComponentArgs; use cgp_macro_core::types::cgp_getter::{GetterField, ReceiverMode}; use cgp_macro_core::types::field::HasFieldBound; +use cgp_macro_core::types::getter::ContextArg; use cgp_macro_core::visitors::get_bounds_and_replace_self_assoc_type; use proc_macro2::TokenStream; use quote::{ToTokens, quote}; @@ -10,7 +11,7 @@ use syn::{ Generics, ItemImpl, ItemTrait, TraitItemType, Type, TypeParamBound, parse_quote, parse2, }; -use crate::derive_getter::{ContextArg, derive_getter_method}; +use crate::derive_getter::derive_getter_method; pub fn derive_use_field_impl( spec: &CgpComponentArgs, diff --git a/crates/macros/cgp-macro-lib/src/derive_getter/use_fields.rs b/crates/macros/cgp-macro-lib/src/derive_getter/use_fields.rs index fcdce362..bb9c5b6f 100644 --- a/crates/macros/cgp-macro-lib/src/derive_getter/use_fields.rs +++ b/crates/macros/cgp-macro-lib/src/derive_getter/use_fields.rs @@ -1,12 +1,13 @@ use cgp_macro_core::types::cgp_component::CgpComponentArgs; use cgp_macro_core::types::cgp_getter::{GetterField, ReceiverMode}; use cgp_macro_core::types::field::{HasFieldBound, Symbol}; +use cgp_macro_core::types::getter::ContextArg; use cgp_macro_core::visitors::get_bounds_and_replace_self_assoc_type; use proc_macro2::TokenStream; use quote::{ToTokens, quote}; use syn::{ItemImpl, ItemTrait, TraitItemType, Type, parse_quote, parse2}; -use crate::derive_getter::{ContextArg, derive_getter_method}; +use crate::derive_getter::derive_getter_method; pub fn derive_use_fields_impl( spec: &CgpComponentArgs, diff --git a/crates/macros/cgp-macro-lib/src/derive_getter/with_provider.rs b/crates/macros/cgp-macro-lib/src/derive_getter/with_provider.rs index 90d5539d..9137af9b 100644 --- a/crates/macros/cgp-macro-lib/src/derive_getter/with_provider.rs +++ b/crates/macros/cgp-macro-lib/src/derive_getter/with_provider.rs @@ -1,12 +1,12 @@ use cgp_macro_core::types::cgp_component::CgpComponentArgs; use cgp_macro_core::types::cgp_getter::{GetterField, ReceiverMode}; -use cgp_macro_core::types::getter::FieldMode; +use cgp_macro_core::types::getter::{ContextArg, FieldMode}; use cgp_macro_core::visitors::get_bounds_and_replace_self_assoc_type; use proc_macro2::{Span, TokenStream}; use quote::{ToTokens, quote}; use syn::{Generics, Ident, ItemImpl, ItemTrait, TraitItemType, parse_quote, parse2}; -use crate::derive_getter::{ContextArg, derive_getter_method}; +use crate::derive_getter::derive_getter_method; pub fn derive_with_provider_impl( spec: &CgpComponentArgs, From 9d8cd64b49257616d6358cd1fa6490eaee22d167 Mon Sep 17 00:00:00 2001 From: Soares Chen Date: Sun, 14 Jun 2026 21:02:09 +0200 Subject: [PATCH 09/18] Move derive_getter_method --- .../src/types/getter}/method.rs | 5 +++-- crates/macros/cgp-macro-core/src/types/getter/mod.rs | 2 ++ crates/macros/cgp-macro-lib/src/derive_getter/blanket.rs | 4 +--- crates/macros/cgp-macro-lib/src/derive_getter/mod.rs | 2 -- crates/macros/cgp-macro-lib/src/derive_getter/use_field.rs | 4 +--- crates/macros/cgp-macro-lib/src/derive_getter/use_fields.rs | 4 +--- .../macros/cgp-macro-lib/src/derive_getter/with_provider.rs | 4 +--- 7 files changed, 9 insertions(+), 16 deletions(-) rename crates/macros/{cgp-macro-lib/src/derive_getter => cgp-macro-core/src/types/getter}/method.rs (96%) diff --git a/crates/macros/cgp-macro-lib/src/derive_getter/method.rs b/crates/macros/cgp-macro-core/src/types/getter/method.rs similarity index 96% rename from crates/macros/cgp-macro-lib/src/derive_getter/method.rs rename to crates/macros/cgp-macro-core/src/types/getter/method.rs index 6d8be38d..62bb307b 100644 --- a/crates/macros/cgp-macro-lib/src/derive_getter/method.rs +++ b/crates/macros/cgp-macro-core/src/types/getter/method.rs @@ -1,10 +1,11 @@ -use cgp_macro_core::types::cgp_getter::GetterField; -use cgp_macro_core::types::getter::{ContextArg, FieldMode}; use proc_macro2::TokenStream; use quote::quote; use syn::token::Mut; use syn::{Ident, ItemFn, Type, parse2}; +use crate::types::cgp_getter::GetterField; +use crate::types::getter::{ContextArg, FieldMode}; + pub fn derive_getter_method( context_arg: &ContextArg, spec: &GetterField, diff --git a/crates/macros/cgp-macro-core/src/types/getter/mod.rs b/crates/macros/cgp-macro-core/src/types/getter/mod.rs index 4bd6b578..b1c657c8 100644 --- a/crates/macros/cgp-macro-core/src/types/getter/mod.rs +++ b/crates/macros/cgp-macro-core/src/types/getter/mod.rs @@ -2,8 +2,10 @@ mod context_arg; mod field_mode; mod get_field_expr; mod get_field_with_mode_expr; +mod method; pub use context_arg::*; pub use field_mode::*; pub use get_field_expr::*; pub use get_field_with_mode_expr::*; +pub use method::*; diff --git a/crates/macros/cgp-macro-lib/src/derive_getter/blanket.rs b/crates/macros/cgp-macro-lib/src/derive_getter/blanket.rs index 78a13699..72c5c987 100644 --- a/crates/macros/cgp-macro-lib/src/derive_getter/blanket.rs +++ b/crates/macros/cgp-macro-lib/src/derive_getter/blanket.rs @@ -1,13 +1,11 @@ use cgp_macro_core::types::cgp_getter::{GetterField, ReceiverMode}; use cgp_macro_core::types::field::{FieldName, HasFieldBound}; -use cgp_macro_core::types::getter::ContextArg; +use cgp_macro_core::types::getter::{ContextArg, derive_getter_method}; use cgp_macro_core::visitors::get_bounds_and_replace_self_assoc_type; use proc_macro2::TokenStream; use quote::{ToTokens, quote}; use syn::{Ident, ItemImpl, ItemTrait, TraitItemType, parse_quote, parse2}; -use crate::derive_getter::derive_getter_method; - pub fn derive_blanket_impl( context_type: &Ident, consumer_trait: &ItemTrait, diff --git a/crates/macros/cgp-macro-lib/src/derive_getter/mod.rs b/crates/macros/cgp-macro-lib/src/derive_getter/mod.rs index 114dc4b7..dc1f35f8 100644 --- a/crates/macros/cgp-macro-lib/src/derive_getter/mod.rs +++ b/crates/macros/cgp-macro-lib/src/derive_getter/mod.rs @@ -1,11 +1,9 @@ mod blanket; -mod method; mod use_field; mod use_fields; mod with_provider; pub use blanket::*; -pub use method::*; pub use use_field::*; pub use use_fields::*; pub use with_provider::*; diff --git a/crates/macros/cgp-macro-lib/src/derive_getter/use_field.rs b/crates/macros/cgp-macro-lib/src/derive_getter/use_field.rs index df89935c..62e2c9b3 100644 --- a/crates/macros/cgp-macro-lib/src/derive_getter/use_field.rs +++ b/crates/macros/cgp-macro-lib/src/derive_getter/use_field.rs @@ -1,7 +1,7 @@ use cgp_macro_core::types::cgp_component::CgpComponentArgs; use cgp_macro_core::types::cgp_getter::{GetterField, ReceiverMode}; use cgp_macro_core::types::field::HasFieldBound; -use cgp_macro_core::types::getter::ContextArg; +use cgp_macro_core::types::getter::{ContextArg, derive_getter_method}; use cgp_macro_core::visitors::get_bounds_and_replace_self_assoc_type; use proc_macro2::TokenStream; use quote::{ToTokens, quote}; @@ -11,8 +11,6 @@ use syn::{ Generics, ItemImpl, ItemTrait, TraitItemType, Type, TypeParamBound, parse_quote, parse2, }; -use crate::derive_getter::derive_getter_method; - pub fn derive_use_field_impl( spec: &CgpComponentArgs, provider_trait: &ItemTrait, diff --git a/crates/macros/cgp-macro-lib/src/derive_getter/use_fields.rs b/crates/macros/cgp-macro-lib/src/derive_getter/use_fields.rs index bb9c5b6f..63409db1 100644 --- a/crates/macros/cgp-macro-lib/src/derive_getter/use_fields.rs +++ b/crates/macros/cgp-macro-lib/src/derive_getter/use_fields.rs @@ -1,14 +1,12 @@ use cgp_macro_core::types::cgp_component::CgpComponentArgs; use cgp_macro_core::types::cgp_getter::{GetterField, ReceiverMode}; use cgp_macro_core::types::field::{HasFieldBound, Symbol}; -use cgp_macro_core::types::getter::ContextArg; +use cgp_macro_core::types::getter::{ContextArg, derive_getter_method}; use cgp_macro_core::visitors::get_bounds_and_replace_self_assoc_type; use proc_macro2::TokenStream; use quote::{ToTokens, quote}; use syn::{ItemImpl, ItemTrait, TraitItemType, Type, parse_quote, parse2}; -use crate::derive_getter::derive_getter_method; - pub fn derive_use_fields_impl( spec: &CgpComponentArgs, provider_trait: &ItemTrait, diff --git a/crates/macros/cgp-macro-lib/src/derive_getter/with_provider.rs b/crates/macros/cgp-macro-lib/src/derive_getter/with_provider.rs index 9137af9b..9bd6219c 100644 --- a/crates/macros/cgp-macro-lib/src/derive_getter/with_provider.rs +++ b/crates/macros/cgp-macro-lib/src/derive_getter/with_provider.rs @@ -1,13 +1,11 @@ use cgp_macro_core::types::cgp_component::CgpComponentArgs; use cgp_macro_core::types::cgp_getter::{GetterField, ReceiverMode}; -use cgp_macro_core::types::getter::{ContextArg, FieldMode}; +use cgp_macro_core::types::getter::{ContextArg, FieldMode, derive_getter_method}; use cgp_macro_core::visitors::get_bounds_and_replace_self_assoc_type; use proc_macro2::{Span, TokenStream}; use quote::{ToTokens, quote}; use syn::{Generics, Ident, ItemImpl, ItemTrait, TraitItemType, parse_quote, parse2}; -use crate::derive_getter::derive_getter_method; - pub fn derive_with_provider_impl( spec: &CgpComponentArgs, provider_trait: &ItemTrait, From 18f2a7c84fddfbcd286b01997237e1bf382d9c01 Mon Sep 17 00:00:00 2001 From: Soares Chen Date: Sun, 14 Jun 2026 21:05:18 +0200 Subject: [PATCH 10/18] Add GetterMethod struct --- .../src/types/cgp_getter/getter_field.rs | 2 + .../src/types/getter/context_arg.rs | 1 + .../cgp-macro-core/src/types/getter/method.rs | 136 +++++++++++------- 3 files changed, 86 insertions(+), 53 deletions(-) diff --git a/crates/macros/cgp-macro-core/src/types/cgp_getter/getter_field.rs b/crates/macros/cgp-macro-core/src/types/cgp_getter/getter_field.rs index 523b8836..7498b9d7 100644 --- a/crates/macros/cgp-macro-core/src/types/cgp_getter/getter_field.rs +++ b/crates/macros/cgp-macro-core/src/types/cgp_getter/getter_field.rs @@ -3,6 +3,7 @@ use syn::{Ident, Type}; use crate::types::getter::FieldMode; +#[derive(Clone)] pub struct GetterField { pub field_name: Ident, pub field_type: Type, @@ -13,6 +14,7 @@ pub struct GetterField { pub receiver_mode: ReceiverMode, } +#[derive(Clone)] pub enum ReceiverMode { SelfReceiver, Type(Box), diff --git a/crates/macros/cgp-macro-core/src/types/getter/context_arg.rs b/crates/macros/cgp-macro-core/src/types/getter/context_arg.rs index 9e14977e..30b86af3 100644 --- a/crates/macros/cgp-macro-core/src/types/getter/context_arg.rs +++ b/crates/macros/cgp-macro-core/src/types/getter/context_arg.rs @@ -1,5 +1,6 @@ use syn::Type; +#[derive(Clone)] pub enum ContextArg { SelfArg, Type(Type), diff --git a/crates/macros/cgp-macro-core/src/types/getter/method.rs b/crates/macros/cgp-macro-core/src/types/getter/method.rs index 62bb307b..6484cccb 100644 --- a/crates/macros/cgp-macro-core/src/types/getter/method.rs +++ b/crates/macros/cgp-macro-core/src/types/getter/method.rs @@ -8,75 +8,105 @@ use crate::types::getter::{ContextArg, FieldMode}; pub fn derive_getter_method( context_arg: &ContextArg, - spec: &GetterField, + getter_field: &GetterField, tag_type: &Type, provider_ident: Option, ) -> syn::Result { - let getter_ident = &spec.field_name; + GetterMethod { + context_arg: context_arg.clone(), + getter_field: getter_field.clone(), + tag_type: tag_type.clone(), + provider_ident, + } + .to_item_fn() +} - let phantom_arg = match &spec.phantom_arg_type { - Some(phantom) => { - quote! { - , _phantom: PhantomData< #phantom > +pub struct GetterMethod { + pub context_arg: ContextArg, + pub getter_field: GetterField, + pub tag_type: Type, + pub provider_ident: Option, +} + +impl GetterMethod { + pub fn to_item_fn(&self) -> syn::Result { + let Self { + context_arg, + getter_field, + tag_type, + provider_ident, + } = self; + + let getter_ident = &getter_field.field_name; + + let phantom_arg = match &getter_field.phantom_arg_type { + Some(phantom) => { + quote! { + , _phantom: PhantomData< #phantom > + } } - } - None => TokenStream::new(), - }; + None => TokenStream::new(), + }; - let context_fn_arg = match &context_arg { - ContextArg::SelfArg => { - if spec.receiver_mut.is_none() { - quote! { &self } - } else { - quote! { &mut self } + let context_fn_arg = match &context_arg { + ContextArg::SelfArg => { + if getter_field.receiver_mut.is_none() { + quote! { &self } + } else { + quote! { &mut self } + } } - } - ContextArg::Type(context_type) => { - if spec.receiver_mut.is_none() { - quote! { __context__: & #context_type} - } else { - quote! { __context__: &mut #context_type } + ContextArg::Type(context_type) => { + if getter_field.receiver_mut.is_none() { + quote! { __context__: & #context_type} + } else { + quote! { __context__: &mut #context_type } + } } - } - }; + }; - let get_field_method = if spec.receiver_mut.is_none() { - quote! { get_field } - } else { - quote! { get_field_mut } - }; + let get_field_method = if getter_field.receiver_mut.is_none() { + quote! { get_field } + } else { + quote! { get_field_mut } + }; - let context_var = match &context_arg { - ContextArg::SelfArg => { - quote! { self } - } - ContextArg::Type(_) => { - quote! { __context__ } - } - }; + let context_var = match &context_arg { + ContextArg::SelfArg => { + quote! { self } + } + ContextArg::Type(_) => { + quote! { __context__ } + } + }; - let call_expr = match provider_ident { - Some(provider_ident) => { - quote! { - #provider_ident :: #get_field_method ( #context_var, ::core::marker::PhantomData::< #tag_type > ) + let call_expr = match provider_ident { + Some(provider_ident) => { + quote! { + #provider_ident :: #get_field_method ( #context_var, ::core::marker::PhantomData::< #tag_type > ) + } } - } - None => { - quote! { - #context_var . #get_field_method ( ::core::marker::PhantomData::< #tag_type > ) + None => { + quote! { + #context_var . #get_field_method ( ::core::marker::PhantomData::< #tag_type > ) + } } - } - }; + }; - let call_expr = extend_call_expr(call_expr, &spec.field_mode, &spec.receiver_mut); + let call_expr = extend_call_expr( + call_expr, + &getter_field.field_mode, + &getter_field.receiver_mut, + ); - let return_type = &spec.return_type; + let return_type = &getter_field.return_type; - parse2(quote! { - fn #getter_ident( #context_fn_arg #phantom_arg ) -> #return_type { - #call_expr - } - }) + parse2(quote! { + fn #getter_ident( #context_fn_arg #phantom_arg ) -> #return_type { + #call_expr + } + }) + } } fn extend_call_expr( From 03956567bbac61b99a9308ae55c835f10229eca7 Mon Sep 17 00:00:00 2001 From: Soares Chen Date: Mon, 15 Jun 2026 21:20:05 +0200 Subject: [PATCH 11/18] Use strong types for getter items --- .../cgp-macro-core/src/types/getter/method.rs | 6 ++-- .../src/derive_getter/blanket.rs | 13 ++++----- .../src/derive_getter/use_fields.rs | 13 ++++----- .../src/derive_getter/with_provider.rs | 29 +++++++++---------- 4 files changed, 29 insertions(+), 32 deletions(-) diff --git a/crates/macros/cgp-macro-core/src/types/getter/method.rs b/crates/macros/cgp-macro-core/src/types/getter/method.rs index 6484cccb..9718061e 100644 --- a/crates/macros/cgp-macro-core/src/types/getter/method.rs +++ b/crates/macros/cgp-macro-core/src/types/getter/method.rs @@ -1,7 +1,7 @@ use proc_macro2::TokenStream; use quote::quote; use syn::token::Mut; -use syn::{Ident, ItemFn, Type, parse2}; +use syn::{Ident, ImplItemFn, Type, parse2}; use crate::types::cgp_getter::GetterField; use crate::types::getter::{ContextArg, FieldMode}; @@ -11,7 +11,7 @@ pub fn derive_getter_method( getter_field: &GetterField, tag_type: &Type, provider_ident: Option, -) -> syn::Result { +) -> syn::Result { GetterMethod { context_arg: context_arg.clone(), getter_field: getter_field.clone(), @@ -29,7 +29,7 @@ pub struct GetterMethod { } impl GetterMethod { - pub fn to_item_fn(&self) -> syn::Result { + pub fn to_item_fn(&self) -> syn::Result { let Self { context_arg, getter_field, diff --git a/crates/macros/cgp-macro-lib/src/derive_getter/blanket.rs b/crates/macros/cgp-macro-lib/src/derive_getter/blanket.rs index 72c5c987..708d878a 100644 --- a/crates/macros/cgp-macro-lib/src/derive_getter/blanket.rs +++ b/crates/macros/cgp-macro-lib/src/derive_getter/blanket.rs @@ -2,9 +2,8 @@ use cgp_macro_core::types::cgp_getter::{GetterField, ReceiverMode}; use cgp_macro_core::types::field::{FieldName, HasFieldBound}; use cgp_macro_core::types::getter::{ContextArg, derive_getter_method}; use cgp_macro_core::visitors::get_bounds_and_replace_self_assoc_type; -use proc_macro2::TokenStream; use quote::{ToTokens, quote}; -use syn::{Ident, ItemImpl, ItemTrait, TraitItemType, parse_quote, parse2}; +use syn::{Ident, ImplItem, ItemImpl, ItemTrait, TraitItemType, parse_quote, parse2}; pub fn derive_blanket_impl( context_type: &Ident, @@ -16,7 +15,7 @@ pub fn derive_blanket_impl( let supertrait_constraints = consumer_trait.supertraits.clone(); - let mut items: TokenStream = TokenStream::new(); + let mut items: Vec = Vec::new(); let mut generics = consumer_trait.generics.clone(); @@ -31,9 +30,9 @@ pub fn derive_blanket_impl( .params .push(parse2(field_assoc_type_ident.to_token_stream())?); - items.extend(quote! { + items.push(parse2(quote! { type #field_assoc_type_ident = #field_assoc_type_ident; - }); + })?); let field_constraints = get_bounds_and_replace_self_assoc_type(field_assoc_type); @@ -61,7 +60,7 @@ pub fn derive_blanket_impl( let method = derive_getter_method(&context_arg, field, &tag_type, None)?; - items.extend(method.to_token_stream()); + items.push(method.into()); let field_type = if let Some(trait_item) = &field_assoc_type { let trait_item_ident = &trait_item.ident; @@ -89,7 +88,7 @@ pub fn derive_blanket_impl( impl #impl_generics #consumer_name #type_generics for #context_type #where_clause { - #items + #( #items )* } })?; diff --git a/crates/macros/cgp-macro-lib/src/derive_getter/use_fields.rs b/crates/macros/cgp-macro-lib/src/derive_getter/use_fields.rs index 63409db1..1cd04fb4 100644 --- a/crates/macros/cgp-macro-lib/src/derive_getter/use_fields.rs +++ b/crates/macros/cgp-macro-lib/src/derive_getter/use_fields.rs @@ -3,9 +3,8 @@ use cgp_macro_core::types::cgp_getter::{GetterField, ReceiverMode}; use cgp_macro_core::types::field::{HasFieldBound, Symbol}; use cgp_macro_core::types::getter::{ContextArg, derive_getter_method}; use cgp_macro_core::visitors::get_bounds_and_replace_self_assoc_type; -use proc_macro2::TokenStream; use quote::{ToTokens, quote}; -use syn::{ItemImpl, ItemTrait, TraitItemType, Type, parse_quote, parse2}; +use syn::{ImplItem, ItemImpl, ItemTrait, TraitItemType, Type, parse_quote, parse2}; pub fn derive_use_fields_impl( spec: &CgpComponentArgs, @@ -17,7 +16,7 @@ pub fn derive_use_fields_impl( let provider_name = &spec.provider_ident; - let mut items: TokenStream = TokenStream::new(); + let mut items: Vec = Vec::new(); let mut provider_generics = provider_trait.generics.clone(); @@ -28,9 +27,9 @@ pub fn derive_use_fields_impl( .params .push(parse2(field_assoc_type_ident.to_token_stream())?); - items.extend(quote! { + items.push(parse2(quote! { type #field_assoc_type_ident = #field_assoc_type_ident; - }); + })?); let field_constraints = get_bounds_and_replace_self_assoc_type(field_assoc_type); @@ -60,7 +59,7 @@ pub fn derive_use_fields_impl( None, )?; - items.extend(method.to_token_stream()); + items.push(method.into()); let field_type = if let Some(trait_item) = &field_assoc_type { let trait_item_ident = &trait_item.ident; @@ -88,7 +87,7 @@ pub fn derive_use_fields_impl( impl #impl_generics #provider_name #type_generics for UseFields #where_clause { - #items + #( #items )* } })?; diff --git a/crates/macros/cgp-macro-lib/src/derive_getter/with_provider.rs b/crates/macros/cgp-macro-lib/src/derive_getter/with_provider.rs index 9bd6219c..68e46205 100644 --- a/crates/macros/cgp-macro-lib/src/derive_getter/with_provider.rs +++ b/crates/macros/cgp-macro-lib/src/derive_getter/with_provider.rs @@ -2,9 +2,9 @@ use cgp_macro_core::types::cgp_component::CgpComponentArgs; use cgp_macro_core::types::cgp_getter::{GetterField, ReceiverMode}; use cgp_macro_core::types::getter::{ContextArg, FieldMode, derive_getter_method}; use cgp_macro_core::visitors::get_bounds_and_replace_self_assoc_type; -use proc_macro2::{Span, TokenStream}; +use proc_macro2::Span; use quote::{ToTokens, quote}; -use syn::{Generics, Ident, ItemImpl, ItemTrait, TraitItemType, parse_quote, parse2}; +use syn::{Generics, Ident, ImplItem, ItemImpl, ItemTrait, TraitItemType, parse_quote, parse2}; pub fn derive_with_provider_impl( spec: &CgpComponentArgs, @@ -32,7 +32,7 @@ pub fn derive_with_provider_impl( let provider_ident = Ident::new("__Provider__", Span::call_site()); - let mut items = TokenStream::new(); + let mut items: Vec = Vec::new(); let mut provider_generics = provider_trait.generics.clone(); @@ -43,9 +43,9 @@ pub fn derive_with_provider_impl( .params .push(parse2(field_assoc_type_ident.to_token_stream())?); - items.extend(quote! { + items.push(parse2(quote! { type #field_assoc_type_ident = #field_assoc_type_ident; - }); + })?); let field_constraints = get_bounds_and_replace_self_assoc_type(field_assoc_type); @@ -73,15 +73,14 @@ pub fn derive_with_provider_impl( } }; - items.extend( - derive_getter_method( - &ContextArg::Type(receiver_type), - field, - &component_name.to_type(), - Some(provider_ident.clone()), - )? - .to_token_stream(), - ); + let method = derive_getter_method( + &ContextArg::Type(receiver_type), + field, + &component_name.to_type(), + Some(provider_ident.clone()), + )?; + + items.push(method.into()); let mut where_clause = provider_generics.make_where_clause().clone(); where_clause @@ -101,7 +100,7 @@ pub fn derive_with_provider_impl( impl #impl_generics #provider_name #type_generics for WithProvider< #provider_ident > #where_clause { - #items + #( #items )* } })?; From 9874dee4fc42596e201f7cc8b78b99e6ce8b8e16 Mon Sep 17 00:00:00 2001 From: Soares Chen Date: Mon, 15 Jun 2026 21:26:09 +0200 Subject: [PATCH 12/18] Migrate UseFields impl --- .../src/types/cgp_getter/mod.rs | 2 +- .../types/cgp_getter/to_use_fields_impl.rs | 41 ++++---- .../cgp-macro-lib/src/derive_getter/mod.rs | 2 - .../src/derive_getter/use_fields.rs | 95 ------------------- .../src/entrypoints/cgp_getter.rs | 16 +--- 5 files changed, 29 insertions(+), 127 deletions(-) delete mode 100644 crates/macros/cgp-macro-lib/src/derive_getter/use_fields.rs diff --git a/crates/macros/cgp-macro-core/src/types/cgp_getter/mod.rs b/crates/macros/cgp-macro-core/src/types/cgp_getter/mod.rs index 50adae36..220216f5 100644 --- a/crates/macros/cgp-macro-core/src/types/cgp_getter/mod.rs +++ b/crates/macros/cgp-macro-core/src/types/cgp_getter/mod.rs @@ -1,6 +1,6 @@ mod getter_field; mod item; -// mod to_use_fields_impl; +mod to_use_fields_impl; pub use getter_field::*; pub use item::*; diff --git a/crates/macros/cgp-macro-core/src/types/cgp_getter/to_use_fields_impl.rs b/crates/macros/cgp-macro-core/src/types/cgp_getter/to_use_fields_impl.rs index b3941a11..7721d652 100644 --- a/crates/macros/cgp-macro-core/src/types/cgp_getter/to_use_fields_impl.rs +++ b/crates/macros/cgp-macro-core/src/types/cgp_getter/to_use_fields_impl.rs @@ -1,13 +1,12 @@ -use proc_macro2::TokenStream; use quote::{ToTokens, quote}; -use syn::{Type, parse_quote, parse2}; +use syn::{ImplItem, ItemImpl, Type, parse_quote, parse2}; use crate::types::cgp_getter::{ItemCgpGetter, ReceiverMode}; -use crate::types::field::Symbol; +use crate::types::field::{HasFieldBound, Symbol}; +use crate::types::getter::{ContextArg, derive_getter_method}; use crate::types::provider_impl::ItemProviderImpl; use crate::visitors::get_bounds_and_replace_self_assoc_type; - impl ItemCgpGetter { pub fn to_use_fields_impl(&self) -> syn::Result { let provider_trait = &self.item_component.provider_trait; @@ -16,20 +15,24 @@ impl ItemCgpGetter { let provider_name = &self.item_component.args.provider_ident; - let mut items: TokenStream = TokenStream::new(); + let component_name = &self.item_component.args.component_name; + + let field_assoc_type = &self.field_assoc_type; + + let mut items: Vec = Vec::new(); let mut provider_generics = provider_trait.generics.clone(); - if let Some(field_assoc_type) = &self.field_assoc_type { + if let Some(field_assoc_type) = &field_assoc_type { let field_assoc_type_ident = &field_assoc_type.ident; provider_generics .params .push(parse2(field_assoc_type_ident.to_token_stream())?); - items.extend(quote! { + items.push(parse2(quote! { type #field_assoc_type_ident = #field_assoc_type_ident; - }); + })?); let field_constraints = get_bounds_and_replace_self_assoc_type(field_assoc_type); @@ -45,21 +48,21 @@ impl ItemCgpGetter { for field in &self.fields { let receiver_type = match &field.receiver_mode { - ReceiverMode::SelfReceiver => context_type.to_token_stream(), - ReceiverMode::Type(ty) => ty.to_token_stream(), + ReceiverMode::SelfReceiver => parse_quote!(#context_type), + ReceiverMode::Type(ty) => ty.as_ref().clone(), }; let field_name = Symbol::new(field.field_name.clone()); let tag_type: Type = parse_quote!(#field_name); let method = derive_getter_method( - &ContextArg::Ident(receiver_type.clone()), + &ContextArg::Type(receiver_type.clone()), field, - Some(quote! { ::< #field_name > }), + &tag_type, None, - ); + )?; - items.extend(method); + items.push(method.into()); let field_type = if let Some(trait_item) = &field_assoc_type { let trait_item_ident = &trait_item.ident; @@ -83,13 +86,17 @@ impl ItemCgpGetter { let (_, type_generics, _) = provider_trait.generics.split_for_impl(); let (impl_generics, _, where_clause) = provider_generics.split_for_impl(); - let out = parse2(quote! { + let item_impl: ItemImpl = parse2(quote! { impl #impl_generics #provider_name #type_generics for UseFields #where_clause { - #items + #( #items )* } })?; - todo!() + + Ok(ItemProviderImpl { + component_type: component_name.to_type(), + item_impl, + }) } } diff --git a/crates/macros/cgp-macro-lib/src/derive_getter/mod.rs b/crates/macros/cgp-macro-lib/src/derive_getter/mod.rs index dc1f35f8..aef90b42 100644 --- a/crates/macros/cgp-macro-lib/src/derive_getter/mod.rs +++ b/crates/macros/cgp-macro-lib/src/derive_getter/mod.rs @@ -1,9 +1,7 @@ mod blanket; mod use_field; -mod use_fields; mod with_provider; pub use blanket::*; pub use use_field::*; -pub use use_fields::*; pub use with_provider::*; diff --git a/crates/macros/cgp-macro-lib/src/derive_getter/use_fields.rs b/crates/macros/cgp-macro-lib/src/derive_getter/use_fields.rs deleted file mode 100644 index 1cd04fb4..00000000 --- a/crates/macros/cgp-macro-lib/src/derive_getter/use_fields.rs +++ /dev/null @@ -1,95 +0,0 @@ -use cgp_macro_core::types::cgp_component::CgpComponentArgs; -use cgp_macro_core::types::cgp_getter::{GetterField, ReceiverMode}; -use cgp_macro_core::types::field::{HasFieldBound, Symbol}; -use cgp_macro_core::types::getter::{ContextArg, derive_getter_method}; -use cgp_macro_core::visitors::get_bounds_and_replace_self_assoc_type; -use quote::{ToTokens, quote}; -use syn::{ImplItem, ItemImpl, ItemTrait, TraitItemType, Type, parse_quote, parse2}; - -pub fn derive_use_fields_impl( - spec: &CgpComponentArgs, - provider_trait: &ItemTrait, - fields: &[GetterField], - field_assoc_type: &Option, -) -> syn::Result { - let context_type = &spec.context_ident; - - let provider_name = &spec.provider_ident; - - let mut items: Vec = Vec::new(); - - let mut provider_generics = provider_trait.generics.clone(); - - if let Some(field_assoc_type) = field_assoc_type { - let field_assoc_type_ident = &field_assoc_type.ident; - - provider_generics - .params - .push(parse2(field_assoc_type_ident.to_token_stream())?); - - items.push(parse2(quote! { - type #field_assoc_type_ident = #field_assoc_type_ident; - })?); - - let field_constraints = get_bounds_and_replace_self_assoc_type(field_assoc_type); - - provider_generics - .make_where_clause() - .predicates - .push(parse2(quote! { - #field_assoc_type_ident: #field_constraints - })?); - } - - let where_clause = provider_generics.make_where_clause(); - - for field in fields { - let receiver_type = match &field.receiver_mode { - ReceiverMode::SelfReceiver => parse_quote!(#context_type), - ReceiverMode::Type(ty) => ty.as_ref().clone(), - }; - - let field_name = Symbol::new(field.field_name.clone()); - let tag_type: Type = parse_quote!(#field_name); - - let method = derive_getter_method( - &ContextArg::Type(receiver_type.clone()), - field, - &tag_type, - None, - )?; - - items.push(method.into()); - - let field_type = if let Some(trait_item) = &field_assoc_type { - let trait_item_ident = &trait_item.ident; - parse_quote!(#trait_item_ident) - } else { - field.field_type.clone() - }; - - let constraint = HasFieldBound { - field_type, - field_mut: field.receiver_mut, - field_mode: field.field_mode.clone(), - tag_type: tag_type.clone(), - }; - - where_clause - .predicates - .push(parse2(quote! { #receiver_type: #constraint })?); - } - - let (_, type_generics, _) = provider_trait.generics.split_for_impl(); - let (impl_generics, _, where_clause) = provider_generics.split_for_impl(); - - let out = parse2(quote! { - impl #impl_generics #provider_name #type_generics for UseFields - #where_clause - { - #( #items )* - } - })?; - - Ok(out) -} diff --git a/crates/macros/cgp-macro-lib/src/entrypoints/cgp_getter.rs b/crates/macros/cgp-macro-lib/src/entrypoints/cgp_getter.rs index 11beba09..125902c9 100644 --- a/crates/macros/cgp-macro-lib/src/entrypoints/cgp_getter.rs +++ b/crates/macros/cgp-macro-lib/src/entrypoints/cgp_getter.rs @@ -7,9 +7,7 @@ use proc_macro2::TokenStream; use quote::quote; use syn::{Ident, ItemTrait, Type, parse_quote, parse2}; -use crate::derive_getter::{ - derive_use_field_impl, derive_use_fields_impl, derive_with_provider_impl, -}; +use crate::derive_getter::{derive_use_field_impl, derive_with_provider_impl}; pub fn cgp_getter(attr: TokenStream, body: TokenStream) -> syn::Result { let mut raw_args: CgpComponentRawArgs = parse2(attr.clone())?; @@ -37,6 +35,8 @@ pub fn cgp_getter(attr: TokenStream, body: TokenStream) -> syn::Result syn::Result = fields.try_into().ok(); let mut derived = quote! { #( #items )* - #use_fields_impl - - #is_provider_use_fields_impl + #( #use_fields_impl )* }; if let Some([field]) = m_field { From 29ad6ba84b42a34bf4d76cc3624264a80468c58e Mon Sep 17 00:00:00 2001 From: Soares Chen Date: Mon, 15 Jun 2026 21:45:20 +0200 Subject: [PATCH 13/18] Migrate UseField impl --- .../src/types/cgp_getter/mod.rs | 1 + .../src/types/cgp_getter/use_field.rs | 123 ++++++++++++++++++ .../cgp-macro-lib/src/derive_getter/mod.rs | 2 - .../src/derive_getter/use_field.rs | 106 --------------- .../src/entrypoints/cgp_getter.rs | 25 ++-- 5 files changed, 132 insertions(+), 125 deletions(-) create mode 100644 crates/macros/cgp-macro-core/src/types/cgp_getter/use_field.rs delete mode 100644 crates/macros/cgp-macro-lib/src/derive_getter/use_field.rs diff --git a/crates/macros/cgp-macro-core/src/types/cgp_getter/mod.rs b/crates/macros/cgp-macro-core/src/types/cgp_getter/mod.rs index 220216f5..c5708cb1 100644 --- a/crates/macros/cgp-macro-core/src/types/cgp_getter/mod.rs +++ b/crates/macros/cgp-macro-core/src/types/cgp_getter/mod.rs @@ -1,6 +1,7 @@ mod getter_field; mod item; mod to_use_fields_impl; +mod use_field; pub use getter_field::*; pub use item::*; diff --git a/crates/macros/cgp-macro-core/src/types/cgp_getter/use_field.rs b/crates/macros/cgp-macro-core/src/types/cgp_getter/use_field.rs new file mode 100644 index 00000000..89b91549 --- /dev/null +++ b/crates/macros/cgp-macro-core/src/types/cgp_getter/use_field.rs @@ -0,0 +1,123 @@ +use proc_macro2::TokenStream; +use quote::{ToTokens, quote}; +use syn::punctuated::Punctuated; +use syn::token::Plus; +use syn::{Generics, ItemImpl, Type, TypeParamBound, parse_quote, parse2}; + +use crate::types::cgp_getter::{GetterField, ItemCgpGetter, ReceiverMode}; +use crate::types::field::HasFieldBound; +use crate::types::getter::{ContextArg, derive_getter_method}; +use crate::types::provider_impl::{ItemProviderImpl, ItemProviderImpls}; +use crate::visitors::get_bounds_and_replace_self_assoc_type; + +impl ItemCgpGetter { + pub fn to_use_field_impl(&self) -> syn::Result { + if self.fields.len() == 1 { + let field = &self.fields[0]; + + let item_impl = self.derive_use_field_impl(&field)?; + + let component_type = self.item_component.args.component_name.to_type(); + + let item = ItemProviderImpl { + component_type, + item_impl, + }; + + Ok(ItemProviderImpls { items: vec![item] }) + } else { + Ok(ItemProviderImpls::default()) + } + } + + pub fn derive_use_field_impl(&self, field: &GetterField) -> syn::Result { + let context_type = &self.item_component.args.context_ident; + let provider_trait = &self.item_component.provider_trait; + let field_assoc_type = &self.field_assoc_type; + let provider_name = &provider_trait.ident; + + let receiver_type = match &field.receiver_mode { + ReceiverMode::SelfReceiver => parse_quote!(#context_type), + ReceiverMode::Type(ty) => ty.as_ref().clone(), + }; + + let mut field_constraints: Punctuated = Punctuated::default(); + + let tag_type: Type = parse_quote! { __Tag__ }; + + let mut items = TokenStream::new(); + + let mut provider_generics = provider_trait.generics.clone(); + + if let Some(field_assoc_type) = field_assoc_type { + let field_assoc_type_ident = &field_assoc_type.ident; + + provider_generics + .params + .push(parse2(field_assoc_type_ident.to_token_stream())?); + + items.extend(quote! { + type #field_assoc_type_ident = #field_assoc_type_ident; + }); + + let field_constraints = get_bounds_and_replace_self_assoc_type(field_assoc_type); + + provider_generics + .make_where_clause() + .predicates + .push(parse2(quote! { + #field_assoc_type_ident: #field_constraints + })?); + } + + items.extend( + derive_getter_method( + &ContextArg::Type(receiver_type.clone()), + field, + &tag_type, + None, + )? + .to_token_stream(), + ); + + let field_type = if let Some(trait_item) = &field_assoc_type { + let trait_item_ident = &trait_item.ident; + parse_quote!(#trait_item_ident) + } else { + field.field_type.clone() + }; + + let constraint = HasFieldBound { + field_type, + field_mut: field.receiver_mut, + field_mode: field.field_mode.clone(), + tag_type: tag_type.clone(), + }; + + field_constraints.push(parse_quote!(#constraint)); + + let mut where_clause = provider_generics.make_where_clause().clone(); + where_clause + .predicates + .push(parse2(quote! { #receiver_type: #field_constraints })?); + + let (_, type_generics, _) = provider_trait.generics.split_for_impl(); + let (impl_generics, _, _) = provider_generics.split_for_impl(); + + let impl_generics = { + let mut generics: Generics = parse2(impl_generics.to_token_stream())?; + generics.params.push(parse_quote!(#tag_type)); + generics + }; + + let use_field_impl: ItemImpl = parse2(quote! { + impl #impl_generics #provider_name #type_generics for UseField< #tag_type > + #where_clause + { + #items + } + })?; + + Ok(use_field_impl) + } +} diff --git a/crates/macros/cgp-macro-lib/src/derive_getter/mod.rs b/crates/macros/cgp-macro-lib/src/derive_getter/mod.rs index aef90b42..fd67d5b9 100644 --- a/crates/macros/cgp-macro-lib/src/derive_getter/mod.rs +++ b/crates/macros/cgp-macro-lib/src/derive_getter/mod.rs @@ -1,7 +1,5 @@ mod blanket; -mod use_field; mod with_provider; pub use blanket::*; -pub use use_field::*; pub use with_provider::*; diff --git a/crates/macros/cgp-macro-lib/src/derive_getter/use_field.rs b/crates/macros/cgp-macro-lib/src/derive_getter/use_field.rs deleted file mode 100644 index 62e2c9b3..00000000 --- a/crates/macros/cgp-macro-lib/src/derive_getter/use_field.rs +++ /dev/null @@ -1,106 +0,0 @@ -use cgp_macro_core::types::cgp_component::CgpComponentArgs; -use cgp_macro_core::types::cgp_getter::{GetterField, ReceiverMode}; -use cgp_macro_core::types::field::HasFieldBound; -use cgp_macro_core::types::getter::{ContextArg, derive_getter_method}; -use cgp_macro_core::visitors::get_bounds_and_replace_self_assoc_type; -use proc_macro2::TokenStream; -use quote::{ToTokens, quote}; -use syn::punctuated::Punctuated; -use syn::token::Plus; -use syn::{ - Generics, ItemImpl, ItemTrait, TraitItemType, Type, TypeParamBound, parse_quote, parse2, -}; - -pub fn derive_use_field_impl( - spec: &CgpComponentArgs, - provider_trait: &ItemTrait, - field: &GetterField, - field_assoc_type: &Option, -) -> syn::Result { - let context_type = &spec.context_ident; - let provider_name = &provider_trait.ident; - - let receiver_type = match &field.receiver_mode { - ReceiverMode::SelfReceiver => parse_quote!(#context_type), - ReceiverMode::Type(ty) => ty.as_ref().clone(), - }; - - let mut field_constraints: Punctuated = Punctuated::default(); - - let tag_type: Type = parse_quote! { __Tag__ }; - - let mut items = TokenStream::new(); - - let mut provider_generics = provider_trait.generics.clone(); - - if let Some(field_assoc_type) = field_assoc_type { - let field_assoc_type_ident = &field_assoc_type.ident; - - provider_generics - .params - .push(parse2(field_assoc_type_ident.to_token_stream())?); - - items.extend(quote! { - type #field_assoc_type_ident = #field_assoc_type_ident; - }); - - let field_constraints = get_bounds_and_replace_self_assoc_type(field_assoc_type); - - provider_generics - .make_where_clause() - .predicates - .push(parse2(quote! { - #field_assoc_type_ident: #field_constraints - })?); - } - - items.extend( - derive_getter_method( - &ContextArg::Type(receiver_type.clone()), - field, - &tag_type, - None, - )? - .to_token_stream(), - ); - - let field_type = if let Some(trait_item) = &field_assoc_type { - let trait_item_ident = &trait_item.ident; - parse_quote!(#trait_item_ident) - } else { - field.field_type.clone() - }; - - let constraint = HasFieldBound { - field_type, - field_mut: field.receiver_mut, - field_mode: field.field_mode.clone(), - tag_type: tag_type.clone(), - }; - - field_constraints.push(parse_quote!(#constraint)); - - let mut where_clause = provider_generics.make_where_clause().clone(); - where_clause - .predicates - .push(parse2(quote! { #receiver_type: #field_constraints })?); - - let (_, type_generics, _) = provider_trait.generics.split_for_impl(); - let (impl_generics, _, _) = provider_generics.split_for_impl(); - - let impl_generics = { - let mut generics: Generics = parse2(impl_generics.to_token_stream())?; - generics.params.push(parse_quote!(#tag_type)); - generics - }; - - let use_field_impl: ItemImpl = parse2(quote! { - impl #impl_generics #provider_name #type_generics for UseField< #tag_type > - #where_clause - { - #items - } - })?; - - Ok(use_field_impl) -} diff --git a/crates/macros/cgp-macro-lib/src/entrypoints/cgp_getter.rs b/crates/macros/cgp-macro-lib/src/entrypoints/cgp_getter.rs index 125902c9..e9e25205 100644 --- a/crates/macros/cgp-macro-lib/src/entrypoints/cgp_getter.rs +++ b/crates/macros/cgp-macro-lib/src/entrypoints/cgp_getter.rs @@ -5,9 +5,9 @@ use cgp_macro_core::types::cgp_getter::{GetterField, ItemCgpGetter}; use cgp_macro_core::types::provider_impl::derive_is_provider_for; use proc_macro2::TokenStream; use quote::quote; -use syn::{Ident, ItemTrait, Type, parse_quote, parse2}; +use syn::{Ident, ItemTrait, Type, parse2}; -use crate::derive_getter::{derive_use_field_impl, derive_with_provider_impl}; +use crate::derive_getter::derive_with_provider_impl; pub fn cgp_getter(attr: TokenStream, body: TokenStream) -> syn::Result { let mut raw_args: CgpComponentRawArgs = parse2(attr.clone())?; @@ -37,6 +37,8 @@ pub fn cgp_getter(attr: TokenStream, body: TokenStream) -> syn::Result syn::Result = fields.try_into().ok(); + let component_name_type: Type = args.component_name.to_type(); let mut derived = quote! { #( #items )* #( #use_fields_impl )* + #( #use_field_impl )* }; - if let Some([field]) = m_field { - let use_field_impl = - derive_use_field_impl(&args, &provider_trait, &field, &field_assoc_type)?; - - let is_provider_use_field_impl = - derive_is_provider_for(&component_name_type, &use_field_impl)?; + let m_field: Option<[GetterField; 1]> = fields.try_into().ok(); + if let Some([field]) = m_field { let use_provider_impl = derive_with_provider_impl(&args, &provider_trait, &field, &field_assoc_type)?; @@ -75,9 +69,6 @@ pub fn cgp_getter(attr: TokenStream, body: TokenStream) -> syn::Result Date: Mon, 15 Jun 2026 21:50:46 +0200 Subject: [PATCH 14/18] Migrate WithProvider impl --- .../src/types/cgp_getter/mod.rs | 1 + .../src/types/cgp_getter/use_field.rs | 2 +- .../src/types/cgp_getter/with_provider.rs | 133 ++++++++++++++++++ .../cgp-macro-lib/src/derive_getter/mod.rs | 2 - .../src/derive_getter/with_provider.rs | 108 -------------- .../src/entrypoints/cgp_getter.rs | 41 +----- 6 files changed, 141 insertions(+), 146 deletions(-) create mode 100644 crates/macros/cgp-macro-core/src/types/cgp_getter/with_provider.rs delete mode 100644 crates/macros/cgp-macro-lib/src/derive_getter/with_provider.rs diff --git a/crates/macros/cgp-macro-core/src/types/cgp_getter/mod.rs b/crates/macros/cgp-macro-core/src/types/cgp_getter/mod.rs index c5708cb1..ffe89aea 100644 --- a/crates/macros/cgp-macro-core/src/types/cgp_getter/mod.rs +++ b/crates/macros/cgp-macro-core/src/types/cgp_getter/mod.rs @@ -2,6 +2,7 @@ mod getter_field; mod item; mod to_use_fields_impl; mod use_field; +mod with_provider; pub use getter_field::*; pub use item::*; diff --git a/crates/macros/cgp-macro-core/src/types/cgp_getter/use_field.rs b/crates/macros/cgp-macro-core/src/types/cgp_getter/use_field.rs index 89b91549..28f782eb 100644 --- a/crates/macros/cgp-macro-core/src/types/cgp_getter/use_field.rs +++ b/crates/macros/cgp-macro-core/src/types/cgp_getter/use_field.rs @@ -30,7 +30,7 @@ impl ItemCgpGetter { } } - pub fn derive_use_field_impl(&self, field: &GetterField) -> syn::Result { + fn derive_use_field_impl(&self, field: &GetterField) -> syn::Result { let context_type = &self.item_component.args.context_ident; let provider_trait = &self.item_component.provider_trait; let field_assoc_type = &self.field_assoc_type; diff --git a/crates/macros/cgp-macro-core/src/types/cgp_getter/with_provider.rs b/crates/macros/cgp-macro-core/src/types/cgp_getter/with_provider.rs new file mode 100644 index 00000000..6e6fbf77 --- /dev/null +++ b/crates/macros/cgp-macro-core/src/types/cgp_getter/with_provider.rs @@ -0,0 +1,133 @@ + +use proc_macro2::Span; +use quote::{ToTokens, quote}; +use syn::{Generics, Ident, ImplItem, ItemImpl, parse_quote, parse2}; + +use crate::types::cgp_getter::{GetterField, ItemCgpGetter, ReceiverMode}; +use crate::types::getter::{ContextArg, FieldMode, derive_getter_method}; +use crate::types::provider_impl::{ItemProviderImpl, ItemProviderImpls}; +use crate::visitors::get_bounds_and_replace_self_assoc_type; + +impl ItemCgpGetter { + pub fn to_with_provider_impl(&self) -> syn::Result { + if self.fields.len() == 1 { + let field = &self.fields[0]; + + let item_impl = self.derive_with_provider_impl(&field)?; + + let component_type = self.item_component.args.component_name.to_type(); + + let item = ItemProviderImpl { + component_type, + item_impl, + }; + + Ok(ItemProviderImpls { items: vec![item] }) + } else { + Ok(ItemProviderImpls::default()) + } + } + + pub fn derive_with_provider_impl( + &self, + field: &GetterField, + ) -> syn::Result { + let args = &self.item_component.args; + let provider_trait = &self.item_component.provider_trait; + + let field_assoc_type = &self.field_assoc_type; + + let component_name = &args.component_name; + let context_type = &args.context_ident; + let provider_name = &args.provider_ident; + + let receiver_type = match &field.receiver_mode { + ReceiverMode::SelfReceiver => parse_quote!(#context_type), + ReceiverMode::Type(ty) => ty.as_ref().clone(), + }; + + let field_type = match field_assoc_type { + Some(field_assoc_type) => { + let field_assoc_type_ident = &field_assoc_type.ident; + parse_quote! { #field_assoc_type_ident } + } + None => field.field_type.clone(), + }; + + let provider_ident = Ident::new("__Provider__", Span::call_site()); + + let mut items: Vec = Vec::new(); + + let mut provider_generics = provider_trait.generics.clone(); + + if let Some(field_assoc_type) = field_assoc_type { + let field_assoc_type_ident = &field_assoc_type.ident; + + provider_generics + .params + .push(parse2(field_assoc_type_ident.to_token_stream())?); + + items.push(parse2(quote! { + type #field_assoc_type_ident = #field_assoc_type_ident; + })?); + + let field_constraints = get_bounds_and_replace_self_assoc_type(field_assoc_type); + + provider_generics + .make_where_clause() + .predicates + .push(parse2(quote! { + #field_assoc_type_ident: #field_constraints + })?); + } + + let provider_constraint = if field.receiver_mut.is_none() { + if let FieldMode::Slice = field.field_mode { + quote! { + FieldGetter< #receiver_type, #component_name, Value: AsRef< [ #field_type ] > + 'static > + } + } else { + quote! { + FieldGetter< #receiver_type, #component_name , Value = #field_type > + } + } + } else { + quote! { + MutFieldGetter< #receiver_type, #component_name, Value = #field_type > + } + }; + + let method = derive_getter_method( + &ContextArg::Type(receiver_type), + field, + &component_name.to_type(), + Some(provider_ident.clone()), + )?; + + items.push(method.into()); + + let mut where_clause = provider_generics.make_where_clause().clone(); + where_clause + .predicates + .push(parse2(quote! { #provider_ident : #provider_constraint })?); + + let (_, type_generics, _) = provider_trait.generics.split_for_impl(); + let (impl_generics, _, _) = provider_generics.split_for_impl(); + + let impl_generics = { + let mut generics: Generics = parse2(impl_generics.to_token_stream())?; + generics.params.push(parse2(quote! { #provider_ident })?); + generics + }; + + let out = parse2(quote! { + impl #impl_generics #provider_name #type_generics for WithProvider< #provider_ident > + #where_clause + { + #( #items )* + } + })?; + + Ok(out) + } +} diff --git a/crates/macros/cgp-macro-lib/src/derive_getter/mod.rs b/crates/macros/cgp-macro-lib/src/derive_getter/mod.rs index fd67d5b9..d2d72d89 100644 --- a/crates/macros/cgp-macro-lib/src/derive_getter/mod.rs +++ b/crates/macros/cgp-macro-lib/src/derive_getter/mod.rs @@ -1,5 +1,3 @@ mod blanket; -mod with_provider; pub use blanket::*; -pub use with_provider::*; diff --git a/crates/macros/cgp-macro-lib/src/derive_getter/with_provider.rs b/crates/macros/cgp-macro-lib/src/derive_getter/with_provider.rs deleted file mode 100644 index 68e46205..00000000 --- a/crates/macros/cgp-macro-lib/src/derive_getter/with_provider.rs +++ /dev/null @@ -1,108 +0,0 @@ -use cgp_macro_core::types::cgp_component::CgpComponentArgs; -use cgp_macro_core::types::cgp_getter::{GetterField, ReceiverMode}; -use cgp_macro_core::types::getter::{ContextArg, FieldMode, derive_getter_method}; -use cgp_macro_core::visitors::get_bounds_and_replace_self_assoc_type; -use proc_macro2::Span; -use quote::{ToTokens, quote}; -use syn::{Generics, Ident, ImplItem, ItemImpl, ItemTrait, TraitItemType, parse_quote, parse2}; - -pub fn derive_with_provider_impl( - spec: &CgpComponentArgs, - provider_trait: &ItemTrait, - field: &GetterField, - field_assoc_type: &Option, -) -> syn::Result { - let component_name = &spec.component_name; - - let context_type = &spec.context_ident; - let provider_name = &spec.provider_ident; - - let receiver_type = match &field.receiver_mode { - ReceiverMode::SelfReceiver => parse_quote!(#context_type), - ReceiverMode::Type(ty) => ty.as_ref().clone(), - }; - - let field_type = match field_assoc_type { - Some(field_assoc_type) => { - let field_assoc_type_ident = &field_assoc_type.ident; - parse_quote! { #field_assoc_type_ident } - } - None => field.field_type.clone(), - }; - - let provider_ident = Ident::new("__Provider__", Span::call_site()); - - let mut items: Vec = Vec::new(); - - let mut provider_generics = provider_trait.generics.clone(); - - if let Some(field_assoc_type) = field_assoc_type { - let field_assoc_type_ident = &field_assoc_type.ident; - - provider_generics - .params - .push(parse2(field_assoc_type_ident.to_token_stream())?); - - items.push(parse2(quote! { - type #field_assoc_type_ident = #field_assoc_type_ident; - })?); - - let field_constraints = get_bounds_and_replace_self_assoc_type(field_assoc_type); - - provider_generics - .make_where_clause() - .predicates - .push(parse2(quote! { - #field_assoc_type_ident: #field_constraints - })?); - } - - let provider_constraint = if field.receiver_mut.is_none() { - if let FieldMode::Slice = field.field_mode { - quote! { - FieldGetter< #receiver_type, #component_name, Value: AsRef< [ #field_type ] > + 'static > - } - } else { - quote! { - FieldGetter< #receiver_type, #component_name , Value = #field_type > - } - } - } else { - quote! { - MutFieldGetter< #receiver_type, #component_name, Value = #field_type > - } - }; - - let method = derive_getter_method( - &ContextArg::Type(receiver_type), - field, - &component_name.to_type(), - Some(provider_ident.clone()), - )?; - - items.push(method.into()); - - let mut where_clause = provider_generics.make_where_clause().clone(); - where_clause - .predicates - .push(parse2(quote! { #provider_ident : #provider_constraint })?); - - let (_, type_generics, _) = provider_trait.generics.split_for_impl(); - let (impl_generics, _, _) = provider_generics.split_for_impl(); - - let impl_generics = { - let mut generics: Generics = parse2(impl_generics.to_token_stream())?; - generics.params.push(parse2(quote! { #provider_ident })?); - generics - }; - - let out = parse2(quote! { - impl #impl_generics #provider_name #type_generics for WithProvider< #provider_ident > - #where_clause - { - #( #items )* - } - })?; - - Ok(out) -} diff --git a/crates/macros/cgp-macro-lib/src/entrypoints/cgp_getter.rs b/crates/macros/cgp-macro-lib/src/entrypoints/cgp_getter.rs index e9e25205..08f67549 100644 --- a/crates/macros/cgp-macro-lib/src/entrypoints/cgp_getter.rs +++ b/crates/macros/cgp-macro-lib/src/entrypoints/cgp_getter.rs @@ -1,13 +1,10 @@ use cgp_macro_core::types::cgp_component::{ - CgpComponentRawArgs, EvaluatedCgpComponent, ItemCgpComponent, + CgpComponentRawArgs, ItemCgpComponent, }; -use cgp_macro_core::types::cgp_getter::{GetterField, ItemCgpGetter}; -use cgp_macro_core::types::provider_impl::derive_is_provider_for; +use cgp_macro_core::types::cgp_getter::ItemCgpGetter; use proc_macro2::TokenStream; use quote::quote; -use syn::{Ident, ItemTrait, Type, parse2}; - -use crate::derive_getter::derive_with_provider_impl; +use syn::{Ident, ItemTrait, parse2}; pub fn cgp_getter(attr: TokenStream, body: TokenStream) -> syn::Result { let mut raw_args: CgpComponentRawArgs = parse2(attr.clone())?; @@ -38,41 +35,15 @@ pub fn cgp_getter(attr: TokenStream, body: TokenStream) -> syn::Result = fields.try_into().ok(); - - if let Some([field]) = m_field { - let use_provider_impl = - derive_with_provider_impl(&args, &provider_trait, &field, &field_assoc_type)?; - - let is_provider_use_provider_impl = - derive_is_provider_for(&component_name_type, &use_provider_impl)?; - - derived.extend(quote! { - #use_provider_impl - #is_provider_use_provider_impl - }); - } - Ok(derived) } From b46a3090fc83eaaf56cb2d8dae60dd4b75a59e57 Mon Sep 17 00:00:00 2001 From: Soares Chen Date: Mon, 15 Jun 2026 21:55:27 +0200 Subject: [PATCH 15/18] Implement ItemCgpGetter::to_item_provider_impls --- .../cgp-macro-core/src/types/cgp_getter/item.rs | 13 +++++++++++++ .../src/types/cgp_getter/use_field.rs | 8 ++++---- .../src/types/cgp_getter/with_provider.rs | 14 +++++--------- .../cgp-macro-lib/src/entrypoints/cgp_getter.rs | 13 +++---------- 4 files changed, 25 insertions(+), 23 deletions(-) diff --git a/crates/macros/cgp-macro-core/src/types/cgp_getter/item.rs b/crates/macros/cgp-macro-core/src/types/cgp_getter/item.rs index be750f71..5734c575 100644 --- a/crates/macros/cgp-macro-core/src/types/cgp_getter/item.rs +++ b/crates/macros/cgp-macro-core/src/types/cgp_getter/item.rs @@ -3,6 +3,7 @@ use syn::{Error, TraitItemType}; use crate::functions::parse_getter_fields; use crate::types::cgp_component::EvaluatedCgpComponent; use crate::types::cgp_getter::GetterField; +use crate::types::provider_impl::ItemProviderImpls; pub struct ItemCgpGetter { pub item_component: EvaluatedCgpComponent, @@ -10,6 +11,18 @@ pub struct ItemCgpGetter { pub field_assoc_type: Option, } +impl ItemCgpGetter { + pub fn to_item_provider_impls(&self) -> syn::Result { + let mut items = ItemProviderImpls::default(); + + items.items.push(self.to_use_fields_impl()?); + items.items.extend(self.to_use_field_impl()?); + items.items.extend(self.to_with_provider_impl()?); + + Ok(items) + } +} + impl TryFrom for ItemCgpGetter { type Error = Error; diff --git a/crates/macros/cgp-macro-core/src/types/cgp_getter/use_field.rs b/crates/macros/cgp-macro-core/src/types/cgp_getter/use_field.rs index 28f782eb..f78b7ac6 100644 --- a/crates/macros/cgp-macro-core/src/types/cgp_getter/use_field.rs +++ b/crates/macros/cgp-macro-core/src/types/cgp_getter/use_field.rs @@ -7,11 +7,11 @@ use syn::{Generics, ItemImpl, Type, TypeParamBound, parse_quote, parse2}; use crate::types::cgp_getter::{GetterField, ItemCgpGetter, ReceiverMode}; use crate::types::field::HasFieldBound; use crate::types::getter::{ContextArg, derive_getter_method}; -use crate::types::provider_impl::{ItemProviderImpl, ItemProviderImpls}; +use crate::types::provider_impl::ItemProviderImpl; use crate::visitors::get_bounds_and_replace_self_assoc_type; impl ItemCgpGetter { - pub fn to_use_field_impl(&self) -> syn::Result { + pub fn to_use_field_impl(&self) -> syn::Result> { if self.fields.len() == 1 { let field = &self.fields[0]; @@ -24,9 +24,9 @@ impl ItemCgpGetter { item_impl, }; - Ok(ItemProviderImpls { items: vec![item] }) + Ok(Some(item)) } else { - Ok(ItemProviderImpls::default()) + Ok(None) } } diff --git a/crates/macros/cgp-macro-core/src/types/cgp_getter/with_provider.rs b/crates/macros/cgp-macro-core/src/types/cgp_getter/with_provider.rs index 6e6fbf77..e8bd291e 100644 --- a/crates/macros/cgp-macro-core/src/types/cgp_getter/with_provider.rs +++ b/crates/macros/cgp-macro-core/src/types/cgp_getter/with_provider.rs @@ -1,15 +1,14 @@ - use proc_macro2::Span; use quote::{ToTokens, quote}; use syn::{Generics, Ident, ImplItem, ItemImpl, parse_quote, parse2}; use crate::types::cgp_getter::{GetterField, ItemCgpGetter, ReceiverMode}; use crate::types::getter::{ContextArg, FieldMode, derive_getter_method}; -use crate::types::provider_impl::{ItemProviderImpl, ItemProviderImpls}; +use crate::types::provider_impl::ItemProviderImpl; use crate::visitors::get_bounds_and_replace_self_assoc_type; impl ItemCgpGetter { - pub fn to_with_provider_impl(&self) -> syn::Result { + pub fn to_with_provider_impl(&self) -> syn::Result> { if self.fields.len() == 1 { let field = &self.fields[0]; @@ -22,16 +21,13 @@ impl ItemCgpGetter { item_impl, }; - Ok(ItemProviderImpls { items: vec![item] }) + Ok(Some(item)) } else { - Ok(ItemProviderImpls::default()) + Ok(None) } } - pub fn derive_with_provider_impl( - &self, - field: &GetterField, - ) -> syn::Result { + pub fn derive_with_provider_impl(&self, field: &GetterField) -> syn::Result { let args = &self.item_component.args; let provider_trait = &self.item_component.provider_trait; diff --git a/crates/macros/cgp-macro-lib/src/entrypoints/cgp_getter.rs b/crates/macros/cgp-macro-lib/src/entrypoints/cgp_getter.rs index 08f67549..e4aca24b 100644 --- a/crates/macros/cgp-macro-lib/src/entrypoints/cgp_getter.rs +++ b/crates/macros/cgp-macro-lib/src/entrypoints/cgp_getter.rs @@ -1,6 +1,4 @@ -use cgp_macro_core::types::cgp_component::{ - CgpComponentRawArgs, ItemCgpComponent, -}; +use cgp_macro_core::types::cgp_component::{CgpComponentRawArgs, ItemCgpComponent}; use cgp_macro_core::types::cgp_getter::ItemCgpGetter; use proc_macro2::TokenStream; use quote::quote; @@ -32,17 +30,12 @@ pub fn cgp_getter(attr: TokenStream, body: TokenStream) -> syn::Result Date: Mon, 15 Jun 2026 21:57:48 +0200 Subject: [PATCH 16/18] Implement ItemCgpGetter::to_items --- .../cgp-macro-core/src/types/cgp_getter/item.rs | 11 ++++++++++- .../cgp-macro-lib/src/entrypoints/cgp_getter.rs | 6 +----- 2 files changed, 11 insertions(+), 6 deletions(-) diff --git a/crates/macros/cgp-macro-core/src/types/cgp_getter/item.rs b/crates/macros/cgp-macro-core/src/types/cgp_getter/item.rs index 5734c575..831eda89 100644 --- a/crates/macros/cgp-macro-core/src/types/cgp_getter/item.rs +++ b/crates/macros/cgp-macro-core/src/types/cgp_getter/item.rs @@ -1,4 +1,4 @@ -use syn::{Error, TraitItemType}; +use syn::{Error, Item, TraitItemType}; use crate::functions::parse_getter_fields; use crate::types::cgp_component::EvaluatedCgpComponent; @@ -12,6 +12,15 @@ pub struct ItemCgpGetter { } impl ItemCgpGetter { + pub fn to_items(&self) -> syn::Result> { + let mut items = self.item_component.to_items()?; + + let item_impls = self.to_item_provider_impls()?.to_item_impls()?; + items.extend(item_impls.into_iter().map(Item::Impl)); + + Ok(items) + } + pub fn to_item_provider_impls(&self) -> syn::Result { let mut items = ItemProviderImpls::default(); diff --git a/crates/macros/cgp-macro-lib/src/entrypoints/cgp_getter.rs b/crates/macros/cgp-macro-lib/src/entrypoints/cgp_getter.rs index e4aca24b..da38990e 100644 --- a/crates/macros/cgp-macro-lib/src/entrypoints/cgp_getter.rs +++ b/crates/macros/cgp-macro-lib/src/entrypoints/cgp_getter.rs @@ -26,16 +26,12 @@ pub fn cgp_getter(attr: TokenStream, body: TokenStream) -> syn::Result Date: Mon, 15 Jun 2026 23:00:02 +0200 Subject: [PATCH 17/18] Migrate cgp_auto_getter --- .../attributes/cgp_component_attributes.rs | 14 ++++++- .../src/types/cgp_auto_getter}/blanket.rs | 9 +++-- .../src/types/cgp_auto_getter/item.rs | 37 +++++++++++++++++++ .../src/types/cgp_auto_getter}/mod.rs | 2 + .../src/types/cgp_component/item.rs | 8 +--- crates/macros/cgp-macro-core/src/types/mod.rs | 1 + .../src/entrypoints/cgp_auto_getter.rs | 24 +++--------- crates/macros/cgp-macro-lib/src/lib.rs | 1 - 8 files changed, 65 insertions(+), 31 deletions(-) rename crates/macros/{cgp-macro-lib/src/derive_getter => cgp-macro-core/src/types/cgp_auto_getter}/blanket.rs (91%) create mode 100644 crates/macros/cgp-macro-core/src/types/cgp_auto_getter/item.rs rename crates/macros/{cgp-macro-lib/src/derive_getter => cgp-macro-core/src/types/cgp_auto_getter}/mod.rs (55%) diff --git a/crates/macros/cgp-macro-core/src/types/attributes/cgp_component_attributes.rs b/crates/macros/cgp-macro-core/src/types/attributes/cgp_component_attributes.rs index 31c8c2c9..eba8cca2 100644 --- a/crates/macros/cgp-macro-core/src/types/attributes/cgp_component_attributes.rs +++ b/crates/macros/cgp-macro-core/src/types/attributes/cgp_component_attributes.rs @@ -3,7 +3,7 @@ use core::mem; use syn::parse::Parse; use syn::punctuated::Punctuated; use syn::token::Comma; -use syn::{Attribute, TypeParamBound}; +use syn::{Attribute, ItemTrait, TypeParamBound}; use crate::types::attributes::{PrefixAttribute, UseTypeAttribute, UseTypeAttributes}; @@ -15,6 +15,18 @@ pub struct CgpComponentAttributes { } impl CgpComponentAttributes { + pub fn preprocess(item_trait: &ItemTrait) -> syn::Result<(Self, ItemTrait)> { + let mut item_trait = item_trait.clone(); + + let attributes = Self::parse(&mut item_trait.attrs)?; + + item_trait.supertraits.extend(attributes.extend.clone()); + + attributes.use_type.transform_item_trait(&mut item_trait)?; + + Ok((attributes, item_trait)) + } + pub fn parse(attributes: &mut Vec) -> syn::Result { let mut parsed_attributes = CgpComponentAttributes::default(); diff --git a/crates/macros/cgp-macro-lib/src/derive_getter/blanket.rs b/crates/macros/cgp-macro-core/src/types/cgp_auto_getter/blanket.rs similarity index 91% rename from crates/macros/cgp-macro-lib/src/derive_getter/blanket.rs rename to crates/macros/cgp-macro-core/src/types/cgp_auto_getter/blanket.rs index 708d878a..fbb9e275 100644 --- a/crates/macros/cgp-macro-lib/src/derive_getter/blanket.rs +++ b/crates/macros/cgp-macro-core/src/types/cgp_auto_getter/blanket.rs @@ -1,10 +1,11 @@ -use cgp_macro_core::types::cgp_getter::{GetterField, ReceiverMode}; -use cgp_macro_core::types::field::{FieldName, HasFieldBound}; -use cgp_macro_core::types::getter::{ContextArg, derive_getter_method}; -use cgp_macro_core::visitors::get_bounds_and_replace_self_assoc_type; use quote::{ToTokens, quote}; use syn::{Ident, ImplItem, ItemImpl, ItemTrait, TraitItemType, parse_quote, parse2}; +use crate::types::cgp_getter::{GetterField, ReceiverMode}; +use crate::types::field::{FieldName, HasFieldBound}; +use crate::types::getter::{ContextArg, derive_getter_method}; +use crate::visitors::get_bounds_and_replace_self_assoc_type; + pub fn derive_blanket_impl( context_type: &Ident, consumer_trait: &ItemTrait, diff --git a/crates/macros/cgp-macro-core/src/types/cgp_auto_getter/item.rs b/crates/macros/cgp-macro-core/src/types/cgp_auto_getter/item.rs new file mode 100644 index 00000000..23ca5175 --- /dev/null +++ b/crates/macros/cgp-macro-core/src/types/cgp_auto_getter/item.rs @@ -0,0 +1,37 @@ +use proc_macro2::Span; +use syn::{Ident, Item, ItemImpl, ItemTrait}; + +use crate::functions::parse_getter_fields; +use crate::types::attributes::CgpComponentAttributes; +use crate::types::cgp_auto_getter::derive_blanket_impl; + +pub struct ItemCgpAutoGetter { + pub item_trait: ItemTrait, +} + +impl ItemCgpAutoGetter { + pub fn preprocess(item_trait: &ItemTrait) -> syn::Result { + let (_attributes, item_trait) = CgpComponentAttributes::preprocess(item_trait)?; + Ok(Self { item_trait }) + } + + pub fn to_items(&self) -> syn::Result> { + let mut items = Vec::new(); + + items.push(self.item_trait.clone().into()); + items.push(self.to_blanket_impl()?.into()); + + Ok(items) + } + + pub fn to_blanket_impl(&self) -> syn::Result { + let context_type = Ident::new("__Context__", Span::call_site()); + + let (fields, field_type) = parse_getter_fields(&context_type, &self.item_trait)?; + + let blanket_impl = + derive_blanket_impl(&context_type, &self.item_trait, &fields, &field_type)?; + + Ok(blanket_impl) + } +} diff --git a/crates/macros/cgp-macro-lib/src/derive_getter/mod.rs b/crates/macros/cgp-macro-core/src/types/cgp_auto_getter/mod.rs similarity index 55% rename from crates/macros/cgp-macro-lib/src/derive_getter/mod.rs rename to crates/macros/cgp-macro-core/src/types/cgp_auto_getter/mod.rs index d2d72d89..0d92f32c 100644 --- a/crates/macros/cgp-macro-lib/src/derive_getter/mod.rs +++ b/crates/macros/cgp-macro-core/src/types/cgp_auto_getter/mod.rs @@ -1,3 +1,5 @@ mod blanket; +mod item; pub use blanket::*; +pub use item::*; diff --git a/crates/macros/cgp-macro-core/src/types/cgp_component/item.rs b/crates/macros/cgp-macro-core/src/types/cgp_component/item.rs index ba26b54f..b5aad5a5 100644 --- a/crates/macros/cgp-macro-core/src/types/cgp_component/item.rs +++ b/crates/macros/cgp-macro-core/src/types/cgp_component/item.rs @@ -10,13 +10,7 @@ pub struct ItemCgpComponent { impl ItemCgpComponent { pub fn preprocess(&self) -> syn::Result { - let mut item_trait = self.item_trait.clone(); - - let attributes = CgpComponentAttributes::parse(&mut item_trait.attrs)?; - - item_trait.supertraits.extend(attributes.extend.clone()); - - attributes.use_type.transform_item_trait(&mut item_trait)?; + let (attributes, item_trait) = CgpComponentAttributes::preprocess(&self.item_trait)?; Ok(PreprocessedCgpComponent { args: self.args.clone(), diff --git a/crates/macros/cgp-macro-core/src/types/mod.rs b/crates/macros/cgp-macro-core/src/types/mod.rs index 50405e03..596f4206 100644 --- a/crates/macros/cgp-macro-core/src/types/mod.rs +++ b/crates/macros/cgp-macro-core/src/types/mod.rs @@ -1,4 +1,5 @@ pub mod attributes; +pub mod cgp_auto_getter; pub mod cgp_component; pub mod cgp_getter; pub mod cgp_impl; diff --git a/crates/macros/cgp-macro-lib/src/entrypoints/cgp_auto_getter.rs b/crates/macros/cgp-macro-lib/src/entrypoints/cgp_auto_getter.rs index 19bcc7de..3a464739 100644 --- a/crates/macros/cgp-macro-lib/src/entrypoints/cgp_auto_getter.rs +++ b/crates/macros/cgp-macro-lib/src/entrypoints/cgp_auto_getter.rs @@ -1,10 +1,7 @@ -use cgp_macro_core::functions::parse_getter_fields; -use cgp_macro_core::types::attributes::CgpComponentAttributes; +use cgp_macro_core::types::cgp_auto_getter::ItemCgpAutoGetter; use proc_macro2::{Span, TokenStream}; use quote::quote; -use syn::{Error, Ident, ItemTrait}; - -use crate::derive_getter::derive_blanket_impl; +use syn::{Error, ItemTrait}; pub fn cgp_auto_getter(attr: TokenStream, body: TokenStream) -> syn::Result { if !attr.is_empty() { @@ -14,22 +11,13 @@ pub fn cgp_auto_getter(attr: TokenStream, body: TokenStream) -> syn::Result Date: Mon, 15 Jun 2026 23:03:07 +0200 Subject: [PATCH 18/18] Fix clippy --- .../cgp-macro-core/src/types/cgp_auto_getter/blanket.rs | 2 +- .../cgp-macro-core/src/types/cgp_auto_getter/item.rs | 8 +++----- .../src/types/cgp_getter/to_use_fields_impl.rs | 2 +- .../cgp-macro-core/src/types/cgp_getter/use_field.rs | 4 ++-- .../cgp-macro-core/src/types/cgp_getter/with_provider.rs | 4 ++-- .../macros/cgp-macro-core/src/types/getter/context_arg.rs | 2 +- 6 files changed, 10 insertions(+), 12 deletions(-) diff --git a/crates/macros/cgp-macro-core/src/types/cgp_auto_getter/blanket.rs b/crates/macros/cgp-macro-core/src/types/cgp_auto_getter/blanket.rs index fbb9e275..b59ea605 100644 --- a/crates/macros/cgp-macro-core/src/types/cgp_auto_getter/blanket.rs +++ b/crates/macros/cgp-macro-core/src/types/cgp_auto_getter/blanket.rs @@ -53,7 +53,7 @@ pub fn derive_blanket_impl( for field in fields { let (receiver_type, context_arg) = match &field.receiver_mode { ReceiverMode::SelfReceiver => (context_type.to_token_stream(), ContextArg::SelfArg), - ReceiverMode::Type(ty) => (ty.to_token_stream(), ContextArg::Type(ty.as_ref().clone())), + ReceiverMode::Type(ty) => (ty.to_token_stream(), ContextArg::Type(ty.clone())), }; let field_name = FieldName::from(field.field_name.clone()); diff --git a/crates/macros/cgp-macro-core/src/types/cgp_auto_getter/item.rs b/crates/macros/cgp-macro-core/src/types/cgp_auto_getter/item.rs index 23ca5175..e2b7c895 100644 --- a/crates/macros/cgp-macro-core/src/types/cgp_auto_getter/item.rs +++ b/crates/macros/cgp-macro-core/src/types/cgp_auto_getter/item.rs @@ -16,12 +16,10 @@ impl ItemCgpAutoGetter { } pub fn to_items(&self) -> syn::Result> { - let mut items = Vec::new(); + let item_trait = self.item_trait.clone().into(); + let item_impl = self.to_blanket_impl()?.into(); - items.push(self.item_trait.clone().into()); - items.push(self.to_blanket_impl()?.into()); - - Ok(items) + Ok(vec![item_trait, item_impl]) } pub fn to_blanket_impl(&self) -> syn::Result { diff --git a/crates/macros/cgp-macro-core/src/types/cgp_getter/to_use_fields_impl.rs b/crates/macros/cgp-macro-core/src/types/cgp_getter/to_use_fields_impl.rs index 7721d652..2953e5e5 100644 --- a/crates/macros/cgp-macro-core/src/types/cgp_getter/to_use_fields_impl.rs +++ b/crates/macros/cgp-macro-core/src/types/cgp_getter/to_use_fields_impl.rs @@ -49,7 +49,7 @@ impl ItemCgpGetter { for field in &self.fields { let receiver_type = match &field.receiver_mode { ReceiverMode::SelfReceiver => parse_quote!(#context_type), - ReceiverMode::Type(ty) => ty.as_ref().clone(), + ReceiverMode::Type(ty) => ty.clone(), }; let field_name = Symbol::new(field.field_name.clone()); diff --git a/crates/macros/cgp-macro-core/src/types/cgp_getter/use_field.rs b/crates/macros/cgp-macro-core/src/types/cgp_getter/use_field.rs index f78b7ac6..aabb324f 100644 --- a/crates/macros/cgp-macro-core/src/types/cgp_getter/use_field.rs +++ b/crates/macros/cgp-macro-core/src/types/cgp_getter/use_field.rs @@ -15,7 +15,7 @@ impl ItemCgpGetter { if self.fields.len() == 1 { let field = &self.fields[0]; - let item_impl = self.derive_use_field_impl(&field)?; + let item_impl = self.derive_use_field_impl(field)?; let component_type = self.item_component.args.component_name.to_type(); @@ -38,7 +38,7 @@ impl ItemCgpGetter { let receiver_type = match &field.receiver_mode { ReceiverMode::SelfReceiver => parse_quote!(#context_type), - ReceiverMode::Type(ty) => ty.as_ref().clone(), + ReceiverMode::Type(ty) => ty.clone(), }; let mut field_constraints: Punctuated = Punctuated::default(); diff --git a/crates/macros/cgp-macro-core/src/types/cgp_getter/with_provider.rs b/crates/macros/cgp-macro-core/src/types/cgp_getter/with_provider.rs index e8bd291e..edd8bfa8 100644 --- a/crates/macros/cgp-macro-core/src/types/cgp_getter/with_provider.rs +++ b/crates/macros/cgp-macro-core/src/types/cgp_getter/with_provider.rs @@ -12,7 +12,7 @@ impl ItemCgpGetter { if self.fields.len() == 1 { let field = &self.fields[0]; - let item_impl = self.derive_with_provider_impl(&field)?; + let item_impl = self.derive_with_provider_impl(field)?; let component_type = self.item_component.args.component_name.to_type(); @@ -39,7 +39,7 @@ impl ItemCgpGetter { let receiver_type = match &field.receiver_mode { ReceiverMode::SelfReceiver => parse_quote!(#context_type), - ReceiverMode::Type(ty) => ty.as_ref().clone(), + ReceiverMode::Type(ty) => ty.clone(), }; let field_type = match field_assoc_type { diff --git a/crates/macros/cgp-macro-core/src/types/getter/context_arg.rs b/crates/macros/cgp-macro-core/src/types/getter/context_arg.rs index 30b86af3..d9f87a5e 100644 --- a/crates/macros/cgp-macro-core/src/types/getter/context_arg.rs +++ b/crates/macros/cgp-macro-core/src/types/getter/context_arg.rs @@ -3,5 +3,5 @@ use syn::Type; #[derive(Clone)] pub enum ContextArg { SelfArg, - Type(Type), + Type(Box), }