use crate::ir::IRType;
use std::collections::HashMap;
pub struct LocalInfo {
pub index: u32,
pub var_type: IRType,
}
pub struct FunctionInfo {
pub index: u32,
#[allow(dead_code)]
pub param_types: Vec<IRType>,
pub return_type: IRType,
}
pub struct ClassInfo {
pub name: String,
pub methods: HashMap<String, u32>, pub field_offsets: HashMap<String, u64>, pub instance_size: u32, }
pub struct CompilationContext {
pub locals_map: HashMap<String, LocalInfo>,
pub local_count: u32,
pub function_map: HashMap<String, FunctionInfo>,
pub class_map: HashMap<String, ClassInfo>,
pub temp_local: u32, }
impl CompilationContext {
pub fn new() -> Self {
let mut ctx = CompilationContext {
locals_map: HashMap::new(),
local_count: 0,
function_map: HashMap::new(),
class_map: HashMap::new(),
temp_local: 0,
};
ctx.temp_local = ctx.local_count;
ctx.local_count += 3;
ctx
}
pub fn add_local(&mut self, name: &str, var_type: IRType) -> u32 {
let idx = self.local_count;
self.locals_map.insert(
name.to_string(),
LocalInfo {
index: idx,
var_type,
},
);
self.local_count += 1;
idx
}
pub fn get_local_info(&self, name: &str) -> Option<&LocalInfo> {
self.locals_map.get(name)
}
pub fn get_local_index(&self, name: &str) -> Option<u32> {
self.locals_map.get(name).map(|info| info.index)
}
pub fn add_function(
&mut self,
name: &str,
index: u32,
param_types: Vec<IRType>,
return_type: IRType,
) {
self.function_map.insert(
name.to_string(),
FunctionInfo {
index,
param_types,
return_type,
},
);
}
pub fn get_function_info(&self, name: &str) -> Option<&FunctionInfo> {
self.function_map.get(name)
}
pub fn add_class(&mut self, class_info: ClassInfo) {
self.class_map.insert(class_info.name.clone(), class_info);
}
pub fn get_class_info(&self, name: &str) -> Option<&ClassInfo> {
self.class_map.get(name)
}
}