in starlark_derive/src/freeze.rs [193:251]
fn freeze_struct(name: &Ident, data: &DataStruct) -> syn::Result<TokenStream> {
let res = match data.fields {
Fields::Named(ref fields) => {
let xs = fields
.named
.iter()
.map(|f| {
let name = &f.ident;
let res = if is_identity(&f.attrs)? {
quote_spanned! {f.span() =>
#name: self.#name,
}
} else {
quote_spanned! {f.span() =>
#name: starlark::values::Freeze::freeze(self.#name, freezer)?,
}
};
syn::Result::Ok(res)
})
.collect::<Result<Vec<_>, _>>()?;
quote! {
#name {
#(#xs)*
}
}
}
Fields::Unnamed(ref fields) => {
let xs = fields
.unnamed
.iter()
.enumerate()
.map(|(i, f)| {
let i = Index::from(i);
let res = if is_identity(&f.attrs)? {
quote_spanned! {f.span() =>
self.#i,
}
} else {
quote_spanned! {f.span() => starlark::values::Freeze::freeze(self.#i, freezer)?,}
};
syn::Result::Ok(res)
})
.collect::<Result<Vec<_>, _>>()?;
quote! {
#name (
#(#xs)*
)
}
}
Fields::Unit => {
quote!()
}
};
Ok(res)
}