php_parser_rs/parser/ast/
utils.rs

1use std::slice::Iter;
2use std::slice::IterMut;
3
4use schemars::JsonSchema;
5use serde::Deserialize;
6use serde::Serialize;
7
8use crate::lexer::token::Span;
9use crate::node::Node;
10
11#[derive(Debug, PartialEq, Eq, Clone, Deserialize, Serialize, JsonSchema)]
12
13pub struct CommaSeparated<T> {
14    pub inner: Vec<T>,
15    pub commas: Vec<Span>, // `,`
16}
17
18impl<T> CommaSeparated<T> {
19    pub fn iter(&self) -> Iter<'_, T> {
20        self.inner.iter()
21    }
22
23    pub fn iter_mut(&mut self) -> IterMut<'_, T> {
24        self.inner.iter_mut()
25    }
26}
27
28impl<T: Node> Node for CommaSeparated<T> {
29    fn children(&mut self) -> Vec<&mut dyn Node> {
30        self.inner.iter_mut().map(|x| x as &mut dyn Node).collect()
31    }
32}
33
34impl<T> IntoIterator for CommaSeparated<T> {
35    type Item = T;
36    type IntoIter = std::vec::IntoIter<Self::Item>;
37
38    fn into_iter(self) -> Self::IntoIter {
39        self.inner.into_iter()
40    }
41}