bon_macros/
privatize.rs

1use crate::util::prelude::*;
2use syn::parse::{ParseStream, Parser};
3
4pub(crate) fn privatize_fn(input: TokenStream) -> TokenStream {
5    transform
6        .parse2(input)
7        .unwrap_or_else(syn::Error::into_compile_error)
8}
9
10fn transform(input: ParseStream<'_>) -> syn::Result<TokenStream> {
11    let outer_attrs = syn::Attribute::parse_outer(input)?;
12    let vis: syn::Visibility = input.parse()?;
13
14    let mut sig: syn::Signature = input.parse()?;
15    privatize_fn_name(&mut sig);
16
17    let rest: TokenStream = input.parse()?;
18
19    Ok(quote::quote! {
20        #(#outer_attrs)* #vis #sig #rest
21    })
22}
23
24pub(crate) fn privatize_fn_name(sig: &mut syn::Signature) {
25    // We don't generate a random name to ensure reproducible builds. Some of
26    // `bon`'s users use custom build systems where the output of the macro is
27    // cached and the stability of the output is depended upon.
28    sig.ident = quote::format_ident!("__orig_{}", sig.ident.raw_name());
29}