From ed0bde6b91821e9a930df3f6ddeff6f4eef9a3be Mon Sep 17 00:00:00 2001 From: Wilfred Hughes Date: Wed, 9 Mar 2022 23:52:31 -0800 Subject: [PATCH] Adding support for PHP --- CHANGELOG.md | 2 ++ README.md | 1 + build.rs | 5 +++++ manual/src/introduction.md | 1 + manual/src/upstream_parsers.md | 1 + src/guess_language.rs | 2 ++ src/tree_sitter_parser.rs | 15 +++++++++++++++ 7 files changed, 27 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 13919a561..fe2a6b8a3 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,6 +4,8 @@ Difftastic now requires Rust 1.56 to build. ### Parsing +Added support for PHP. + Fixed handling of `<` `>` delimiters in C++ and Rust. ### Diffing diff --git a/README.md b/README.md index df09e43bf..6229d90bc 100644 --- a/README.md +++ b/README.md @@ -69,6 +69,7 @@ Difftastic supports the following languages: * JavaScript (and JSX) * JSON * OCaml +* PHP * Python * Ruby * Rust diff --git a/build.rs b/build.rs index 50adca9cf..c9f2305aa 100644 --- a/build.rs +++ b/build.rs @@ -134,6 +134,11 @@ fn main() { src_dir: "vendor/tree-sitter-ocaml-src/interface/src", extra_files: vec!["scanner.cc"], }, + TreeSitterParser { + name: "tree-sitter-php", + src_dir: "vendor/tree-sitter-php-src", + extra_files: vec!["scanner.cc"], + }, TreeSitterParser { name: "tree-sitter-python", src_dir: "vendor/tree-sitter-python-src", diff --git a/manual/src/introduction.md b/manual/src/introduction.md index 8adcf48b2..858cdabdb 100644 --- a/manual/src/introduction.md +++ b/manual/src/introduction.md @@ -19,6 +19,7 @@ tool that understands syntax. It supports the following languages: * JavaScript (and JSX) * JSON * OCaml +* PHP * Python * Ruby * Rust diff --git a/manual/src/upstream_parsers.md b/manual/src/upstream_parsers.md index b7bb66361..ca9d079db 100644 --- a/manual/src/upstream_parsers.md +++ b/manual/src/upstream_parsers.md @@ -19,6 +19,7 @@ Difftastic uses the following tree-sitter parsers: | JavaScript, JSX | [tree-sitter/tree-sitter-javascript](https://github.com/tree-sitter/tree-sitter-javascript) | | JSON | [tree-sitter/tree-sitter-json](https://github.com/tree-sitter/tree-sitter-json) | | OCaml | [tree-sitter/tree-sitter-ocaml](https://github.com/tree-sitter/tree-sitter-ocaml) | +| PHP | [tree-sitter/tree-sitter-php](https://github.com/tree-sitter/tree-sitter-php) | | Python | [tree-sitter/tree-sitter-python](https://github.com/tree-sitter/tree-sitter-python) | | Ruby | [tree-sitter/tree-sitter-ruby](https://github.com/tree-sitter/tree-sitter-ruby) | | Rust | [tree-sitter/tree-sitter-rust](https://github.com/tree-sitter/tree-sitter-rust) ([forked](https://github.com/Wilfred/tree-sitter-rust)) | diff --git a/src/guess_language.rs b/src/guess_language.rs index 8bfbc5220..8cd7ca2f1 100644 --- a/src/guess_language.rs +++ b/src/guess_language.rs @@ -35,6 +35,7 @@ pub enum Language { Jsx, OCaml, OCamlInterface, + Php, Python, Ruby, Rust, @@ -190,6 +191,7 @@ fn from_extension(extension: &OsStr) -> Option { "json" => Some(Json), "ml" => Some(OCaml), "mli" => Some(OCamlInterface), + "php" => Some(Php), "py" | "py3" | "pyi" | "bzl" => Some(Python), "rb" | "builder" | "spec" | "rake" => Some(Ruby), "rs" => Some(Rust), diff --git a/src/tree_sitter_parser.rs b/src/tree_sitter_parser.rs index 24114b7ab..d98387fea 100644 --- a/src/tree_sitter_parser.rs +++ b/src/tree_sitter_parser.rs @@ -59,6 +59,7 @@ extern "C" { fn tree_sitter_json() -> ts::Language; fn tree_sitter_ocaml() -> ts::Language; fn tree_sitter_ocaml_interface() -> ts::Language; + fn tree_sitter_php() -> ts::Language; fn tree_sitter_python() -> ts::Language; fn tree_sitter_ruby() -> ts::Language; fn tree_sitter_rust() -> ts::Language; @@ -333,6 +334,20 @@ pub fn from_language(language: guess::Language) -> TreeSitterConfig { .unwrap(), } } + Php => { + let language = unsafe { tree_sitter_php() }; + TreeSitterConfig { + name: "PHP", + language, + atom_nodes: (vec!["string"]).into_iter().collect(), + delimiter_tokens: (vec![("(", ")"), ("[", "]"), ("{", "}")]), + highlight_query: ts::Query::new( + language, + include_str!("../vendor/highlights/php.scm"), + ) + .unwrap(), + } + } Python => { let language = unsafe { tree_sitter_python() }; TreeSitterConfig {