Skip to main content

tree_sitter_powershell/
lib.rs

1//! The `powershell` 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-powershell 0.26.3
5//! (<https://github.com/airbus-cert/tree-sitter-powershell>, tag `v0.26.3`). Generated: do
6//! not edit by hand, except the scanner (`scanner.rs`).
7#![forbid(unsafe_code)]
8
9mod lex;
10mod scanner;
11
12use std::sync::LazyLock;
13
14use tree_sitter_language::{LanguageFn, LanguageTables, LexFn, ScannerCreateFn};
15
16/// The grammar's tables, written by the converter from the compiled C grammar.
17static BLOB: &[u8] = include_bytes!("tables.bin");
18
19static TABLES: LazyLock<LanguageTables> = LazyLock::new(decode);
20
21/// The grammar, for `tree_sitter::Language::new(LANGUAGE)` or `LANGUAGE.into()`, as with
22/// tree-sitter-powershell's `tree_sitter_powershell::LANGUAGE`.
23pub const LANGUAGE: LanguageFn = LanguageFn::from_fn(language);
24
25/// The grammar's tables (the C `tree_sitter_powershell()`), decoded on first use.
26pub fn language() -> &'static LanguageTables {
27    &TABLES
28}
29
30fn decode() -> LanguageTables {
31    let keyword_lex_fn: Option<LexFn> = None;
32    let scanner_create: Option<ScannerCreateFn> = Some(scanner::create);
33    LanguageTables::decode(BLOB, lex::ts_lex, keyword_lex_fn, scanner_create)
34}
35
36#[cfg(test)]
37mod tests {
38    #[test]
39    fn language_constant() {
40        let language = tree_sitter::Language::new(super::LANGUAGE);
41        assert_eq!(language, super::LANGUAGE.into());
42        assert!(std::ptr::eq(super::LANGUAGE.tables(), super::language()));
43        let mut parser = tree_sitter::Parser::new();
44        parser.set_language(&language).unwrap();
45        assert!(parser.parse("", None).is_some());
46    }
47
48    #[test]
49    fn tables_decode() {
50        let language = super::language();
51        assert_eq!(language.abi_version, 15);
52        assert_eq!(language.state_count, 2127);
53        assert_eq!(language.symbol_count, 415);
54    }
55}