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 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(); 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}