use crate::ast::{ParamConvention, Visibility};
use crate::ir::{IrField, IrStruct, ResolvedType};
pub(super) fn synthesize_env_struct(
name: String,
captures: &[(crate::ir::BindingId, String, ParamConvention, ResolvedType)],
) -> IrStruct {
let fields = captures
.iter()
.map(|(_bid, field_name, convention, ty)| IrField {
name: field_name.clone(),
ty: ty.clone(),
mutable: matches!(convention, ParamConvention::Mut),
optional: false,
default: None,
doc: None,
convention: *convention,
span: crate::ir::IrSpan::default(),
})
.collect();
IrStruct {
name,
visibility: Visibility::Private,
traits: Vec::new(),
fields,
generic_params: Vec::new(),
doc: Some(
"Auto-generated capture environment for a lifted closure. Produced by `ClosureConversionPass`."
.to_string(),
),
span: crate::ir::IrSpan::default(),
}
}