diff --git a/CHANGELOG.md b/CHANGELOG.md index e550835d6..bb3bcf2c3 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,7 +2,7 @@ ### Parsing -Added SQL support. +Added Hacklang and SQL support. Updated to the latest tree-sitter parsers for C#, Dart, Elm, Gleam, Haskell, HCL, Java, JSON, OCaml, PHP, Python, Ruby, Scala and diff --git a/build.rs b/build.rs index fd43183b2..97d2cd017 100644 --- a/build.rs +++ b/build.rs @@ -133,6 +133,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/languages_supported.md b/manual/src/languages_supported.md index efeb5d8f4..d07cb1792 100644 --- a/manual/src/languages_supported.md +++ b/manual/src/languages_supported.md @@ -16,6 +16,7 @@ Difftastic supports the following programming languages. | Emacs Lisp | [wilfred/tree-sitter-elisp](https://github.com/Wilfred/tree-sitter-elisp) | | Gleam | [gleam-lang/tree-sitter-gleam](https://github.com/gleam-lang/tree-sitter-gleam) | | 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) | | Janet | [sogaiu/tree-sitter-janet-simple](https://github.com/sogaiu/tree-sitter-janet-simple) | | Java | [tree-sitter/tree-sitter-java](https://github.com/tree-sitter/tree-sitter-java) | diff --git a/src/diff/sliders.rs b/src/diff/sliders.rs index 79b496191..e71731bfe 100644 --- a/src/diff/sliders.rs +++ b/src/diff/sliders.rs @@ -67,7 +67,7 @@ fn prefer_outer_delimiter(language: guess_language::Language) -> bool { // For everything else, prefer the inner delimiter. These // languages have syntax like `foo(bar)` or `foo[bar]` where // the inner delimiter is more relevant. - Bash | C | CPlusPlus | CSharp | Css | Dart | Elixir | Elm | Elvish | Gleam | Go + Bash | C | CPlusPlus | CSharp | Css | Dart | Elixir | Elm | Elvish | Gleam | Go | Hack | Haskell | Html | Java | JavaScript | Jsx | Julia | Kotlin | Lua | Nix | OCaml | OCamlInterface | Perl | Php | Python | Ruby | Rust | Scala | Swift | Tsx | TypeScript | Yaml | Zig => false, diff --git a/src/parse/guess_language.rs b/src/parse/guess_language.rs index 0aee252a4..ff0af41d7 100644 --- a/src/parse/guess_language.rs +++ b/src/parse/guess_language.rs @@ -32,6 +32,7 @@ pub enum Language { EmacsLisp, Gleam, Go, + Hack, Haskell, Hcl, Html, @@ -162,6 +163,7 @@ fn from_shebang(src: &str) -> Option { "lisp" | "sbc" | "ccl" | "clisp" | "ecl" => return Some(CommonLisp), "elixir" => return Some(Elixir), "elvish" => return Some(Elvish), + "hhvm" => return Some(Hack), "runghc" | "runhaskell" | "runhugs" => return Some(Haskell), "chakra" | "d8" | "gjs" | "js" | "node" | "nodejs" | "qjs" | "rhino" | "v8" | "v8-shell" => return Some(JavaScript), @@ -175,6 +177,11 @@ fn from_shebang(src: &str) -> Option { } } } + + // Hack can use Option { "elv" => Some(Elvish), "gleam" => Some(Gleam), "go" => Some(Go), + "hack" | "hck" | "hhi" => Some(Hack), "hs" => Some(Haskell), "hcl" | "nomad" | "tf" | "tfvars" | "worfklow" => Some(Hcl), "html" | "htm" | "xhtml" => Some(Html), diff --git a/src/parse/tree_sitter_parser.rs b/src/parse/tree_sitter_parser.rs index 31e17ad57..9cc98aab7 100644 --- a/src/parse/tree_sitter_parser.rs +++ b/src/parse/tree_sitter_parser.rs @@ -57,6 +57,7 @@ extern "C" { fn tree_sitter_elvish() -> ts::Language; fn tree_sitter_gleam() -> ts::Language; fn tree_sitter_go() -> ts::Language; + fn tree_sitter_hack() -> ts::Language; fn tree_sitter_haskell() -> ts::Language; fn tree_sitter_hcl() -> ts::Language; fn tree_sitter_html() -> ts::Language; @@ -313,6 +314,20 @@ pub fn from_language(language: guess::Language) -> TreeSitterConfig { .unwrap(), } } + Hack => { + let language = unsafe { tree_sitter_hack() }; + TreeSitterConfig { + name: "Hack", + language, + atom_nodes: vec!["prefixed_string", "heredoc"].into_iter().collect(), + delimiter_tokens: vec![("[", "]"), ("(", ")"), ("<", ">"), ("{", "}")], + highlight_query: ts::Query::new( + language, + include_str!("../../vendor/highlights/hack.scm"), + ) + .unwrap(), + } + } Haskell => { let language = unsafe { tree_sitter_haskell() }; TreeSitterConfig {