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
9 changes: 6 additions & 3 deletions bon-macros/src/builder/builder_gen/builder_derives/debug.rs
Original file line number Diff line number Diff line change
Expand Up @@ -7,11 +7,14 @@ impl BuilderGenCtx {
pub(super) fn derive_debug(&self, derive: &DeriveConfig) -> TokenStream {
let bon = &self.bon;

// The `r#` prefix is a syntactic escape, not a part of the identifier's
// name, so it's stripped from every name that ends up in the `Debug`
// output, just like the std `#[derive(Debug)]` does.
let format_members = self.members.iter().filter_map(|member| {
match member {
Member::StartFn(member) => {
let member_ident = &member.ident;
let member_ident_str = member_ident.to_string();
let member_ident_str = member_ident.raw_name();
let member_ty = &member.ty.norm;
Some(quote! {
output.field(
Expand All @@ -24,7 +27,7 @@ impl BuilderGenCtx {
}
Member::Field(member) => {
let member_ident = &member.ident;
let member_ident_str = member_ident.to_string();
let member_ident_str = member_ident.raw_name();
let member_ty = &member.norm_ty;
Some(quote! {
output.field(
Expand Down Expand Up @@ -77,7 +80,7 @@ impl BuilderGenCtx {
let generic_args = &self.generics.args;
let builder_ident = &self.builder_type.ident;
let state_var = &self.state_var;
let builder_ident_str = builder_ident.to_string();
let builder_ident_str = builder_ident.raw_name();

quote! {
#[automatically_derived]
Expand Down
24 changes: 24 additions & 0 deletions bon/tests/integration/builder/raw_idents.rs
Original file line number Diff line number Diff line change
Expand Up @@ -105,3 +105,27 @@ fn test_self_underscore_bug_237() {

assert_eq!(builder.build().self_, 42);
}

// The `r#` prefix is a syntactic escape, not a part of the identifier's name,
// so it must not appear in the `Debug` output, just like it doesn't appear in
// the output of the std `#[derive(Debug)]`.
#[test]
#[allow(non_camel_case_types)]
fn test_derive_debug() {
#[derive(Builder)]
#[builder(builder_type = r#type, state_mod = r#mod, derive(Debug))]
#[allow(dead_code)]
struct Sut {
#[builder(start_fn)]
r#struct: u32,

#[builder(field)]
r#enum: u32,

r#while: u32,
}

let builder = Sut::builder(1).r#while(2);

assert_debug_eq(&builder, expect!["type { struct: 1, enum: 0, while: 2 }"]);
}
Loading