1#![forbid(unsafe_code)]
7
8mod lex;
9mod scanner;
10
11use std::sync::LazyLock;
12
13use tree_sitter_language::{LanguageFn, LanguageTables, LexFn, ScannerCreateFn};
14
15static BLOB: &[u8] = include_bytes!("tables.bin");
17
18static TABLES: LazyLock<LanguageTables> = LazyLock::new(decode);
19
20pub const LANGUAGE: LanguageFn = LanguageFn::from_fn(language);
23
24pub fn language() -> &'static LanguageTables {
26 &TABLES
27}
28
29fn decode() -> LanguageTables {
30 let keyword_lex_fn: Option<LexFn> = Some(lex::ts_lex_keywords);
31 let scanner_create: Option<ScannerCreateFn> = Some(scanner::create);
32 LanguageTables::decode(BLOB, lex::ts_lex, keyword_lex_fn, scanner_create)
33}
34
35#[cfg(test)]
36mod tests {
37 #[test]
38 fn language_constant() {
39 let language = tree_sitter::Language::new(super::LANGUAGE);
40 assert_eq!(language, super::LANGUAGE.into());
41 assert!(std::ptr::eq(super::LANGUAGE.tables(), super::language()));
42 let mut parser = tree_sitter::Parser::new();
43 parser.set_language(&language).unwrap();
44 assert!(parser.parse("", None).is_some());
45 }
46
47 #[test]
48 fn tables_decode() {
49 let language = super::language();
50 assert_eq!(language.abi_version, 15);
51 assert_eq!(language.state_count, 7571);
52 assert_eq!(language.symbol_count, 280);
53 }
54}