use crate::ast::Program;
use crate::diagnostics::{Result, Span};
use super::analysis_types::{DefinitionType, DependencyType};
use std::collections::{HashMap, HashSet};
#[derive(Debug, Clone)]
pub struct DependencyGraph {
pub nodes: HashMap<String, DependencyNode>,
pub edges: Vec<DependencyEdge>,
pub cycles: Vec<Vec<String>>,
}
#[derive(Debug, Clone)]
pub struct DependencyNode {
pub name: String,
pub definition_type: DefinitionType,
pub location: Option<Span>,
pub dependencies: HashSet<String>,
pub dependents: HashSet<String>,
}
#[derive(Debug, Clone)]
pub struct DependencyEdge {
pub from: String,
pub to: String,
pub dependency_type: DependencyType,
pub location: Option<Span>,
}
#[derive(Debug)]
pub struct DependencyAnalyzer {
_internal: (),
}
impl DependencyGraph {
pub fn new() -> Self {
Self {
nodes: HashMap::new(),
edges: Vec::new(),
cycles: Vec::new(),
}
}
pub fn add_node(&mut self, name: String, def_type: DefinitionType, location: Option<Span>) {
let node = DependencyNode {
name: name.clone(),
definition_type: def_type,
location,
dependencies: HashSet::new(),
dependents: HashSet::new(),
};
self.nodes.insert(name, node);
}
pub fn add_dependency(&mut self, from: String, to: String, dep_type: DependencyType, location: Option<Span>) {
self.edges.push(DependencyEdge {
from: from.clone(),
to: to.clone(),
dependency_type: dep_type,
location,
});
if let Some(from_node) = self.nodes.get_mut(&from) {
from_node.dependencies.insert(to.clone());
}
if let Some(to_node) = self.nodes.get_mut(&to) {
to_node.dependents.insert(from);
}
}
}
impl Default for DependencyGraph {
fn default() -> Self {
Self::new()
}
}
impl DependencyAnalyzer {
pub fn new() -> Self {
Self {
_internal: (),
}
}
pub fn analyze_dependencies(&mut self, _program: &Program) -> Result<DependencyGraph> {
Ok(DependencyGraph::new())
}
}
impl Default for DependencyAnalyzer {
fn default() -> Self {
Self::new()
}
}