Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions Cargo.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

6 changes: 6 additions & 0 deletions Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -147,6 +147,12 @@ missing_crate_level_docs = "warn"
unescaped_backticks = "warn"

[workspace.lints.rust]
# This lint is used only to warn about the changes in drop order during the
# transition from Rust 2021 to Rust 2024. There are too many instances of this
# lint in our code base and some of them may be false positives. So we just allow
# this lint globally.
tail_expr_drop_order = { level = "allow", priority = 2 }

unsafe_code = "warn"
unstable_features = "warn"

Expand Down
4 changes: 2 additions & 2 deletions benchmarks/runtime/src/args_10.rs
Original file line number Diff line number Diff line change
Expand Up @@ -46,8 +46,8 @@ pub fn builder_bench() -> u32 {
.call()
}

#[builder(expose_positional_fn = regular)]
fn builder(
#[builder(start_fn = builder)]
fn regular(
arg1: &str,
arg2: u32,
arg3: bool,
Expand Down
4 changes: 2 additions & 2 deletions benchmarks/runtime/src/args_10_alloc.rs
Original file line number Diff line number Diff line change
Expand Up @@ -46,8 +46,8 @@ pub fn builder_bench() -> u32 {
.call()
}

#[builder(expose_positional_fn = regular)]
fn builder(
#[builder(start_fn = builder)]
fn regular(
arg1: String,
arg2: u32,
arg3: bool,
Expand Down
4 changes: 2 additions & 2 deletions benchmarks/runtime/src/args_10_structs.rs
Original file line number Diff line number Diff line change
Expand Up @@ -87,8 +87,8 @@ pub fn builder_bench() -> u32 {
.call()
}

#[builder(expose_positional_fn = regular)]
fn builder(
#[builder(start_fn = builder)]
fn regular(
arg1: Point3D,
arg2: u32,
arg3: bool,
Expand Down
4 changes: 2 additions & 2 deletions benchmarks/runtime/src/args_20.rs
Original file line number Diff line number Diff line change
Expand Up @@ -121,8 +121,8 @@ pub fn builder_bench() -> u32 {
.call()
}

#[builder(expose_positional_fn = regular)]
fn builder(
#[builder(start_fn = builder)]
fn regular(
arg1: &str,
arg2: u32,
arg3: bool,
Expand Down
4 changes: 2 additions & 2 deletions benchmarks/runtime/src/args_3.rs
Original file line number Diff line number Diff line change
Expand Up @@ -13,8 +13,8 @@ pub fn builder_bench() -> u32 {
builder().arg1(arg1).arg2(arg2).maybe_arg3(arg3).call()
}

#[builder(expose_positional_fn = regular)]
fn builder(arg1: &str, arg2: u32, arg3: Option<&str>) -> u32 {
#[builder(start_fn = builder)]
fn regular(arg1: &str, arg2: u32, arg3: Option<&str>) -> u32 {
let x = arg1.parse::<u32>().unwrap() + arg2;
let x = x + arg3.map(|x| x.parse::<u32>().unwrap()).unwrap_or(0);
x
Expand Down
4 changes: 2 additions & 2 deletions benchmarks/runtime/src/args_5.rs
Original file line number Diff line number Diff line change
Expand Up @@ -19,8 +19,8 @@ pub fn builder_bench() -> u32 {
.call()
}

#[builder(expose_positional_fn = regular)]
fn builder(arg1: &str, arg2: u32, arg3: bool, arg4: Option<&str>, arg5: Option<u32>) -> u32 {
#[builder(start_fn = builder)]
fn regular(arg1: &str, arg2: u32, arg3: bool, arg4: Option<&str>, arg5: Option<u32>) -> u32 {
let x = arg1.parse::<u32>().unwrap() + arg2;
let x = x + u32::from(arg3);
let x = x + arg4.map(|x| x.parse::<u32>().unwrap()).unwrap_or(0);
Expand Down
1 change: 1 addition & 0 deletions bon-macros/Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -58,6 +58,7 @@ quote = "1"
syn = { version = "2.0.56", features = ["full", "visit-mut", "visit"] }

prettyplease = "0.2"
rustversion = "1.0"

[features]
default = []
Expand Down
32 changes: 14 additions & 18 deletions bon-macros/src/bon.rs
Original file line number Diff line number Diff line change
@@ -1,39 +1,35 @@
use crate::builder;
use crate::normalization::{ExpandCfg, ExpansionOutput};
use crate::normalization::{ExpandCfg, Expansion};
use crate::util::prelude::*;
use darling::ast::NestedMeta;
use darling::FromMeta;

pub(crate) fn generate(params: TokenStream, item: TokenStream) -> TokenStream {
crate::error::with_fallback(item.clone(), || try_generate(params, item))
crate::error::handle_errors(item.clone(), || try_generate(params, item))
.unwrap_or_else(std::convert::identity)
}

pub(crate) fn try_generate(params: TokenStream, item: TokenStream) -> Result<TokenStream> {
let item: syn::Item = syn::parse2(item)?;
let macro_path = syn::parse_quote!(::bon::bon);

let ctx = ExpandCfg {
macro_path,
params,
current_macro: format_ident!("bon"),
config: params,
item,
};

let (params, item) = match ctx.expand_cfg()? {
ExpansionOutput::Expanded { params, item } => (params, item),
ExpansionOutput::Recurse(output) => return Ok(output),
let input = match ctx.expand_cfg()? {
Expansion::Expanded(input) => input,
Expansion::Recurse(output) => return Ok(output),
};

if !params.is_empty() {
bail!(
&params,
"`#[bon]` attribute does not accept any parameters yet, \
but it will in future releases"
);
}
let params = NestedMeta::parse_meta_list(input.config)?;
let params = FromMeta::from_list(&params)?;

match item {
syn::Item::Impl(item_impl) => builder::item_impl::generate(item_impl),
match input.item {
syn::Item::Impl(item_impl) => builder::item_impl::generate(params, item_impl),
_ => bail!(
&item,
&input.item,
"`#[bon]` attribute is expected to be placed on an `impl` block \
but it was placed on other syntax instead"
),
Expand Down
20 changes: 11 additions & 9 deletions bon-macros/src/builder/builder_gen/builder_derives.rs
Original file line number Diff line number Diff line change
@@ -1,12 +1,12 @@
use super::builder_params::{BuilderDerive, BuilderDerives};
use super::top_level_config::{DeriveConfig, DerivesConfig};
use super::BuilderGenCtx;
use crate::builder::builder_gen::Member;
use crate::util::prelude::*;
use darling::ast::GenericParamExt;

impl BuilderGenCtx {
pub(crate) fn builder_derives(&self) -> TokenStream {
let BuilderDerives { clone, debug } = &self.builder_type.derives;
let DerivesConfig { clone, debug } = &self.builder_type.derives;

let mut tokens = TokenStream::new();

Expand All @@ -31,7 +31,7 @@ impl BuilderGenCtx {
fn where_clause_for_derive(
&self,
target_trait_bounds: &TokenStream,
derive: &BuilderDerive,
derive: &DeriveConfig,
) -> TokenStream {
let derive_specific_predicates = derive
.bounds
Expand Down Expand Up @@ -64,7 +64,8 @@ impl BuilderGenCtx {
}
}

fn derive_clone(&self, derive: &BuilderDerive) -> TokenStream {
fn derive_clone(&self, derive: &DeriveConfig) -> TokenStream {
let bon = &self.bon;
let generics_decl = &self.generics.decl_without_defaults;
let generic_args = &self.generics.args;
let builder_ident = &self.builder_type.ident;
Expand Down Expand Up @@ -113,7 +114,7 @@ impl BuilderGenCtx {
let ty = member.underlying_norm_ty();

quote! {
::bon::private::derives::clone_member::<#ty>(
#bon::__private::derives::clone_member::<#ty>(
&self.#named_members_field.#member_index
)
}
Expand Down Expand Up @@ -153,10 +154,11 @@ impl BuilderGenCtx {
}
}

fn derive_debug(&self, derive: &BuilderDerive) -> TokenStream {
fn derive_debug(&self, derive: &DeriveConfig) -> TokenStream {
let receiver_field = &self.ident_pool.receiver;
let start_fn_args_field = &self.ident_pool.start_fn_args;
let named_members_field = &self.ident_pool.named_members;
let bon = &self.bon;

let format_members = self.members.iter().filter_map(|member| {
match member {
Expand All @@ -168,7 +170,7 @@ impl BuilderGenCtx {
if let Some(value) = &self.#named_members_field.#member_index {
output.field(
#member_ident_str,
::bon::private::derives::as_dyn_debug::<#member_ty>(value)
#bon::__private::derives::as_dyn_debug::<#member_ty>(value)
);
}
})
Expand All @@ -180,7 +182,7 @@ impl BuilderGenCtx {
Some(quote! {
output.field(
#member_ident_str,
::bon::private::derives::as_dyn_debug::<#member_ty>(
#bon::__private::derives::as_dyn_debug::<#member_ty>(
&self.#start_fn_args_field.#member_index
)
);
Expand All @@ -199,7 +201,7 @@ impl BuilderGenCtx {
quote! {
output.field(
"self",
::bon::private::derives::as_dyn_debug::<#ty>(
#bon::__private::derives::as_dyn_debug::<#ty>(
&self.#receiver_field
)
);
Expand Down
87 changes: 0 additions & 87 deletions bon-macros/src/builder/builder_gen/builder_params/mod.rs

This file was deleted.

9 changes: 4 additions & 5 deletions bon-macros/src/builder/builder_gen/finish_fn.rs
Original file line number Diff line number Diff line change
Expand Up @@ -31,16 +31,15 @@ impl super::BuilderGenCtx {
self.#named_members_field.#index
};

let param_default = member
.params
let default = member
.config
.default
.as_ref()
.map(|default| default.value.as_ref());

match param_default {
match default {
Some(Some(default)) => {
let has_into = member.params.into.is_present();
let default = if has_into {
let default = if member.config.into.is_present() {
quote! { Into::into((|| #default)()) }
} else {
quote! { #default }
Expand Down
Loading