ll_sparql_parser/
lib.rs

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}