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}