use std::collections::BTreeSet;
use std::fmt;
use crate::registry_core::declaration::{EvidenceKind, SourceLocation};
#[derive(Clone, Debug, PartialEq, Eq)]
pub struct MirCall {
pub caller: String,
pub callee: String,
pub mir_line: usize,
}
#[derive(Clone, Debug, PartialEq, Eq)]
pub struct MirLocal {
pub function: String,
pub name: String,
pub type_name: String,
pub mir_line: usize,
}
pub type CallEvidence = EvidenceKind;
#[derive(Clone, Debug, PartialEq, Eq)]
pub struct CallRelation {
pub caller: String,
pub callee: String,
pub evidence: EvidenceKind,
pub source: Option<SourceLocation>,
pub mir_line: Option<usize>,
pub caller_frame: Option<u64>,
pub callee_frame: Option<u64>,
}
impl CallRelation {
pub fn from_symbols(
caller: impl Into<String>,
callee: impl Into<String>,
evidence: EvidenceKind,
) -> Self {
Self {
caller: caller.into(),
callee: callee.into(),
evidence,
source: None,
mir_line: None,
caller_frame: None,
callee_frame: None,
}
}
}
#[derive(Clone, Debug, Default, PartialEq, Eq)]
pub struct MirGraph {
pub functions: BTreeSet<String>,
pub calls: Vec<MirCall>,
pub locals: Vec<MirLocal>,
}
#[derive(Clone, Debug, PartialEq, Eq)]
pub struct MirParseError {
pub line: usize,
pub message: String,
}
impl fmt::Display for MirParseError {
fn fmt(&self, formatter: &mut fmt::Formatter<'_>) -> fmt::Result {
write!(formatter, "MIR graph line {}: {}", self.line, self.message)
}
}
impl std::error::Error for MirParseError {}