use crate::codegen::naming::dart_tuple_field_identifier;
use crate::core::ir::EnumDef;
use crate::e2e::field_access::VariantAccessorMap;
pub(super) fn build_variant_accessor_map(enums: &[EnumDef]) -> VariantAccessorMap {
let mut map = VariantAccessorMap::default();
for enum_def in enums {
for variant in enum_def.variants.iter().filter(|variant| !variant.binding_excluded) {
let [field] = variant.fields.as_slice() else {
continue;
};
let key = (enum_def.name.clone(), variant.name.clone());
map.narrowing
.insert(key.clone(), format!("{}_{}", enum_def.name, variant.name));
map.payload
.insert(key, dart_tuple_field_identifier(field.name.trim_start_matches('_')));
}
}
tracing::trace!(
ir_metadata_fact = "dart_variants",
metadata_entries = map.narrowing.len()
);
map
}
#[cfg(test)]
#[path = "variant_accessors/tests.rs"]
mod tests;