From c86a4ce4357892bcf8807e36ad846f30a54dea64 Mon Sep 17 00:00:00 2001 From: Veetaha Date: Thu, 7 Nov 2024 14:06:32 +0000 Subject: [PATCH 1/2] Fix raw identifiers in optional/default members --- .../src/builder/builder_gen/setters/mod.rs | 2 +- bon/tests/integration/builder/raw_idents.rs | 81 ++++++++++++++----- 2 files changed, 64 insertions(+), 19 deletions(-) diff --git a/bon-macros/src/builder/builder_gen/setters/mod.rs b/bon-macros/src/builder/builder_gen/setters/mod.rs index 3fbc78ac..b21897b8 100644 --- a/bon-macros/src/builder/builder_gen/setters/mod.rs +++ b/bon-macros/src/builder/builder_gen/setters/mod.rs @@ -529,7 +529,7 @@ impl SettersItems { // to make IDE's "go to definition" work correctly. It's so // important that this doesn't use `format_ident!`, but rather // `syn::Ident::new` to set the span of the `Ident` explicitly. - syn::Ident::new(&format!("maybe_{base_name}"), base_name.span()) + syn::Ident::new(&format!("maybe_{}", base_name.raw_name()), base_name.span()) }); let default = member.config.default.as_deref().and_then(|default| { diff --git a/bon/tests/integration/builder/raw_idents.rs b/bon/tests/integration/builder/raw_idents.rs index 01f530e6..5fb2b081 100644 --- a/bon/tests/integration/builder/raw_idents.rs +++ b/bon/tests/integration/builder/raw_idents.rs @@ -3,34 +3,58 @@ use crate::prelude::*; #[test] #[allow(non_camel_case_types)] -fn struct_case() { - #[derive(Builder)] - struct r#Type { - r#type: u32, +fn test_struct() { + { + #[derive(Builder)] + struct r#Type { + r#type: u32, - #[builder(name = r#while)] - other: u32, - } + #[builder(name = r#while)] + other: u32, + } - let actual = r#Type::builder().r#type(42).r#while(100).build(); + let actual = r#Type::builder().r#type(42).r#while(100).build(); - assert_eq!(actual.r#type, 42); - assert_eq!(actual.other, 100); + assert_eq!(actual.r#type, 42); + assert_eq!(actual.other, 100); - #[derive(Builder)] - #[builder(builder_type = r#type, state_mod = r#mod)] - #[allow(clippy::items_after_statements, dead_code)] - struct Sut { - r#while: u32, + #[derive(Builder)] + #[builder(builder_type = r#type, state_mod = r#mod)] + #[allow(clippy::items_after_statements, dead_code)] + struct Sut { + r#while: u32, + } + + let _actual: r#type = Sut::builder(); + let _actual: r#type = Sut::builder().r#while(32); } + // This is based on the issue https://github.com/elastio/bon/issues/174 + { + { + #[derive(Builder)] + struct Sut { + r#type: Option, + } + + let value = Sut::builder().maybe_type(Some(2)).build(); + assert_eq!(value.r#type, Some(2)); + } + { + #[derive(Builder)] + struct Sut { + #[builder(default)] + r#type: u32, + } - let _actual: r#type = Sut::builder(); - let _actual: r#type = Sut::builder().r#while(32); + let value = Sut::builder().maybe_type(Some(2)).build(); + assert_eq!(value.r#type, 2); + } + } } #[test] #[allow(non_camel_case_types)] -fn fn_case() { +fn test_fn() { { #[builder] fn r#type(r#type: u32, #[builder(name = r#while)] other: u32) { @@ -46,4 +70,25 @@ fn fn_case() { let _: r#type = sut(); } + // This is based on the issue https://github.com/elastio/bon/issues/174 + { + { + #[builder] + fn sut(r#type: Option) -> Option { + r#type + } + + let value = sut().maybe_type(Some(2)).call(); + assert_eq!(value, Some(2)); + } + { + #[builder] + fn sut(#[builder(default)] r#type: u32) -> u32 { + r#type + } + + let value = sut().maybe_type(Some(2)).call(); + assert_eq!(value, 2); + } + } } From 4dae2045153db78fb3839b25426b0d608eb8b2cf Mon Sep 17 00:00:00 2001 From: Veetaha Date: Thu, 7 Nov 2024 14:47:51 +0000 Subject: [PATCH 2/2] Update changelog --- website/src/changelog.md | 1 + 1 file changed, 1 insertion(+) diff --git a/website/src/changelog.md b/website/src/changelog.md index fa1062f8..19d75447 100644 --- a/website/src/changelog.md +++ b/website/src/changelog.md @@ -89,6 +89,7 @@ All the breaking changes are very unlikely to actually break your code that was ### Fixed - Fix `#[cfg/cfg_attr()]` not being expanded when used on function arguments with doc comments or other attributes. +- Fix raw identifiers in optional/default members ([#175](https://github.com/elastio/bon/pull/175)) ### Other