Skip to main content

runmat_mir/
stmt.rs

1use crate::{MirLocalId, MirPlace, MirRvalue};
2use runmat_hir::{
3    AssignmentCreationPolicy, AssignmentShapePolicy, EnvironmentEffect, PlaceMutationKind,
4    RequestedOutputCount, Span, WorkspaceEffect,
5};
6use serde::{Deserialize, Serialize};
7
8#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
9pub struct MirStmt {
10    pub kind: MirStmtKind,
11    pub span: Span,
12}
13
14#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
15pub enum MirStmtKind {
16    Assign {
17        place: MirPlace,
18        value: MirRvalue,
19    },
20    MultiAssign {
21        targets: MirOutputTargetList,
22        value: MirRvalue,
23    },
24    Expr(MirRvalue),
25    PlaceMutation(MirPlaceMutation),
26    WorkspaceEffect {
27        effect: WorkspaceEffect,
28        bindings: Vec<MirLocalId>,
29    },
30    EnvironmentEffect(EnvironmentEffect),
31}
32
33#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
34pub struct MirPlaceMutation {
35    pub place: MirPlace,
36    pub kind: PlaceMutationKind,
37    pub creation_policy: AssignmentCreationPolicy,
38    pub shape_policy: AssignmentShapePolicy,
39}
40
41#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
42pub struct MirOutputTargetList {
43    pub targets: Vec<MirOutputTarget>,
44    pub requested_outputs: RequestedOutputCount,
45}
46
47impl MirOutputTargetList {
48    pub fn validate_fixed_arity(&self, context: &str) -> Result<usize, String> {
49        let expected = self.targets.len();
50        let count = self.requested_outputs.fixed_count();
51        if count != expected {
52            return Err(format!(
53                "{context} output target count mismatch: requested {count}, targets {expected}"
54            ));
55        }
56        Ok(count)
57    }
58}
59
60#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
61pub enum MirOutputTarget {
62    Place(MirPlace),
63    Discard,
64}