use crate::codegen::ir::hir::flat::component::HirFlatComponent;
use crate::codegen::ir::hir::flat::constant::HirFlatConstant;
use crate::codegen::ir::hir::flat::function::HirFlatFunction;
use crate::codegen::ir::hir::flat::struct_or_enum::{HirFlatEnum, HirFlatStruct};
use crate::codegen::ir::hir::flat::trait_impl::HirFlatTraitImpl;
use crate::codegen::ir::hir::flat::traits::HirFlatTrait;
use crate::codegen::ir::hir::flat::type_alias::HirFlatTypeAlias;
use crate::codegen::ir::misc::skip::IrSkip;
use crate::utils::basic_code::general_code::GeneralDartCode;
use crate::utils::namespace::NamespacedName;
#[derive(Debug, Clone, Default, serde::Serialize)]
pub(crate) struct HirFlatPack {
pub functions: Vec<HirFlatFunction>,
pub enums: Vec<HirFlatEnum>,
pub structs: Vec<HirFlatStruct>,
pub traits: Vec<HirFlatTrait>,
pub trait_impls: Vec<HirFlatTraitImpl>,
pub constants: Vec<HirFlatConstant>,
pub types: Vec<HirFlatTypeAlias>,
pub existing_handler: Option<NamespacedName>,
pub extra_rust_output_code: String,
pub extra_dart_output_code: GeneralDartCode,
pub skips: Vec<IrSkip>,
}
impl HirFlatPack {
pub(crate) fn visit_components_mut(&mut self, visitor: impl HirFlatPackComponentVisitor) {
visitor.visit(&mut self.functions);
visitor.visit(&mut self.enums);
visitor.visit(&mut self.structs);
visitor.visit(&mut self.traits);
visitor.visit(&mut self.trait_impls);
visitor.visit(&mut self.constants);
visitor.visit(&mut self.types);
}
}
pub(crate) trait HirFlatPackComponentVisitor {
fn visit<SK: Ord, T: HirFlatComponent<SK>>(&self, items: &mut Vec<T>);
}
#[cfg(test)]
mod tests {
use super::*;
use std::sync::atomic::{AtomicUsize, Ordering};
use std::sync::Arc;
struct CountingVisitor(Arc<AtomicUsize>);
impl HirFlatPackComponentVisitor for CountingVisitor {
fn visit<SK: Ord, T: HirFlatComponent<SK>>(&self, _items: &mut Vec<T>) {
self.0.fetch_add(1, Ordering::Relaxed);
}
}
#[test]
fn visits_all_component_collections() {
let mut pack = HirFlatPack::default();
let visits = Arc::new(AtomicUsize::new(0));
let visitor = CountingVisitor(Arc::clone(&visits));
pack.visit_components_mut(visitor);
assert_eq!(visits.load(Ordering::Relaxed), 7);
}
}