tree_sitter_objectscript/lib.rs
1//! This crate provides Objectscript language support for the [tree-sitter][] parsing library.
2//!
3//! Typically, you will use the [LANGUAGE_OBJECTSCRIPT] function to add this language to a
4//! tree-sitter [Parser][], and then use the parser to parse some code:
5//!
6//! ```
7//! let code = r#"
8//! Class Demo.Test
9//! {
10//! ClassMethod Main()
11//! {
12//! set x = 42
13//! }
14//! }
15//! "#;
16//! let mut parser = tree_sitter::Parser::new();
17//! let language = tree_sitter_objectscript::LANGUAGE_OBJECTSCRIPT;
18//! parser
19//! .set_language(&language.into())
20//! .expect("Error loading Objectscript parser");
21//! let tree = parser.parse(code, None).unwrap();
22//! assert!(!tree.root_node().has_error());
23//! ```
24//! ```
25//! let code = r#"
26//! if 1 set x = 3 set set = 3
27//! if 1 { set x = 3 } else { w 2 }
28//! set x = 3
29//! "#;
30//!
31//! let mut parser = tree_sitter::Parser::new();
32//! let language = tree_sitter_objectscript::LANGUAGE_OBJECTSCRIPT_CORE;
33//! parser
34//! .set_language(&language.into())
35//! .expect("Error loading Objectscript Core parser");
36//! let tree = parser.parse(code, None).unwrap();
37//! assert!(!tree.root_node().has_error());
38//!
39//! ```
40//!
41//! ```
42//! let code = r#"
43//! $CASE($P($ZE,">",1)_">", "<INTERRUPT>":"KeyboardInterrupt", "<SYNTAX>":"TypeError", :"RuntimeError")
44//! "#;
45//!
46//! let mut parser = tree_sitter::Parser::new();
47//! let language = tree_sitter_objectscript::LANGUAGE_OBJECTSCRIPT_EXPR;
48//! parser
49//! .set_language(&language.into())
50//! .expect("Error loading Objectscript Expr parser");
51//! let tree = parser.parse(code, None).unwrap();
52//! assert!(!tree.root_node().has_error());
53//!
54//! ```
55//! [Language]: https://docs.rs/tree-sitter/*/tree_sitter/struct.Language.html
56//! [language func]: fn.language.html
57//! [Parser]: https://docs.rs/tree-sitter/*/tree_sitter/struct.Parser.html
58//! [tree-sitter]: https://tree-sitter.github.io/
59
60use tree_sitter_language::LanguageFn;
61
62extern "C" {
63 fn tree_sitter_objectscript() -> *const ();
64 fn tree_sitter_objectscript_core() -> *const ();
65 fn tree_sitter_objectscript_expr() -> *const ();
66
67}
68
69/// The tree-sitter [`LanguageFn`] for ObjectScript.
70///
71/// [LanguageFn]: https://docs.rs/tree-sitter-language/*/tree_sitter_language/struct.LanguageFn.html
72pub const LANGUAGE_OBJECTSCRIPT: LanguageFn = unsafe { LanguageFn::from_raw(tree_sitter_objectscript) };
73pub const LANGUAGE_OBJECTSCRIPT_CORE: LanguageFn = unsafe { LanguageFn::from_raw(tree_sitter_objectscript_core) };
74pub const LANGUAGE_OBJECTSCRIPT_EXPR: LanguageFn = unsafe { LanguageFn::from_raw(tree_sitter_objectscript_expr) };
75
76/// The content of the [`node-types.json`][] file for this grammar.
77///
78/// [`node-types.json`]: https://tree-sitter.github.io/tree-sitter/using-parsers#static-node-types
79pub const OBJECTSCRIPT_NODE_TYPES: &str = include_str!("../../udl/src/node-types.json");
80pub const OBJECTSCRIPT_CORE_NODE_TYPES: &str = include_str!("../../core/src/node-types.json");
81pub const OBJECTSCRIPT_EXPR_NODE_TYPES: &str = include_str!("../../expr/src/node-types.json");
82
83/// The syntax highlighting query for ObjectScript.
84pub const OBJECTSCRIPT_HIGHLIGHTS_QUERY: &str = concat!(
85include_str!("../../expr/queries/highlights.scm"), "\n",
86include_str!("../../core/queries/highlights.scm"), "\n",
87include_str!("../../udl/queries/highlights.scm"),
88);
89
90/// The syntax highlighting query for ObjectScript Core.
91pub const OBJECTSCRIPT_CORE_HIGHLIGHTS_QUERY: &str = concat!(
92include_str!("../../expr/queries/highlights.scm"), "\n",
93include_str!("../../core/queries/highlights.scm")
94);
95
96/// The syntax highlighting query for ObjectScript Expr.
97pub const OBJECTSCRIPT_EXPR_HIGHLIGHTS_QUERY: &str = "../../expr/queries/highlights.scm";
98
99/// Injections for ObjectScript.
100pub const OBJECTSCRIPT_INJECTIONS_QUERY: &str = concat!(
101include_str!("../../core/queries/injections.scm"), "\n",
102include_str!("../../udl/queries/injections.scm"),
103);
104
105/// Injections for ObjectScript Core.
106pub const OBJECTSCRIPT_CORE_INJECTIONS_QUERY: &str = "../../core/queries/injections.scm";
107
108/// Indentation for ObjectScript.
109pub const INDENTS_QUERY: &str = concat!(
110include_str!("../../core/queries/indents.scm"), "\n",
111include_str!("../../udl/queries/indents.scm"),
112);
113
114/// Indentation for ObjectScript Core.
115pub const OBJECTSCRIPT_CORE_INDENTS_QUERY: &str = "../../core/queries/indents.scm";
116
117#[cfg(test)]
118mod tests {
119 #[test]
120 fn test_can_load_objectscript_grammar() {
121 let mut parser = tree_sitter::Parser::new();
122 parser
123 .set_language(&super::LANGUAGE_OBJECTSCRIPT.into())
124 .expect("Error loading Objectscript parser");
125 }
126
127 #[test]
128 fn test_can_load_objectscript_core_grammar() {
129 let mut parser = tree_sitter::Parser::new();
130 parser
131 .set_language(&super::LANGUAGE_OBJECTSCRIPT_CORE.into())
132 .expect("Error loading Objectscript Core parser");
133 }
134
135 #[test]
136 fn test_can_load_objectscript_expr_grammar() {
137 let mut parser = tree_sitter::Parser::new();
138 parser
139 .set_language(&super::LANGUAGE_OBJECTSCRIPT_EXPR.into())
140 .expect("Error loading Objectscript Expr parser");
141 }
142}