1use tree_sitter_language::LanguageFn;
19
20extern "C" {
21 fn tree_sitter_sdml() -> *const ();
22}
23
24pub const LANGUAGE: LanguageFn = unsafe { LanguageFn::from_raw(tree_sitter_sdml) };
28
29pub const NODE_TYPES: &str = include_str!("../../src/node-types.json");
33
34pub const GRAMMAR_VERSION: &str = env!("CARGO_PKG_VERSION");
35
36pub const HIGHLIGHTS_QUERY: &str = include_str!("../../queries/highlights.scm");
38
39pub const INJECTIONS_QUERY: &str = include_str!("../../queries/injections.scm");
41
42pub const LOCALS_QUERY: &str = include_str!("../../queries/locals.scm");
44
45pub const TAGS_QUERY: &str = include_str!("../../queries/tags.scm");
47
48#[cfg(test)]
49mod tests {
50 use std::fs;
51
52 pub fn sdml_parser() -> Result<tree_sitter::Parser, tree_sitter::LanguageError> {
53 let mut parser = tree_sitter::Parser::new();
54 parser.set_language(&super::LANGUAGE.into())?;
55 Ok(parser)
56 }
57
58 #[test]
59 fn test_can_load_grammar() {
60 assert!(sdml_parser().is_ok());
61 }
62
63 const MANIFEST_PATH: &str = env!("CARGO_MANIFEST_DIR");
64 const TEST_PATH: &str = "/test/corpus/";
65
66 #[test]
67 fn test_parse_test_corpus() {
68 let mut parser = sdml_parser().expect("could not load grammar");
69
70 for entry in fs::read_dir(format!("{MANIFEST_PATH}{TEST_PATH}")).expect("not a directory?")
71 {
72 let entry = entry.expect("not a directory entry?");
73 let path = entry.path();
74 if path.is_file()
75 && path
76 .extension()
77 .map(|s| s.to_str())
78 .unwrap_or(Some(""))
79 .unwrap()
80 == "sdm"
81 {
82 println!("Parsing test file {path:?}...");
83 let source = fs::read_to_string(path).expect("couldn't read source file");
84 parser
85 .parse(source, None)
86 .expect("Could not parse test file");
87 }
88 }
89 }
90}