Skip to content

Commit 6f907b9

Browse files
authored
fix: Fix struct vis. (#47)
* Use visibility of struct for builder. * Fix format.
1 parent b561a3d commit 6f907b9

File tree

3 files changed

+65
-3
lines changed

3 files changed

+65
-3
lines changed

crates/fundle_macros_impl/src/bundle.rs

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ use std::collections::HashMap;
66
use proc_macro2::{Ident, TokenStream};
77
use quote::quote;
88
use syn::parse::Parser;
9-
use syn::{Attribute, Fields, FieldsNamed, ItemStruct, Path, Type, parse2};
9+
use syn::{Attribute, Fields, FieldsNamed, ItemStruct, Path, Type, Visibility, parse2};
1010

1111
pub fn bundle(_attr: TokenStream, item: TokenStream) -> syn::Result<TokenStream> {
1212
let input: ItemStruct = parse2(item)?;
@@ -77,7 +77,7 @@ pub fn bundle(_attr: TokenStream, item: TokenStream) -> syn::Result<TokenStream>
7777
};
7878

7979
// Generate builder struct
80-
let builder_struct = generate_builder_struct(&builder_name, &field_names, &field_types, &type_params);
80+
let builder_struct = generate_builder_struct(struct_vis, &builder_name, &field_names, &field_types, &type_params);
8181

8282
// Generate Default impl for builder
8383
let default_impl = generate_default_impl(&builder_name, &field_names, &type_params);
@@ -160,6 +160,7 @@ pub fn bundle(_attr: TokenStream, item: TokenStream) -> syn::Result<TokenStream>
160160

161161
#[cfg_attr(test, mutants::skip)]
162162
fn generate_builder_struct(
163+
vis: &Visibility,
163164
builder_name: &Ident,
164165
field_names: &[&Ident],
165166
field_types: &[&Type],
@@ -173,7 +174,7 @@ fn generate_builder_struct(
173174

174175
quote! {
175176
#[allow(non_camel_case_types, dead_code, non_snake_case, clippy::items_after_statements)]
176-
struct #builder_name<#(#type_params),*> {
177+
#vis struct #builder_name<#(#type_params),*> {
177178
#(#builder_fields,)*
178179
_phantom: ::std::marker::PhantomData<(#(#phantom_types),*)>,
179180
}

crates/fundle_macros_impl/tests/bundle_basic.rs

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,3 +15,14 @@ fn basic_expansion() {
1515

1616
insta::assert_snapshot!(expand_fundle_bundle!(item));
1717
}
18+
19+
#[test]
20+
#[cfg_attr(miri, ignore)]
21+
fn pub_expansion() {
22+
let item: ItemStruct = parse_quote! {
23+
#[bundle]
24+
pub struct Foo {}
25+
};
26+
27+
insta::assert_snapshot!(expand_fundle_bundle!(item));
28+
}
Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,50 @@
1+
---
2+
source: crates/fundle_macros_impl/tests/bundle_basic.rs
3+
assertion_line: 27
4+
expression: expand_fundle_bundle!(item)
5+
---
6+
#[allow(non_camel_case_types, non_snake_case)]
7+
pub struct Foo {}
8+
#[allow(non_camel_case_types, non_snake_case, clippy::items_after_statements)]
9+
impl Foo {
10+
pub fn builder() -> FooBuilder {
11+
FooBuilder::default()
12+
}
13+
}
14+
#[allow(non_camel_case_types, dead_code, non_snake_case, clippy::items_after_statements)]
15+
pub struct FooBuilder {
16+
_phantom: ::std::marker::PhantomData<()>,
17+
}
18+
#[allow(non_camel_case_types, non_snake_case, clippy::items_after_statements)]
19+
impl ::std::default::Default for FooBuilder {
20+
fn default() -> Self {
21+
Self {
22+
_phantom: ::std::marker::PhantomData,
23+
}
24+
}
25+
}
26+
impl ::fundle::exports::Exports for Foo {
27+
const NUM_EXPORTS: usize = 0usize;
28+
}
29+
#[allow(non_camel_case_types, non_snake_case, clippy::items_after_statements)]
30+
impl FooBuilder {
31+
pub fn build(self) -> Foo {
32+
Foo {}
33+
}
34+
}
35+
#[allow(unused_macros, snake_case)]
36+
macro_rules! Foo {
37+
(
38+
select($builder_var:ident) => $($forward_type:ident ($forward_field:ident)),*
39+
$(,)?
40+
) => {
41+
{ $(Foo!(verify_field $builder_var $forward_field);)*
42+
#[allow(non_camel_case_types, non_snake_case, clippy::items_after_statements)]
43+
struct Select < 'a, > { builder : & 'a FooBuilder < >, $($forward_type : & 'a
44+
$forward_type,)* } $(#[allow(non_camel_case_types, non_snake_case,
45+
clippy::items_after_statements)] impl < 'a, > ::std::convert::AsRef <
46+
$forward_type > for Select < 'a, > { fn as_ref(& self) -> & $forward_type { self.
47+
$forward_type } })* Select { builder : & $builder_var, $($forward_type :
48+
$builder_var . $forward_field .as_ref().unwrap(),)* } }
49+
};
50+
}

0 commit comments

Comments
 (0)