microcad_lang/syntax/identifier/
identifier_list.rs

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