1pub mod ast;
2mod parser;
3mod rules;
4pub mod syntax_kind;
5mod syntax_node;
6mod utils;
7
8pub use utils::*;
9
10#[cfg(target_arch = "wasm32")]
11use js_sys::{Array, Object, Reflect};
12#[cfg(target_arch = "wasm32")]
13use rowan::TextSize;
14use syntax_kind::SyntaxKind;
15#[cfg(target_arch = "wasm32")]
16use wasm_bindgen::{prelude::wasm_bindgen, JsValue};
17
18pub use syntax_node::*;
19
20pub fn parse_query(input: &str) -> SyntaxNode {
21 SyntaxNode::new_root(parser::parse_text(input, parser::TopEntryPoint::QueryUnit))
22}
23
24pub fn parse_update(input: &str) -> SyntaxNode {
25 SyntaxNode::new_root(parser::parse_text(input, parser::TopEntryPoint::UpdateUnit))
26}
27
28#[cfg(test)]
29mod tests;
30
31#[cfg(target_arch = "wasm32")]
32#[wasm_bindgen]
33pub fn get_parse_tree(input: &str, offset: u32) -> JsValue {
34 use parser::TopEntryPoint;
35
36 let root = SyntaxNode::new_root(parser::parse_text(input, TopEntryPoint::QueryUnit));
37 build_js_tree(&root, TextSize::new(offset))
38}
39
40#[cfg(target_arch = "wasm32")]
41fn build_js_tree(node: &SyntaxNode, offset: TextSize) -> JsValue {
42 let obj = Object::new();
43 Reflect::set(
44 &obj,
45 &JsValue::from_str("kind"),
46 &JsValue::from_str(&format!("{:?}", node.kind())),
47 )
48 .unwrap();
49 Reflect::set(&obj, &JsValue::from_str("type"), &JsValue::from_str("node")).unwrap();
50 Reflect::set(
51 &obj,
52 &JsValue::from_str("active"),
53 &JsValue::from_bool(node.text_range().contains(offset)),
54 )
55 .unwrap();
56
57 let children = Array::from_iter(node.children_with_tokens().filter_map(|child| match child {
58 rowan::NodeOrToken::Node(node) => Some(build_js_tree(&node, offset)),
59 rowan::NodeOrToken::Token(token) => {
60 let token_obj = Object::new();
61 Reflect::set(
62 &token_obj,
63 &JsValue::from_str("kind"),
64 &JsValue::from_str(&format!("{:?}", token.kind())),
65 )
66 .unwrap();
67 Reflect::set(
68 &token_obj,
69 &JsValue::from_str("type"),
70 &JsValue::from_str("token"),
71 )
72 .unwrap();
73 Reflect::set(
74 &token_obj,
75 &JsValue::from_str("text"),
76 &JsValue::from_str(token.text()),
77 )
78 .unwrap();
79 Reflect::set(
80 &token_obj,
81 &JsValue::from_str("active"),
82 &JsValue::from_bool(token.text_range().contains(offset)),
83 )
84 .unwrap();
85 Some(token_obj.into())
86 }
87 }));
88 Reflect::set(&obj, &JsValue::from_str("children"), &children.into()).unwrap();
89 obj.into()
90}