runmat-mir 0.5.2

Mid-level IR and analysis scaffolding for RunMat
Documentation
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,
}