Skip to main content

runmat_mir/
call.rs

1use crate::{AsyncBehaviorFact, MirOperand};
2use runmat_builtins::{
3    BuiltinEffects, BuiltinEnvironmentEffect, BuiltinPurity, BuiltinSemanticKind,
4    BuiltinWorkspaceEffect,
5};
6use runmat_hir::{
7    CallSyntax, CallableFallbackPolicy, CallableIdentity, RequestedOutputCount, Span,
8};
9use serde::{Deserialize, Serialize};
10
11#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
12pub struct MirCall {
13    pub callee: MirCallee,
14    pub args: Vec<MirCallArg>,
15    pub arg_spans: Vec<Span>,
16    pub syntax: CallSyntax,
17    pub requested_outputs: RequestedOutputCount,
18    pub fallback_policy: CallableFallbackPolicy,
19    #[serde(default)]
20    pub workspace_first_name: Option<runmat_hir::SymbolName>,
21    #[serde(default)]
22    pub bare_identifier: bool,
23    pub async_behavior: AsyncBehaviorFact,
24    pub effects: BuiltinEffects,
25    pub workspace_effect: Option<BuiltinWorkspaceEffect>,
26    pub environment_effect: Option<BuiltinEnvironmentEffect>,
27    pub purity: BuiltinPurity,
28    pub semantic_kind: BuiltinSemanticKind,
29}
30
31#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
32pub enum MirCallee {
33    Static(CallableIdentity),
34    SuperConstructor {
35        current_class: String,
36        super_class: String,
37    },
38    SuperMethod {
39        current_class: String,
40        super_class: String,
41        method: String,
42    },
43    Dynamic(MirOperand),
44}
45
46#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
47pub enum MirCallArg {
48    Single(MirOperand),
49    Expansion {
50        base: MirOperand,
51        indices: Vec<MirOperand>,
52        expand_all: bool,
53    },
54}
55
56impl MirCallArg {
57    pub fn operand(&self) -> &MirOperand {
58        match self {
59            MirCallArg::Single(operand) => operand,
60            MirCallArg::Expansion { base, .. } => base,
61        }
62    }
63}