use crate::{
entities::{ClassEntity, FunctionEntity, ModuleEntity, TraitEntity},
relationships::{CallRelation, ImplementationRelation, ImportRelation, InheritanceRelation},
};
use std::path::PathBuf;
#[derive(Debug, Default, Clone)]
pub struct CodeIR {
pub file_path: PathBuf,
pub module: Option<ModuleEntity>,
pub functions: Vec<FunctionEntity>,
pub classes: Vec<ClassEntity>,
pub traits: Vec<TraitEntity>,
pub calls: Vec<CallRelation>,
pub imports: Vec<ImportRelation>,
pub inheritance: Vec<InheritanceRelation>,
pub implementations: Vec<ImplementationRelation>,
}
impl CodeIR {
pub fn new(file_path: PathBuf) -> Self {
Self {
file_path,
..Default::default()
}
}
pub fn entity_count(&self) -> usize {
self.functions.len()
+ self.classes.len()
+ self.traits.len()
+ if self.module.is_some() { 1 } else { 0 }
}
pub fn relationship_count(&self) -> usize {
self.calls.len() + self.imports.len() + self.inheritance.len() + self.implementations.len()
}
pub fn set_module(&mut self, module: ModuleEntity) {
self.module = Some(module);
}
pub fn add_function(&mut self, func: FunctionEntity) {
self.functions.push(func);
}
pub fn add_class(&mut self, class: ClassEntity) {
self.classes.push(class);
}
pub fn add_trait(&mut self, trait_entity: TraitEntity) {
self.traits.push(trait_entity);
}
pub fn add_call(&mut self, call: CallRelation) {
self.calls.push(call);
}
pub fn add_import(&mut self, import: ImportRelation) {
self.imports.push(import);
}
pub fn add_inheritance(&mut self, inheritance: InheritanceRelation) {
self.inheritance.push(inheritance);
}
pub fn add_implementation(&mut self, implementation: ImplementationRelation) {
self.implementations.push(implementation);
}
}