use std::collections::HashMap;
use super::types::{IrEnum, IrFunction, IrImpl, IrLet, IrStruct, IrTrait};
use super::IrImport;
use super::{EnumId, FunctionId, StructId, TraitId};
mod core;
mod prelude;
#[derive(Clone, Debug, Default, serde::Serialize, serde::Deserialize)]
pub struct IrModule {
pub structs: Vec<IrStruct>,
pub traits: Vec<IrTrait>,
pub enums: Vec<IrEnum>,
pub impls: Vec<IrImpl>,
pub lets: Vec<IrLet>,
pub functions: Vec<IrFunction>,
pub imports: Vec<IrImport>,
#[serde(default, skip_serializing_if = "Vec::is_empty")]
pub modules: Vec<IrModuleNode>,
#[serde(default, skip_serializing_if = "Vec::is_empty")]
pub file_table: Vec<std::path::PathBuf>,
#[serde(skip)]
struct_names: HashMap<String, StructId>,
#[serde(skip)]
trait_names: HashMap<String, TraitId>,
#[serde(skip)]
enum_names: HashMap<String, EnumId>,
#[serde(skip)]
function_names: HashMap<String, FunctionId>,
#[serde(skip)]
let_names: HashMap<String, usize>,
}
#[expect(
clippy::exhaustive_structs,
reason = "IR types are constructed directly by consumer code"
)]
#[derive(Clone, Debug, Default, serde::Serialize, serde::Deserialize)]
pub struct IrModuleNode {
pub name: String,
#[serde(default, skip_serializing_if = "Vec::is_empty")]
pub structs: Vec<StructId>,
#[serde(default, skip_serializing_if = "Vec::is_empty")]
pub traits: Vec<TraitId>,
#[serde(default, skip_serializing_if = "Vec::is_empty")]
pub enums: Vec<EnumId>,
#[serde(default, skip_serializing_if = "Vec::is_empty")]
pub functions: Vec<FunctionId>,
#[serde(default, skip_serializing_if = "Vec::is_empty")]
pub modules: Vec<Self>,
}