tree_sitter_php/
lib.rs

1//! This crate provides PHP language support for the [tree-sitter][] parsing library.
2//!
3//! Typically, you will use the [LANGUAGE_PHP][] constant to add this language to a
4//! tree-sitter [Parser][], and then use the parser to parse some code:
5//!
6//! ```
7//! use tree_sitter::Parser;
8//!
9//! let code = r#"
10//! <?php
11//!   echo "Hello, World!";
12//! ?>
13//! "#;
14//! let mut parser = Parser::new();
15//! let language = tree_sitter_php::LANGUAGE_PHP;
16//! parser
17//!     .set_language(&language.into())
18//!     .expect("Error loading PHP parser");
19//! let tree = parser.parse(code, None).unwrap();
20//! assert!(!tree.root_node().has_error());
21//! ```
22//!
23//! [Parser]: https://docs.rs/tree-sitter/*/tree_sitter/struct.Parser.html
24//! [tree-sitter]: https://tree-sitter.github.io/
25
26use tree_sitter_language::LanguageFn;
27
28extern "C" {
29    fn tree_sitter_php() -> *const ();
30    fn tree_sitter_php_only() -> *const ();
31}
32
33/// The tree-sitter [`LanguageFn`] for PHP.
34///
35/// [LanguageFn]: https://docs.rs/tree-sitter-language/*/tree_sitter_language/struct.LanguageFn.html
36pub const LANGUAGE_PHP: LanguageFn = unsafe { LanguageFn::from_raw(tree_sitter_php) };
37
38/// The tree-sitter [`LanguageFn`] for PHP-Only.
39///
40/// [LanguageFn]: https://docs.rs/tree-sitter-language/*/tree_sitter_language/struct.LanguageFn.html
41pub const LANGUAGE_PHP_ONLY: LanguageFn = unsafe { LanguageFn::from_raw(tree_sitter_php_only) };
42
43/// The content of the [`node-types.json`][] file for this grammar.
44///
45/// [`node-types.json`]: https://tree-sitter.github.io/tree-sitter/using-parsers#static-node-types
46pub const PHP_NODE_TYPES: &str = include_str!("../../php/src/node-types.json");
47pub const PHP_ONLY_NODE_TYPES: &str = include_str!("../../php_only/src/node-types.json");
48
49/// The syntax highlighting query for PHP.
50pub const HIGHLIGHTS_QUERY: &str = include_str!("../../queries/highlights.scm");
51
52/// The injection query for PHP.
53pub const INJECTIONS_QUERY: &str = include_str!("../../queries/injections.scm");
54
55/// The symbol tagging query for PHP.
56pub const TAGS_QUERY: &str = include_str!("../../queries/tags.scm");
57
58#[cfg(test)]
59mod tests {
60    #[test]
61    fn test_php_grammar() {
62        let mut parser = tree_sitter::Parser::new();
63        parser
64            .set_language(&super::LANGUAGE_PHP.into())
65            .expect("Error loading PHP parser");
66
67        let code = r#"<?php echo "Hello, World!";"#;
68
69        let tree = parser.parse(code, None).unwrap();
70        let root = tree.root_node();
71        assert!(!root.has_error());
72    }
73
74    #[test]
75    fn test_php_only_grammar() {
76        let mut parser = tree_sitter::Parser::new();
77        parser
78            .set_language(&super::LANGUAGE_PHP_ONLY.into())
79            .expect("Error loading PHP-Only parser");
80
81        let code = r#"echo "Hello, World!";"#;
82
83        let tree = parser.parse(code, None).unwrap();
84        let root = tree.root_node();
85        assert!(!root.has_error());
86    }
87}