Skip to main content

tree_sitter_php_only/
lib.rs

1//! The `php_only` 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-php 0.25.1 (<https://github.com/tree-sitter/tree-sitter-php>, tag
5//! `v0.25.1`). Generated: do not edit by hand (the scanner is a copy of php's
6//! `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()`.
22/// `mesquite_php` re-exports it as `tree_sitter_php::LANGUAGE_PHP_ONLY`, as in
23/// tree-sitter-php.
24pub const LANGUAGE: LanguageFn = LanguageFn::from_fn(language);
25
26/// The grammar's tables (the C `tree_sitter_php_only()`), decoded on first use.
27pub fn language() -> &'static LanguageTables {
28    &TABLES
29}
30
31fn decode() -> LanguageTables {
32    let keyword_lex_fn: Option<LexFn> = Some(lex::ts_lex_keywords);
33    let scanner_create: Option<ScannerCreateFn> = Some(scanner::create);
34    LanguageTables::decode(BLOB, lex::ts_lex, keyword_lex_fn, scanner_create)
35}
36
37#[cfg(test)]
38mod tests {
39    #[test]
40    fn language_constant() {
41        let language = tree_sitter::Language::new(super::LANGUAGE);
42        assert_eq!(language, super::LANGUAGE.into());
43        assert!(std::ptr::eq(super::LANGUAGE.tables(), super::language()));
44        let mut parser = tree_sitter::Parser::new();
45        parser.set_language(&language).unwrap();
46        assert!(parser.parse("", None).is_some());
47    }
48
49    #[test]
50    fn tables_decode() {
51        let language = super::language();
52        assert_eq!(language.abi_version, 15);
53        assert_eq!(language.state_count, 3385);
54        assert_eq!(language.symbol_count, 428);
55    }
56}