use runmat_hir::FunctionId;
use serde::{de, Deserialize, Deserializer, Serialize, Serializer};
use std::collections::HashMap;
use crate::{MirDiagnostic, MirLocalId};
use super::MirLocalFact;
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, Default)]
pub struct AnalysisStore {
pub mir_locals: HashMap<MirLocalKey, MirLocalFact>,
pub diagnostics: Vec<MirDiagnostic>,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
pub struct MirLocalKey {
pub function: FunctionId,
pub local: MirLocalId,
}
impl Serialize for MirLocalKey {
fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
where
S: Serializer,
{
serializer.serialize_str(&format!("{}:{}", self.function.0, self.local.0))
}
}
impl<'de> Deserialize<'de> for MirLocalKey {
fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
where
D: Deserializer<'de>,
{
let value = String::deserialize(deserializer)?;
let Some((function, local)) = value.split_once(':') else {
return Err(de::Error::custom(
"expected MIR local key as function:local",
));
};
Ok(Self {
function: FunctionId(function.parse().map_err(de::Error::custom)?),
local: MirLocalId(local.parse().map_err(de::Error::custom)?),
})
}
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
pub(super) enum InitFact {
Unassigned,
MaybeAssigned,
DefinitelyAssigned,
}