yul_parser/
parse.rs

1use crate::SyntaxNode;
2use rowan::{GreenNode, NodeOrToken};
3
4#[derive(Clone)]
5pub struct Parse {
6    green_node: GreenNode,
7}
8
9impl Parse {
10    pub fn new(green_node: GreenNode) -> Self {
11        Self { green_node }
12    }
13
14    pub fn syntax_node(&self) -> SyntaxNode {
15        SyntaxNode::new_root(self.green_node.clone())
16    }
17
18    /// Recover source code from syntax tree.
19    pub fn unparse(&self) -> String {
20        let mut result = String::with_capacity(self.green_node.text_len().into());
21        unparse_recurse(&mut result, &self.green_node);
22        result
23    }
24
25    pub fn debug_tree(&self) -> String {
26        let mut formatted = format!("{:#?}", self);
27        formatted.pop(); // Cut trailing newline
28        formatted
29    }
30}
31
32impl core::fmt::Debug for Parse {
33    fn fmt(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result {
34        self.syntax_node().fmt(f)
35    }
36}
37
38impl serde::Serialize for Parse {
39    fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
40    where
41        S: serde::Serializer,
42    {
43        self.syntax_node().serialize(serializer)
44    }
45}
46
47fn unparse_recurse(result: &mut String, node: &GreenNode) {
48    for child in node.children() {
49        match child {
50            NodeOrToken::Node(node) => unparse_recurse(result, node),
51            NodeOrToken::Token(token) => result.push_str(token.text().as_str()),
52        }
53    }
54}