Skip to main content

microcad_lang/lower/ir/identifier/
identifier_list.rs

1// Copyright © 2024-2026 The µcad authors <info@microcad.xyz>
2// SPDX-License-Identifier: AGPL-3.0-or-later
3
4use derive_more::{Deref, DerefMut};
5use microcad_lang_base::{Identifier, Refer, SrcRef};
6use microcad_lang_proc_macros::SrcReferrer;
7
8/// A list of identifiers
9///
10/// Used e.g. for multiple variable declarations.
11/// Cannot contain duplicates.
12#[derive(Default, Debug, Clone, PartialEq, Deref, DerefMut, SrcReferrer)]
13pub struct IdentifierList(pub Refer<Vec<Identifier>>);
14
15impl FromIterator<Identifier> for IdentifierList {
16    fn from_iter<T: IntoIterator<Item = Identifier>>(iter: T) -> Self {
17        let v: Vec<_> = iter.into_iter().collect();
18        let src_ref = SrcRef::merge_all(v.iter());
19        Self(Refer::new(v, src_ref))
20    }
21}
22
23impl std::fmt::Display for IdentifierList {
24    fn fmt(&self, f: &mut std::fmt::Formatter) -> std::fmt::Result {
25        let mut sorted = self.0.clone();
26        sorted.sort();
27        write!(
28            f,
29            "{}",
30            sorted
31                .iter()
32                .map(|id| id.to_string())
33                .collect::<Vec<_>>()
34                .join(",")
35        )
36    }
37}
38
39impl std::iter::IntoIterator for IdentifierList {
40    type Item = Identifier;
41    type IntoIter = std::vec::IntoIter<Self::Item>;
42
43    fn into_iter(self) -> Self::IntoIter {
44        self.0.into_iter()
45    }
46}