php_parser_rs/parser/ast/
namespaces.rs

1use schemars::JsonSchema;
2use serde::Deserialize;
3use serde::Serialize;
4
5use crate::lexer::token::Span;
6use crate::node::Node;
7use crate::parser::ast::identifiers::SimpleIdentifier;
8use crate::parser::ast::Statement;
9
10#[derive(Debug, PartialEq, Eq, Clone, Deserialize, Serialize, JsonSchema)]
11
12pub struct UnbracedNamespace {
13    pub start: Span,                // `namespace`
14    pub name: SimpleIdentifier,     // `Foo`
15    pub end: Span,                  // `;`
16    pub statements: Vec<Statement>, // `*statements*`
17}
18
19impl Node for UnbracedNamespace {
20    fn children(&mut self) -> Vec<&mut dyn Node> {
21        let mut children = vec![&mut self.name as &mut dyn Node];
22        children.extend(
23            self.statements
24                .iter_mut()
25                .map(|s| s as &mut dyn Node)
26                .collect::<Vec<&mut dyn Node>>(),
27        );
28        children
29    }
30}
31
32#[derive(Debug, PartialEq, Eq, Clone, Deserialize, Serialize, JsonSchema)]
33
34pub struct BracedNamespace {
35    pub namespace: Span,                // `namespace`
36    pub name: Option<SimpleIdentifier>, // `Foo`
37    pub body: BracedNamespaceBody,      // `{ *statements* }`
38}
39
40impl Node for BracedNamespace {
41    fn children(&mut self) -> Vec<&mut dyn Node> {
42        let mut children: Vec<&mut dyn Node> = vec![];
43        if let Some(name) = &mut self.name {
44            children.push(name);
45        }
46        children.push(&mut self.body);
47        children
48    }
49}
50
51#[derive(Debug, PartialEq, Eq, Clone, Deserialize, Serialize, JsonSchema)]
52
53pub struct BracedNamespaceBody {
54    pub start: Span,                // `{`
55    pub end: Span,                  // `}`
56    pub statements: Vec<Statement>, // `*statements*`
57}
58
59impl Node for BracedNamespaceBody {
60    fn children(&mut self) -> Vec<&mut dyn Node> {
61        self.statements
62            .iter_mut()
63            .map(|s| s as &mut dyn Node)
64            .collect()
65    }
66}
67
68#[derive(Debug, PartialEq, Eq, Clone, Deserialize, Serialize, JsonSchema)]
69#[serde(tag = "type", content = "value")]
70pub enum NamespaceStatement {
71    Unbraced(UnbracedNamespace), // `namespace Foo; *statements*`
72    Braced(BracedNamespace),     // `namespace Foo { *statements* }`
73}
74
75impl Node for NamespaceStatement {
76    fn children(&mut self) -> Vec<&mut dyn Node> {
77        match self {
78            NamespaceStatement::Unbraced(namespace) => vec![namespace],
79            NamespaceStatement::Braced(namespace) => vec![namespace],
80        }
81    }
82}