lang_interpreter/parser/
ast.rs1pub 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}