From 43605bd5e838fff812eca851cd7e914b5e7877c7 Mon Sep 17 00:00:00 2001 From: Wilfred Hughes Date: Wed, 2 Feb 2022 23:22:01 -0800 Subject: [PATCH] Add support for Hack --- CHANGELOG.md | 2 ++ README.md | 1 + build.rs | 5 +++++ manual/src/introduction.md | 1 + manual/src/upstream_parsers.md | 1 + sample_files/hack_after.php | 5 +++++ sample_files/hack_before.php | 5 +++++ src/guess_language.rs | 10 +++++++++- src/tree_sitter_parser.rs | 11 +++++++++++ vendor/tree-sitter-hack-src | 1 + 10 files changed, 41 insertions(+), 1 deletion(-) create mode 100644 sample_files/hack_after.php create mode 100644 sample_files/hack_before.php create mode 120000 vendor/tree-sitter-hack-src diff --git a/CHANGELOG.md b/CHANGELOG.md index 0a348a5e4..a57ac5e22 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -5,6 +5,8 @@ Fixed an issue with changes being ignored in OCaml's `{||}` string literals. +Added support for Hack programs. + ### Display Fixed an issue where larger additions were not lined up with removals. diff --git a/README.md b/README.md index 806353864..1195f23e3 100644 --- a/README.md +++ b/README.md @@ -65,6 +65,7 @@ Difftastic supports the following languages: * Elixir * Emacs Lisp * Go +* Hack * Haskell * Java * JavaScript (and JSX) diff --git a/build.rs b/build.rs index 50adca9cf..32c46b4b7 100644 --- a/build.rs +++ b/build.rs @@ -104,6 +104,11 @@ fn main() { src_dir: "vendor/tree-sitter-go-src", extra_files: vec![], }, + TreeSitterParser { + name: "tree-sitter-hack", + src_dir: "vendor/tree-sitter-hack-src", + extra_files: vec!["scanner.cc"], + }, TreeSitterParser { name: "tree-sitter-haskell", src_dir: "vendor/tree-sitter-haskell-src", diff --git a/manual/src/introduction.md b/manual/src/introduction.md index a820aa677..f035d2152 100644 --- a/manual/src/introduction.md +++ b/manual/src/introduction.md @@ -13,6 +13,7 @@ tool that understands syntax. It supports the following languages: * Elixir * Emacs Lisp * Go +* Hack * Haskell * Java * JavaScript (and JSX) diff --git a/manual/src/upstream_parsers.md b/manual/src/upstream_parsers.md index b7bb66361..a51376c3c 100644 --- a/manual/src/upstream_parsers.md +++ b/manual/src/upstream_parsers.md @@ -14,6 +14,7 @@ Difftastic uses the following tree-sitter parsers: | Elixir | [elixir-lang/tree-sitter-elixir](https://github.com/elixir-lang/tree-sitter-elixir) | | Emacs Lisp | [wilfred/tree-sitter-elisp](https://github.com/Wilfred/tree-sitter-elisp) | | Go | [tree-sitter/tree-sitter-go](https://github.com/tree-sitter/tree-sitter-go) | +| Hack | [slackhq/tree-sitter-hack](https://github.com/slackhq/tree-sitter-hack) | | Haskell | [tree-sitter/tree-sitter-haskell](https://github.com/tree-sitter/tree-sitter-haskell) | | Java | [tree-sitter/tree-sitter-java](https://github.com/tree-sitter/tree-sitter-java) | | JavaScript, JSX | [tree-sitter/tree-sitter-javascript](https://github.com/tree-sitter/tree-sitter-javascript) | diff --git a/sample_files/hack_after.php b/sample_files/hack_after.php new file mode 100644 index 000000000..3347e8f0d --- /dev/null +++ b/sample_files/hack_after.php @@ -0,0 +1,5 @@ + { + return vec[1, null]; +} diff --git a/sample_files/hack_before.php b/sample_files/hack_before.php new file mode 100644 index 000000000..bd254982a --- /dev/null +++ b/sample_files/hack_before.php @@ -0,0 +1,5 @@ + { + return vec[1]; +} diff --git a/src/guess_language.rs b/src/guess_language.rs index eeb9bca52..e720caa00 100644 --- a/src/guess_language.rs +++ b/src/guess_language.rs @@ -28,6 +28,7 @@ pub enum Language { Elixir, EmacsLisp, Go, + Hack, Haskell, Java, JavaScript, @@ -76,6 +77,7 @@ fn from_shebang(src: &str) -> Option { "lisp" | "sbc" | "ccl" | "clisp" | "ecl" => return Some(CommonLisp), "elixir" => return Some(Elixir), "runghc" | "runhaskell" | "runhugs" => return Some(Haskell), + "hhvm" => return Some(Hack), "chakra" | "d8" | "gjs" | "js" | "node" | "nodejs" | "qjs" | "rhino" | "v8" | "v8-shell" => return Some(JavaScript), "ocaml" | "ocamlrun" | "ocamlscript" => return Some(OCaml), @@ -85,7 +87,12 @@ fn from_shebang(src: &str) -> Option { _ => {} } } - }; + } + + // Hack can use Option { "el" => Some(EmacsLisp), "ex" | "exs" => Some(Elixir), "go" => Some(Go), + "hack" | "hck" => Some(Hack), "hs" => Some(Haskell), "java" => Some(Java), "cjs" | "js" | "mjs" => Some(JavaScript), diff --git a/src/tree_sitter_parser.rs b/src/tree_sitter_parser.rs index 1cf8f33c6..b2ce0879b 100644 --- a/src/tree_sitter_parser.rs +++ b/src/tree_sitter_parser.rs @@ -53,6 +53,7 @@ extern "C" { fn tree_sitter_elisp() -> ts::Language; fn tree_sitter_elixir() -> ts::Language; fn tree_sitter_go() -> ts::Language; + fn tree_sitter_hack() -> ts::Language; fn tree_sitter_haskell() -> ts::Language; fn tree_sitter_java() -> ts::Language; fn tree_sitter_javascript() -> ts::Language; @@ -239,6 +240,16 @@ pub fn from_language(language: guess::Language) -> TreeSitterConfig { .unwrap(), } } + Hack => { + let language = unsafe { tree_sitter_hack() }; + TreeSitterConfig { + name: "Hack", + language: unsafe { tree_sitter_hack() }, + atom_nodes: (vec![]).into_iter().collect(), + delimiter_tokens: (vec![("[", "]"), ("(", ")"), ("{", "}")]), + highlight_query: ts::Query::new(language, "").unwrap(), + } + } Haskell => { let language = unsafe { tree_sitter_haskell() }; TreeSitterConfig { diff --git a/vendor/tree-sitter-hack-src b/vendor/tree-sitter-hack-src new file mode 120000 index 000000000..3fb56767f --- /dev/null +++ b/vendor/tree-sitter-hack-src @@ -0,0 +1 @@ +tree-sitter-hack/src \ No newline at end of file