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}