#![forbid(unsafe_code)]
mod lex;
mod scanner;
use std::sync::LazyLock;
use tree_sitter_language::{LanguageFn, LanguageTables, LexFn, ScannerCreateFn};
static BLOB: &[u8] = include_bytes!("tables.bin");
static TABLES: LazyLock<LanguageTables> = LazyLock::new(decode);
pub const LANGUAGE: LanguageFn = LanguageFn::from_fn(language);
pub fn language() -> &'static LanguageTables {
&TABLES
}
fn decode() -> LanguageTables {
let keyword_lex_fn: Option<LexFn> = Some(lex::ts_lex_keywords);
let scanner_create: Option<ScannerCreateFn> = Some(scanner::create);
LanguageTables::decode(BLOB, lex::ts_lex, keyword_lex_fn, scanner_create)
}
#[cfg(test)]
mod tests {
#[test]
fn language_constant() {
let language = tree_sitter::Language::new(super::LANGUAGE);
assert_eq!(language, super::LANGUAGE.into());
assert!(std::ptr::eq(super::LANGUAGE.tables(), super::language()));
let mut parser = tree_sitter::Parser::new();
parser.set_language(&language).unwrap();
assert!(parser.parse("", None).is_some());
}
#[test]
fn tables_decode() {
let language = super::language();
assert_eq!(language.abi_version, 15);
assert_eq!(language.state_count, 7571);
assert_eq!(language.symbol_count, 280);
}
}