lang_interpreter/parser/
ast.rs

1pub mod node;
2
3use std::fmt::{Display, Formatter, Write as _};
4pub use node::{
5    Node, NodeData, Visibility, StructMember, StructDefinition, ClassMember, Method,
6    ConditionalNode, Constructor, ClassDefinition, Operator, OperatorType, FunctionDefinition,
7    OperationExpression,
8};
9
10use crate::lexer::CodePosition;
11
12#[derive(Debug, Clone, PartialEq)]
13pub struct AST {
14    nodes: Vec<Node>,
15}
16
17impl AST {
18    pub fn new() -> Self {
19        Self { nodes: Vec::new() }
20    }
21
22    pub fn get_pos(&self) -> CodePosition {
23        if self.nodes.is_empty() {
24            CodePosition::EMPTY
25        }else {
26            self.nodes.first().unwrap().pos().combine(&self.nodes.last().unwrap().pos())
27        }
28    }
29
30    pub fn add_child(&mut self, node: Node) {
31        self.nodes.push(node);
32    }
33
34    pub fn nodes(&self) -> &[Node] {
35        &self.nodes
36    }
37
38    pub(in crate::parser) fn nodes_mut(&mut self) -> &mut Vec<Node> {
39        &mut self.nodes
40    }
41
42    pub fn into_nodes(self) -> Vec<Node> {
43        self.nodes
44    }
45
46    pub fn into_node(self) -> Node {
47        if self.nodes.len() == 1 {
48            self.nodes.into_iter().next().unwrap()
49        }else {
50            Node::new_list_node(self.nodes)
51        }
52    }
53
54    pub fn optimize_ast(&mut self) {
55        Node::optimize_nodes(&mut self.nodes);
56    }
57}
58
59impl Default for AST {
60    fn default() -> Self {
61        Self::new()
62    }
63}
64
65impl Display for AST {
66    fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result {
67        let mut builder = String::new();
68        builder += "AST: Children: {\n";
69        for node in self.nodes.iter() {
70            for token in node.to_string().split("\n") {
71                let _ = writeln!(builder, "\t{token}");
72            }
73        }
74        builder += "}";
75
76        f.write_str(builder.as_str())
77    }
78}
79
80impl From<&[Node]> for AST {
81    fn from(value: &[Node]) -> Self {
82        Self {
83            nodes: Vec::from(value),
84        }
85    }
86}
87
88impl From<&mut [Node]> for AST {
89    fn from(value: &mut [Node]) -> Self {
90        Self {
91            nodes: Vec::from(value),
92        }
93    }
94}
95
96impl <const N: usize> From<&[Node; N]> for AST {
97    fn from(value: &[Node; N]) -> Self {
98        Self {
99            nodes: Vec::from(value),
100        }
101    }
102}
103
104impl <const N: usize> From<&mut [Node; N]> for AST {
105    fn from(value: &mut [Node; N]) -> Self {
106        Self {
107            nodes: Vec::from(value),
108        }
109    }
110}
111
112impl <const N: usize> From<[Node; N]> for AST {
113    fn from(value: [Node; N]) -> Self {
114        Self {
115            nodes: Vec::from(value),
116        }
117    }
118}