runmat-mir 0.5.2

Mid-level IR and analysis scaffolding for RunMat
Documentation
use crate::{AsyncBehaviorFact, MirOperand};
use runmat_builtins::{
    BuiltinEffects, BuiltinEnvironmentEffect, BuiltinPurity, BuiltinSemanticKind,
    BuiltinWorkspaceEffect,
};
use runmat_hir::{
    CallSyntax, CallableFallbackPolicy, CallableIdentity, RequestedOutputCount, Span,
};
use serde::{Deserialize, Serialize};

#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
pub struct MirCall {
    pub callee: MirCallee,
    pub args: Vec<MirCallArg>,
    pub arg_spans: Vec<Span>,
    pub syntax: CallSyntax,
    pub requested_outputs: RequestedOutputCount,
    pub fallback_policy: CallableFallbackPolicy,
    #[serde(default)]
    pub workspace_first_name: Option<runmat_hir::SymbolName>,
    #[serde(default)]
    pub bare_identifier: bool,
    pub async_behavior: AsyncBehaviorFact,
    pub effects: BuiltinEffects,
    pub workspace_effect: Option<BuiltinWorkspaceEffect>,
    pub environment_effect: Option<BuiltinEnvironmentEffect>,
    pub purity: BuiltinPurity,
    pub semantic_kind: BuiltinSemanticKind,
}

#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
pub enum MirCallee {
    Static(CallableIdentity),
    SuperConstructor {
        current_class: String,
        super_class: String,
    },
    SuperMethod {
        current_class: String,
        super_class: String,
        method: String,
    },
    Dynamic(MirOperand),
}

#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
pub enum MirCallArg {
    Single(MirOperand),
    Expansion {
        base: MirOperand,
        indices: Vec<MirOperand>,
        expand_all: bool,
    },
}

impl MirCallArg {
    pub fn operand(&self) -> &MirOperand {
        match self {
            MirCallArg::Single(operand) => operand,
            MirCallArg::Expansion { base, .. } => base,
        }
    }
}