php_parser_rs/parser/ast/
arguments.rs

1use std::slice::Iter;
2
3use schemars::JsonSchema;
4use serde::Deserialize;
5use serde::Serialize;
6
7use crate::lexer::token::Span;
8use crate::node::Node;
9use crate::parser::ast::comments::CommentGroup;
10use crate::parser::ast::identifiers::SimpleIdentifier;
11use crate::parser::ast::Expression;
12
13#[derive(Debug, PartialEq, Eq, Clone, Deserialize, Serialize, JsonSchema)]
14pub struct PositionalArgument {
15    pub comments: CommentGroup,
16    pub ellipsis: Option<Span>, // `...`
17    pub value: Expression,      // `$var`
18}
19
20impl Node for PositionalArgument {
21    fn children(&mut self) -> Vec<&mut dyn Node> {
22        vec![&mut self.value]
23    }
24}
25
26#[derive(Debug, PartialEq, Eq, Clone, Deserialize, Serialize, JsonSchema)]
27pub struct NamedArgument {
28    pub comments: CommentGroup,
29    pub name: SimpleIdentifier, // `foo`
30    pub colon: Span,            // `:`
31    pub ellipsis: Option<Span>, // `...`
32    pub value: Expression,      // `$var`
33}
34
35impl Node for NamedArgument {
36    fn children(&mut self) -> Vec<&mut dyn Node> {
37        vec![&mut self.name, &mut self.value]
38    }
39}
40
41#[derive(Debug, PartialEq, Eq, Clone, Deserialize, Serialize, JsonSchema)]
42#[serde(tag = "type", content = "value")]
43pub enum Argument {
44    Positional(PositionalArgument),
45    Named(NamedArgument),
46}
47
48impl Node for Argument {
49    fn children(&mut self) -> Vec<&mut dyn Node> {
50        match self {
51            Argument::Positional(argument) => vec![argument],
52            Argument::Named(argument) => vec![argument],
53        }
54    }
55}
56
57#[derive(Debug, PartialEq, Eq, Clone, Deserialize, Serialize, JsonSchema)]
58
59pub struct ArgumentList {
60    pub comments: CommentGroup,
61    pub left_parenthesis: Span,   // `(`
62    pub arguments: Vec<Argument>, // `$var`, `...$var`, `foo: $var`, `foo: ...$var`
63    pub right_parenthesis: Span,  // `)`
64}
65
66impl ArgumentList {
67    pub fn iter(&self) -> Iter<'_, Argument> {
68        self.arguments.iter()
69    }
70}
71
72impl IntoIterator for ArgumentList {
73    type Item = Argument;
74    type IntoIter = std::vec::IntoIter<Self::Item>;
75
76    fn into_iter(self) -> Self::IntoIter {
77        self.arguments.into_iter()
78    }
79}
80
81impl Node for ArgumentList {
82    fn children(&mut self) -> Vec<&mut dyn Node> {
83        self.arguments
84            .iter_mut()
85            .map(|a| a as &mut dyn Node)
86            .collect()
87    }
88}
89
90#[derive(Debug, PartialEq, Eq, Clone, Deserialize, Serialize, JsonSchema)]
91
92pub struct SingleArgument {
93    pub comments: CommentGroup,
94    pub left_parenthesis: Span,  // `(`
95    pub argument: Argument,      // `$var`
96    pub right_parenthesis: Span, // `)`
97}
98
99impl Node for SingleArgument {
100    fn children(&mut self) -> Vec<&mut dyn Node> {
101        vec![&mut self.argument]
102    }
103}
104
105#[derive(Debug, PartialEq, Eq, Clone, Deserialize, Serialize, JsonSchema)]
106
107pub struct ArgumentPlaceholder {
108    pub comments: CommentGroup,
109    pub left_parenthesis: Span,  // `(`
110    pub ellipsis: Span,          // `...`
111    pub right_parenthesis: Span, // `)`
112}