Skip to main content

tree_sitter_bash/
lib.rs

1//! The `bash` tree-sitter grammar for the ported runtime: its tables (decoded from
2//! `tables.bin`) and lexer (`lex.rs`), converted from the grammar's `src/parser.c`.
3//!
4//! Upstream: tree-sitter-bash 0.25.1 (<https://github.com/tree-sitter/tree-sitter-bash>,
5//! tag `v0.25.1`). Generated: do not edit by hand, except the scanner (`scanner.rs`).
6#![forbid(unsafe_code)]
7
8mod lex;
9mod scanner;
10
11use std::sync::LazyLock;
12
13use tree_sitter_language::{LanguageFn, LanguageTables, LexFn, ScannerCreateFn};
14
15/// The grammar's tables, written by the converter from the compiled C grammar.
16static BLOB: &[u8] = include_bytes!("tables.bin");
17
18static TABLES: LazyLock<LanguageTables> = LazyLock::new(decode);
19
20/// The grammar, for `tree_sitter::Language::new(LANGUAGE)` or `LANGUAGE.into()`, as with
21/// tree-sitter-bash's `tree_sitter_bash::LANGUAGE`.
22pub const LANGUAGE: LanguageFn = LanguageFn::from_fn(language);
23
24/// The grammar's tables (the C `tree_sitter_bash()`), decoded on first use.
25pub 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}