Skip to main content

microcad_lang/syntax/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 crate::syntax::*;
5use derive_more::{Deref, DerefMut};
6use microcad_lang_base::{Refer, SrcRef, SrcReferrer};
7
8/// A list of identifiers
9///
10/// Used e.g. for multiple variable declarations.
11/// Cannot contain duplicates.
12#[derive(Default, Clone, PartialEq, Deref, DerefMut)]
13pub struct IdentifierList(pub Refer<Vec<Identifier>>);
14
15impl IdentifierList {
16    /// Create new identifier list
17    pub fn new(identifiers: Vec<Identifier>, src_ref: SrcRef) -> Self {
18        Self(Refer::new(identifiers, src_ref))
19    }
20}
21
22impl SrcReferrer for IdentifierList {
23    fn src_ref(&self) -> SrcRef {
24        self.0.src_ref()
25    }
26}
27
28impl FromIterator<Identifier> for IdentifierList {
29    fn from_iter<T: IntoIterator<Item = Identifier>>(iter: T) -> Self {
30        let v: Vec<_> = iter.into_iter().collect();
31        let src_ref = SrcRef::merge_all(v.iter());
32        Self(Refer::new(v, src_ref))
33    }
34}
35
36impl std::fmt::Display for IdentifierList {
37    fn fmt(&self, f: &mut std::fmt::Formatter) -> std::fmt::Result {
38        let mut sorted = self.0.clone();
39        sorted.sort();
40        write!(
41            f,
42            "{}",
43            sorted
44                .iter()
45                .map(|id| id.to_string())
46                .collect::<Vec<_>>()
47                .join(",")
48        )
49    }
50}
51
52impl std::fmt::Debug for IdentifierList {
53    fn fmt(&self, f: &mut std::fmt::Formatter) -> std::fmt::Result {
54        let mut sorted = self.0.clone();
55        sorted.sort();
56        write!(
57            f,
58            "{}",
59            sorted
60                .iter()
61                .map(|id| format!("{id:?}"))
62                .collect::<Vec<_>>()
63                .join(",")
64        )
65    }
66}
67
68impl std::iter::IntoIterator for IdentifierList {
69    type Item = Identifier;
70    type IntoIter = std::vec::IntoIter<Self::Item>;
71
72    fn into_iter(self) -> Self::IntoIter {
73        self.0.into_iter()
74    }
75}