Skip to content

Commit 498103e

Browse files
committed
Support builder(overwritable) with builder(getter)
1 parent 007a5ee commit 498103e

File tree

3 files changed

+22
-14
lines changed

3 files changed

+22
-14
lines changed

bon-macros/src/builder/builder_gen/getters.rs

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -60,6 +60,13 @@ impl<'a> GettersCtx<'a> {
6060
// be treated as totally different symbols due to the hygiene rules.
6161
let self_ = quote!(self);
6262

63+
let where_clause = self.member.is_stateful().then(|| {
64+
quote! {
65+
where
66+
#state_var::#member_pascal: #state_mod::IsSet,
67+
}
68+
});
69+
6370
Ok(quote_spanned! {self.member.span=>
6471
#( #docs )*
6572
#[allow(
@@ -70,8 +77,7 @@ impl<'a> GettersCtx<'a> {
7077
#[inline(always)]
7178
#[must_use = "this method has no side effects; it only returns a value"]
7279
#(#fn_modifiers)* fn #name(&#self_) -> #return_ty
73-
where
74-
#state_var::#member_pascal: #state_mod::IsSet,
80+
#where_clause
7581
{
7682
#body
7783
}

bon-macros/src/builder/builder_gen/member/config/mod.rs

Lines changed: 0 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -231,14 +231,6 @@ impl MemberConfig {
231231
);
232232
}
233233

234-
if let Some(getter) = &self.getter {
235-
self.validate_mutually_exclusive(
236-
ParamName::Getter,
237-
getter.key.span(),
238-
&[ParamName::Overwritable],
239-
)?;
240-
}
241-
242234
if self.start_fn.is_present() {
243235
self.validate_mutually_allowed(
244236
ParamName::StartFn,

bon/tests/integration/builder/attr_overwritable.rs

Lines changed: 14 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -93,11 +93,21 @@ mod on {
9393

9494
#[builder(default)]
9595
c: u32,
96+
97+
#[builder(getter)]
98+
d: u32,
99+
100+
#[builder(getter)]
101+
e: Option<u32>,
96102
}
97103

98-
assert_debug_eq(
99-
Sut::builder().a(1).a(2).b(3).b(4).c(5).c(6).build(),
100-
expect!["Sut { a: 2, b: Some(4), c: 6 }"],
101-
);
104+
let builder = Sut::builder().a(1).a(2).b(3).b(4).c(5).c(6).d(7).e(8);
105+
106+
assert_debug_eq(builder.get_d(), expect!["7"]);
107+
assert_debug_eq(builder.get_e(), expect!["Some(8)"]);
108+
109+
let value = builder.build();
110+
111+
assert_debug_eq(value, expect!["Sut { a: 2, b: Some(4), c: 6, d: 7 }"]);
102112
}
103113
}

0 commit comments

Comments
 (0)