Skip to content

Commit 569fa0d

Browse files
authored
Don't attempt to compile big default value showcases as ignored rust doctests (#360)
1 parent 7cbf385 commit 569fa0d

File tree

4 files changed

+80
-97
lines changed

4 files changed

+80
-97
lines changed

bon-macros/src/builder/builder_gen/setters/mod.rs

Lines changed: 37 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -600,24 +600,16 @@ impl SettersItems {
600600
.or(common_docs)
601601
.unwrap_or(&member.docs);
602602

603-
let setter_names = (&some_fn_name, &option_fn_name);
604-
605-
let some_fn_docs = {
606-
let header = optional_setter_docs(default, setter_names);
607-
608-
doc(&header).chain(some_fn_docs.iter().cloned()).collect()
609-
};
603+
let some_fn_docs =
604+
optional_setter_docs(default, &some_fn_name, &option_fn_name, some_fn_docs);
610605

611606
let option_fn_docs = option_fn
612607
.and_then(ItemSigConfig::docs)
613608
.or(common_docs)
614609
.unwrap_or(&member.docs);
615610

616-
let option_fn_docs = {
617-
let header = optional_setter_docs(default, setter_names);
618-
619-
doc(&header).chain(option_fn_docs.iter().cloned()).collect()
620-
};
611+
let option_fn_docs =
612+
optional_setter_docs(default, &some_fn_name, &option_fn_name, option_fn_docs);
621613

622614
let some_fn = SetterItem {
623615
name: some_fn_name,
@@ -649,24 +641,39 @@ impl SettersItems {
649641

650642
fn optional_setter_docs(
651643
default: Option<&str>,
652-
(some_fn, option_fn): (&syn::Ident, &syn::Ident),
653-
) -> String {
654-
let default = default
655-
.map(|default| {
656-
if default.contains('\n') || default.len() > 80 {
657-
format!(" _**Default:**_\n````rust,ignore\n{default}\n````\n\n")
658-
} else {
659-
format!(" _**Default:**_ ```{default}```.\n\n")
660-
}
661-
})
662-
.unwrap_or_default();
663-
664-
format!(
665-
"_**Optional** \
666-
([Some](Self::{some_fn}()) / [Option](Self::{option_fn}()) setters).\
667-
_{default}\
668-
\n\n"
669-
)
644+
some_fn: &syn::Ident,
645+
option_fn: &syn::Ident,
646+
doc_comments: &[syn::Attribute],
647+
) -> Vec<syn::Attribute> {
648+
let header = format!(
649+
"_**Optional** ([Some](Self::{some_fn}()) / [Option](Self::{option_fn}()) setters)._"
650+
);
651+
652+
let mut attrs = vec![syn::parse_quote!(#[doc = #header])];
653+
654+
if let Some(default) = default {
655+
let sep = if doc_comments.is_empty() { "" } else { "\n\n" };
656+
657+
if default.contains('\n') || default.len() > 80 {
658+
// `no_doctest` helps to avoid interpreting the code block as
659+
// an "ignored but still runnable" doc test. See details:
660+
// - bon issue: https://github.com/elastio/bon/issues/359
661+
// - rust issue: https://github.com/rust-lang/rust/issues/63193
662+
let tail = format!("\n{default}\n````{sep}");
663+
attrs.extend([
664+
syn::parse_quote!(#[doc = " _**Default:**_\n"]),
665+
syn::parse_quote!(#[cfg_attr(doctest, doc = "````no_doctest")]),
666+
syn::parse_quote!(#[cfg_attr(not(doctest), doc = "````")]),
667+
syn::parse_quote!(#[doc = #tail]),
668+
]);
669+
} else {
670+
let doc = format!(" _**Default:**_ ```{default}```.{sep}");
671+
attrs.push(syn::parse_quote!(#[doc = #doc]));
672+
}
673+
}
674+
675+
attrs.extend(doc_comments.iter().cloned());
676+
attrs
670677
}
671678

672679
fn well_known_default(ty: &syn::Type) -> Option<syn::Expr> {

bon-macros/tests/snapshots/setters_docs_and_vis.rs

Lines changed: 24 additions & 54 deletions
Original file line numberDiff line numberDiff line change
@@ -15,9 +15,7 @@ impl<S: sut_builder::State> SutBuilder<S> {
1515
where
1616
S::RequiredField: sut_builder::IsUnset,
1717
{}
18-
/**_**Optional** ([Some](Self::optional_field()) / [Option](Self::maybe_optional_field()) setters)._
19-
20-
*/
18+
///_**Optional** ([Some](Self::optional_field()) / [Option](Self::maybe_optional_field()) setters)._
2119
/// Docs on the optional field setters.
2220
/// Multiline.
2321
pub(in overridden) fn optional_field(
@@ -27,9 +25,7 @@ impl<S: sut_builder::State> SutBuilder<S> {
2725
where
2826
S::OptionalField: sut_builder::IsUnset,
2927
{}
30-
/**_**Optional** ([Some](Self::optional_field()) / [Option](Self::maybe_optional_field()) setters)._
31-
32-
*/
28+
///_**Optional** ([Some](Self::optional_field()) / [Option](Self::maybe_optional_field()) setters)._
3329
/// Docs on the optional field setters.
3430
/// Multiline.
3531
pub(in overridden) fn maybe_optional_field(
@@ -39,9 +35,8 @@ impl<S: sut_builder::State> SutBuilder<S> {
3935
where
4036
S::OptionalField: sut_builder::IsUnset,
4137
{}
42-
/**_**Optional** ([Some](Self::default_field()) / [Option](Self::maybe_default_field()) setters)._ _**Default:**_ ```2 + 2 * 3```.
43-
44-
38+
///_**Optional** ([Some](Self::default_field()) / [Option](Self::maybe_default_field()) setters)._
39+
/** _**Default:**_ ```2 + 2 * 3```.
4540
4641
*/
4742
/// Docs on the default field setters.
@@ -53,9 +48,8 @@ impl<S: sut_builder::State> SutBuilder<S> {
5348
where
5449
S::DefaultField: sut_builder::IsUnset,
5550
{}
56-
/**_**Optional** ([Some](Self::default_field()) / [Option](Self::maybe_default_field()) setters)._ _**Default:**_ ```2 + 2 * 3```.
57-
58-
51+
///_**Optional** ([Some](Self::default_field()) / [Option](Self::maybe_default_field()) setters)._
52+
/** _**Default:**_ ```2 + 2 * 3```.
5953
6054
*/
6155
/// Docs on the default field setters.
@@ -67,9 +61,7 @@ impl<S: sut_builder::State> SutBuilder<S> {
6761
where
6862
S::DefaultField: sut_builder::IsUnset,
6963
{}
70-
/**_**Optional** ([Some](Self::optional_field_with_specific_overrides()) / [Option](Self::maybe_optional_field_with_specific_overrides()) setters)._
71-
72-
*/
64+
///_**Optional** ([Some](Self::optional_field_with_specific_overrides()) / [Option](Self::maybe_optional_field_with_specific_overrides()) setters)._
7365
/// Docs on some_fn
7466
/// Multiline.
7567
pub(in some_fn_overridden) fn optional_field_with_specific_overrides(
@@ -79,9 +71,7 @@ impl<S: sut_builder::State> SutBuilder<S> {
7971
where
8072
S::OptionalFieldWithSpecificOverrides: sut_builder::IsUnset,
8173
{}
82-
/**_**Optional** ([Some](Self::optional_field_with_specific_overrides()) / [Option](Self::maybe_optional_field_with_specific_overrides()) setters)._
83-
84-
*/
74+
///_**Optional** ([Some](Self::optional_field_with_specific_overrides()) / [Option](Self::maybe_optional_field_with_specific_overrides()) setters)._
8575
/// Docs on option_fn
8676
/// Multiline.
8777
pub(in option_fn_overridden) fn maybe_optional_field_with_specific_overrides(
@@ -91,9 +81,8 @@ impl<S: sut_builder::State> SutBuilder<S> {
9181
where
9282
S::OptionalFieldWithSpecificOverrides: sut_builder::IsUnset,
9383
{}
94-
/**_**Optional** ([Some](Self::default_field_with_specific_overrides()) / [Option](Self::maybe_default_field_with_specific_overrides()) setters)._ _**Default:**_ ```2 + 2 * 3```.
95-
96-
84+
///_**Optional** ([Some](Self::default_field_with_specific_overrides()) / [Option](Self::maybe_default_field_with_specific_overrides()) setters)._
85+
/** _**Default:**_ ```2 + 2 * 3```.
9786
9887
*/
9988
/// Docs on some_fn
@@ -105,9 +94,8 @@ impl<S: sut_builder::State> SutBuilder<S> {
10594
where
10695
S::DefaultFieldWithSpecificOverrides: sut_builder::IsUnset,
10796
{}
108-
/**_**Optional** ([Some](Self::default_field_with_specific_overrides()) / [Option](Self::maybe_default_field_with_specific_overrides()) setters)._ _**Default:**_ ```2 + 2 * 3```.
109-
110-
97+
///_**Optional** ([Some](Self::default_field_with_specific_overrides()) / [Option](Self::maybe_default_field_with_specific_overrides()) setters)._
98+
/** _**Default:**_ ```2 + 2 * 3```.
11199
112100
*/
113101
/// Docs on option_fn
@@ -119,9 +107,7 @@ impl<S: sut_builder::State> SutBuilder<S> {
119107
where
120108
S::DefaultFieldWithSpecificOverrides: sut_builder::IsUnset,
121109
{}
122-
/**_**Optional** ([Some](Self::optional_field_with_inherited_overrides()) / [Option](Self::maybe_optional_field_with_inherited_overrides()) setters)._
123-
124-
*/
110+
///_**Optional** ([Some](Self::optional_field_with_inherited_overrides()) / [Option](Self::maybe_optional_field_with_inherited_overrides()) setters)._
125111
/// Common docs
126112
/// Multiline.
127113
pub(in overridden) fn optional_field_with_inherited_overrides(
@@ -131,9 +117,7 @@ impl<S: sut_builder::State> SutBuilder<S> {
131117
where
132118
S::OptionalFieldWithInheritedOverrides: sut_builder::IsUnset,
133119
{}
134-
/**_**Optional** ([Some](Self::optional_field_with_inherited_overrides()) / [Option](Self::maybe_optional_field_with_inherited_overrides()) setters)._
135-
136-
*/
120+
///_**Optional** ([Some](Self::optional_field_with_inherited_overrides()) / [Option](Self::maybe_optional_field_with_inherited_overrides()) setters)._
137121
/// Docs on option_fn
138122
/// Multiline.
139123
pub(in option_fn_overridden) fn maybe_optional_field_with_inherited_overrides(
@@ -143,9 +127,8 @@ impl<S: sut_builder::State> SutBuilder<S> {
143127
where
144128
S::OptionalFieldWithInheritedOverrides: sut_builder::IsUnset,
145129
{}
146-
/**_**Optional** ([Some](Self::default_field_with_inherited_overrides()) / [Option](Self::maybe_default_field_with_inherited_overrides()) setters)._ _**Default:**_ ```2 + 2 * 3```.
147-
148-
130+
///_**Optional** ([Some](Self::default_field_with_inherited_overrides()) / [Option](Self::maybe_default_field_with_inherited_overrides()) setters)._
131+
/** _**Default:**_ ```2 + 2 * 3```.
149132
150133
*/
151134
/// Common docs
@@ -157,9 +140,8 @@ impl<S: sut_builder::State> SutBuilder<S> {
157140
where
158141
S::DefaultFieldWithInheritedOverrides: sut_builder::IsUnset,
159142
{}
160-
/**_**Optional** ([Some](Self::default_field_with_inherited_overrides()) / [Option](Self::maybe_default_field_with_inherited_overrides()) setters)._ _**Default:**_ ```2 + 2 * 3```.
161-
162-
143+
///_**Optional** ([Some](Self::default_field_with_inherited_overrides()) / [Option](Self::maybe_default_field_with_inherited_overrides()) setters)._
144+
/** _**Default:**_ ```2 + 2 * 3```.
163145
164146
*/
165147
/// Docs on option_fn
@@ -171,29 +153,23 @@ impl<S: sut_builder::State> SutBuilder<S> {
171153
where
172154
S::DefaultFieldWithInheritedOverrides: sut_builder::IsUnset,
173155
{}
174-
/**_**Optional** ([Some](Self::setters_doc_default_skip()) / [Option](Self::maybe_setters_doc_default_skip()) setters)._
175-
176-
*/
156+
///_**Optional** ([Some](Self::setters_doc_default_skip()) / [Option](Self::maybe_setters_doc_default_skip()) setters)._
177157
fn setters_doc_default_skip(
178158
self,
179159
value: u32,
180160
) -> SutBuilder<sut_builder::SetSettersDocDefaultSkip<S>>
181161
where
182162
S::SettersDocDefaultSkip: sut_builder::IsUnset,
183163
{}
184-
/**_**Optional** ([Some](Self::setters_doc_default_skip()) / [Option](Self::maybe_setters_doc_default_skip()) setters)._
185-
186-
*/
164+
///_**Optional** ([Some](Self::setters_doc_default_skip()) / [Option](Self::maybe_setters_doc_default_skip()) setters)._
187165
fn maybe_setters_doc_default_skip(
188166
mut self,
189167
value: Option<u32>,
190168
) -> SutBuilder<sut_builder::SetSettersDocDefaultSkip<S>>
191169
where
192170
S::SettersDocDefaultSkip: sut_builder::IsUnset,
193171
{}
194-
/**_**Optional** ([Some](Self::setters_doc_default_skip_and_custom_docs_block()) / [Option](Self::maybe_setters_doc_default_skip_and_custom_docs_block()) setters)._
195-
196-
*/
172+
///_**Optional** ([Some](Self::setters_doc_default_skip_and_custom_docs_block()) / [Option](Self::maybe_setters_doc_default_skip_and_custom_docs_block()) setters)._
197173
/// Custom docs
198174
/// Multiline.
199175
fn setters_doc_default_skip_and_custom_docs_block(
@@ -203,9 +179,7 @@ impl<S: sut_builder::State> SutBuilder<S> {
203179
where
204180
S::SettersDocDefaultSkipAndCustomDocsBlock: sut_builder::IsUnset,
205181
{}
206-
/**_**Optional** ([Some](Self::setters_doc_default_skip_and_custom_docs_block()) / [Option](Self::maybe_setters_doc_default_skip_and_custom_docs_block()) setters)._
207-
208-
*/
182+
///_**Optional** ([Some](Self::setters_doc_default_skip_and_custom_docs_block()) / [Option](Self::maybe_setters_doc_default_skip_and_custom_docs_block()) setters)._
209183
/// Custom docs
210184
/// Multiline.
211185
fn maybe_setters_doc_default_skip_and_custom_docs_block(
@@ -215,19 +189,15 @@ impl<S: sut_builder::State> SutBuilder<S> {
215189
where
216190
S::SettersDocDefaultSkipAndCustomDocsBlock: sut_builder::IsUnset,
217191
{}
218-
/**_**Optional** ([Some](Self::setters_doc_default_skip_from_top_level_on()) / [Option](Self::maybe_setters_doc_default_skip_from_top_level_on()) setters)._
219-
220-
*/
192+
///_**Optional** ([Some](Self::setters_doc_default_skip_from_top_level_on()) / [Option](Self::maybe_setters_doc_default_skip_from_top_level_on()) setters)._
221193
fn setters_doc_default_skip_from_top_level_on(
222194
self,
223195
value: u8,
224196
) -> SutBuilder<sut_builder::SetSettersDocDefaultSkipFromTopLevelOn<S>>
225197
where
226198
S::SettersDocDefaultSkipFromTopLevelOn: sut_builder::IsUnset,
227199
{}
228-
/**_**Optional** ([Some](Self::setters_doc_default_skip_from_top_level_on()) / [Option](Self::maybe_setters_doc_default_skip_from_top_level_on()) setters)._
229-
230-
*/
200+
///_**Optional** ([Some](Self::setters_doc_default_skip_from_top_level_on()) / [Option](Self::maybe_setters_doc_default_skip_from_top_level_on()) setters)._
231201
fn maybe_setters_doc_default_skip_from_top_level_on(
232202
mut self,
233203
value: Option<u8>,

bon-sandbox/src/attr_default.rs

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,9 +10,13 @@
1010
reason = "Common `_default` suffix is for better readability"
1111
)]
1212
pub struct Example {
13+
/// Custom doc comment.
14+
/// Multiline.
1315
#[builder(default = (2 + 2) * 10)]
1416
small_custom_default: u32,
1517

18+
/// Custom doc comment.
19+
/// Multiline.
1620
#[builder(default = Vec::from([
1721
Point { x: 1, y: 2 },
1822
Point { x: 3, y: 4 },

scripts/test-msrv.sh

Lines changed: 15 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -34,19 +34,21 @@ with_log cd bon
3434

3535
step echo '[workspace]' >> Cargo.toml
3636

37-
step cargo update -p proc-macro2 --precise 1.0.101
38-
step cargo update -p quote --precise 1.0.40
39-
step cargo update -p once_cell --precise 1.17.2
40-
step cargo update -p trybuild --precise 1.0.89
41-
step cargo update -p serde_json --precise 1.0.143
42-
step cargo update -p serde --precise 1.0.194
43-
step cargo update -p prettyplease --precise 0.2.17
44-
step cargo update -p syn --precise 2.0.56
45-
step cargo update -p tokio --precise 1.29.1
46-
step cargo update -p expect-test --precise 1.4.1
47-
step cargo update -p windows-sys --precise 0.52.0
48-
step cargo update -p libc --precise 0.2.163
49-
step cargo update -p glob --precise 0.3.2
37+
step cargo update --precise 1.0.15 -p itoa
38+
step cargo update --precise 1.0.101 -p proc-macro2
39+
step cargo update --precise 1.0.40 -p quote
40+
step cargo update --precise 1.17.2 -p once_cell
41+
step cargo update --precise 1.0.89 -p trybuild
42+
step cargo update --precise 1.0.143 -p serde_json
43+
step cargo update --precise 1.0.20 -p ryu
44+
step cargo update --precise 1.0.194 -p serde
45+
step cargo update --precise 0.2.17 -p prettyplease
46+
step cargo update --precise 2.0.56 -p syn
47+
step cargo update --precise 1.29.1 -p tokio
48+
step cargo update --precise 1.4.1 -p expect-test
49+
step cargo update --precise 0.52.0 -p windows-sys
50+
step cargo update --precise 0.2.163 -p libc
51+
step cargo update --precise 0.3.2 -p glob
5052

5153
export RUSTFLAGS="${RUSTFLAGS:-} --allow unknown-lints"
5254

0 commit comments

Comments
 (0)