Skip to main content

microcad_lang/lower/ir/call/
argument_list.rs

1// Copyright © 2025-2026 The µcad authors <info@microcad.xyz>
2// SPDX-License-Identifier: AGPL-3.0-or-later
3
4//! List of arguments syntax entities.
5
6use crate::lower::ir;
7
8use derive_more::{Deref, DerefMut};
9use microcad_lang_base::{Identifier, OrdMap, Refer};
10use microcad_lang_proc_macros::SrcReferrer;
11
12/// *Ordered map* of arguments in a [`Call`].
13#[derive(Clone, Debug, Default, Deref, DerefMut, PartialEq, SrcReferrer)]
14pub struct ArgumentList(pub Refer<OrdMap<Identifier, ir::Argument>>);
15
16impl std::fmt::Display for ArgumentList {
17    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
18        write!(f, "{}", {
19            let mut v = self
20                .0
21                .value
22                .iter()
23                .map(|p| p.to_string())
24                .collect::<Vec<_>>();
25            v.sort();
26            v.join(", ")
27        })
28    }
29}
30
31impl std::ops::Index<&Identifier> for ArgumentList {
32    type Output = ir::Argument;
33
34    fn index(&self, name: &Identifier) -> &Self::Output {
35        self.0.get(name).expect("key not found")
36    }
37}
38
39impl std::ops::Index<usize> for ArgumentList {
40    type Output = ir::Argument;
41
42    fn index(&self, idx: usize) -> &Self::Output {
43        &self.0.value[idx]
44    }
45}