Add support for Hack

html_output
Wilfred Hughes 2022-02-02 23:22:01 +07:00
parent 22813808fe
commit 43605bd5e8
10 changed files with 41 additions and 1 deletions

@ -5,6 +5,8 @@
Fixed an issue with changes being ignored in OCaml's `{||}` string Fixed an issue with changes being ignored in OCaml's `{||}` string
literals. literals.
Added support for Hack programs.
### Display ### Display
Fixed an issue where larger additions were not lined up with removals. Fixed an issue where larger additions were not lined up with removals.

@ -65,6 +65,7 @@ Difftastic supports the following languages:
* Elixir * Elixir
* Emacs Lisp * Emacs Lisp
* Go * Go
* Hack
* Haskell * Haskell
* Java * Java
* JavaScript (and JSX) * JavaScript (and JSX)

@ -104,6 +104,11 @@ fn main() {
src_dir: "vendor/tree-sitter-go-src", src_dir: "vendor/tree-sitter-go-src",
extra_files: vec![], extra_files: vec![],
}, },
TreeSitterParser {
name: "tree-sitter-hack",
src_dir: "vendor/tree-sitter-hack-src",
extra_files: vec!["scanner.cc"],
},
TreeSitterParser { TreeSitterParser {
name: "tree-sitter-haskell", name: "tree-sitter-haskell",
src_dir: "vendor/tree-sitter-haskell-src", src_dir: "vendor/tree-sitter-haskell-src",

@ -13,6 +13,7 @@ tool that understands syntax. It supports the following languages:
* Elixir * Elixir
* Emacs Lisp * Emacs Lisp
* Go * Go
* Hack
* Haskell * Haskell
* Java * Java
* JavaScript (and JSX) * JavaScript (and JSX)

@ -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) | | 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) | | 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) | | 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) | | 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) | | 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) | | JavaScript, JSX | [tree-sitter/tree-sitter-javascript](https://github.com/tree-sitter/tree-sitter-javascript) |

@ -0,0 +1,5 @@
<?hh
function foo(): vec<?int> {
return vec[1, null];
}

@ -0,0 +1,5 @@
<?hh
function foo(): vec<int> {
return vec[1];
}

@ -28,6 +28,7 @@ pub enum Language {
Elixir, Elixir,
EmacsLisp, EmacsLisp,
Go, Go,
Hack,
Haskell, Haskell,
Java, Java,
JavaScript, JavaScript,
@ -76,6 +77,7 @@ fn from_shebang(src: &str) -> Option<Language> {
"lisp" | "sbc" | "ccl" | "clisp" | "ecl" => return Some(CommonLisp), "lisp" | "sbc" | "ccl" | "clisp" | "ecl" => return Some(CommonLisp),
"elixir" => return Some(Elixir), "elixir" => return Some(Elixir),
"runghc" | "runhaskell" | "runhugs" => return Some(Haskell), "runghc" | "runhaskell" | "runhugs" => return Some(Haskell),
"hhvm" => return Some(Hack),
"chakra" | "d8" | "gjs" | "js" | "node" | "nodejs" | "qjs" | "rhino" | "v8" "chakra" | "d8" | "gjs" | "js" | "node" | "nodejs" | "qjs" | "rhino" | "v8"
| "v8-shell" => return Some(JavaScript), | "v8-shell" => return Some(JavaScript),
"ocaml" | "ocamlrun" | "ocamlscript" => return Some(OCaml), "ocaml" | "ocamlrun" | "ocamlscript" => return Some(OCaml),
@ -85,7 +87,12 @@ fn from_shebang(src: &str) -> Option<Language> {
_ => {} _ => {}
} }
} }
}; }
// Hack can use <?hh in files with a .php extension.
if first_line.starts_with("<?hh") {
return Some(Hack);
}
} }
None None
@ -130,6 +137,7 @@ fn from_extension(extension: &OsStr) -> Option<Language> {
"el" => Some(EmacsLisp), "el" => Some(EmacsLisp),
"ex" | "exs" => Some(Elixir), "ex" | "exs" => Some(Elixir),
"go" => Some(Go), "go" => Some(Go),
"hack" | "hck" => Some(Hack),
"hs" => Some(Haskell), "hs" => Some(Haskell),
"java" => Some(Java), "java" => Some(Java),
"cjs" | "js" | "mjs" => Some(JavaScript), "cjs" | "js" | "mjs" => Some(JavaScript),

@ -53,6 +53,7 @@ extern "C" {
fn tree_sitter_elisp() -> ts::Language; fn tree_sitter_elisp() -> ts::Language;
fn tree_sitter_elixir() -> ts::Language; fn tree_sitter_elixir() -> ts::Language;
fn tree_sitter_go() -> ts::Language; fn tree_sitter_go() -> ts::Language;
fn tree_sitter_hack() -> ts::Language;
fn tree_sitter_haskell() -> ts::Language; fn tree_sitter_haskell() -> ts::Language;
fn tree_sitter_java() -> ts::Language; fn tree_sitter_java() -> ts::Language;
fn tree_sitter_javascript() -> ts::Language; fn tree_sitter_javascript() -> ts::Language;
@ -239,6 +240,16 @@ pub fn from_language(language: guess::Language) -> TreeSitterConfig {
.unwrap(), .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 => { Haskell => {
let language = unsafe { tree_sitter_haskell() }; let language = unsafe { tree_sitter_haskell() };
TreeSitterConfig { TreeSitterConfig {

@ -0,0 +1 @@
tree-sitter-hack/src