Skip to content

Commit

Permalink
fix: remove default function reusing
Browse files Browse the repository at this point in the history
  • Loading branch information
bytedream committed Dec 2, 2024
1 parent 6eddcf3 commit 985eca3
Showing 1 changed file with 17 additions and 29 deletions.
46 changes: 17 additions & 29 deletions src/expand.rs
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@ use quote::quote;
use syn::{parse_quote, ItemStruct};

pub(crate) fn expand_struct(mut item: ItemStruct) -> proc_macro::TokenStream {
let mut inline_fns: Vec<(String, TokenStream, TokenStream)> = vec![];
let mut inline_fns: Vec<TokenStream> = vec![];

for (i, field) in item.fields.iter_mut().enumerate() {
for (j, attr) in field.attrs.iter_mut().enumerate() {
Expand All @@ -14,31 +14,21 @@ pub(crate) fn expand_struct(mut item: ItemStruct) -> proc_macro::TokenStream {

let default: TokenStream = attr.parse_args().unwrap();

// we check here if a function with the exact same return value already exists. if so,
// this function gets used.
let fn_name_lit = if let Some((fn_name_lit, _, _)) = inline_fns
.iter()
.find(|(_, def, _)| def.to_string() == default.to_string())
{
fn_name_lit.clone()
} else {
let fn_name_lit = format!("__serde_inline_default_{}_{}", item.ident, i);
let fn_name_ident = Ident::new(&fn_name_lit, Span::call_site());
let mut return_type = field.ty.clone();

// replaces most lifetimes with 'static
type_lifetimes_to_static(&mut return_type);

let inline_fn = quote! {
#[doc(hidden)]
#[allow(non_snake_case)]
fn #fn_name_ident () -> #return_type {
#default
}
};
inline_fns.push((fn_name_lit.clone(), default, inline_fn));
fn_name_lit
};
let fn_name_lit = format!("__serde_inline_default_{}_{}", item.ident, i);
let fn_name_ident = Ident::new(&fn_name_lit, Span::call_site());
let mut return_type = field.ty.clone();

// replaces most lifetimes with 'static
type_lifetimes_to_static(&mut return_type);

inline_fns.push(quote! {
#[doc(hidden)]
#[allow(non_snake_case)]
fn #fn_name_ident () -> #return_type {
#default
}
});

field.attrs.remove(j);
field
.attrs
Expand All @@ -47,10 +37,8 @@ pub(crate) fn expand_struct(mut item: ItemStruct) -> proc_macro::TokenStream {
}
}

let real_inline_fns: Vec<TokenStream> =
inline_fns.into_iter().map(|(_, _, func)| func).collect();
let expanded = quote! {
#( #real_inline_fns )*
#( #inline_fns )*

#item
};
Expand Down

0 comments on commit 985eca3

Please sign in to comment.