From 659f2dd6bd3d5d213021e2b5b434ea7deb890964 Mon Sep 17 00:00:00 2001 From: Wilfred Hughes Date: Sun, 28 Aug 2022 16:26:01 -0700 Subject: [PATCH] Add support for Makefiles --- CHANGELOG.md | 2 ++ build.rs | 5 +++++ manual/src/languages_supported.md | 1 + src/diff/sliders.rs | 6 +++--- src/parse/guess_language.rs | 5 +++++ src/parse/tree_sitter_parser.rs | 15 +++++++++++++++ vendor/highlights/make.scm | 1 + vendor/tree-sitter-make-src | 1 + 8 files changed, 33 insertions(+), 3 deletions(-) create mode 120000 vendor/highlights/make.scm create mode 120000 vendor/tree-sitter-make-src diff --git a/CHANGELOG.md b/CHANGELOG.md index 68e31458e..5dfee3667 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -5,6 +5,8 @@ Difftastic will now autodetect files in UTF-16-BE and UTF-16-LE. Previously it required files to be UTF-8. +Added support for Makefiles. + ## 0.34 (released 27th August 2022) ### Build diff --git a/build.rs b/build.rs index c127512fe..7980a1e64 100644 --- a/build.rs +++ b/build.rs @@ -252,6 +252,11 @@ fn main() { src_dir: "vendor/tree-sitter-lua-src", extra_files: vec!["scanner.cc"], }, + TreeSitterParser { + name: "tree-sitter-make", + src_dir: "vendor/tree-sitter-make-src", + extra_files: vec![], + }, TreeSitterParser { name: "tree-sitter-nix", src_dir: "vendor/tree-sitter-nix-src", diff --git a/manual/src/languages_supported.md b/manual/src/languages_supported.md index 3c9448498..f6171a54f 100644 --- a/manual/src/languages_supported.md +++ b/manual/src/languages_supported.md @@ -26,6 +26,7 @@ Difftastic supports the following programming languages. | Julia | [tree-sitter/tree-sitter-julia](https://github.com/tree-sitter/tree-sitter-julia) | | Kotlin | [fwcd/tree-sitter-kotlin](https://github.com/fwcd/tree-sitter-kotlin) | | Lua | [nvim-treesitter/tree-sitter-lua](https://github.com/nvim-treesitter/tree-sitter-lua) | +| Make | [alemuller/tree-sitter-make](https://github.com/alemuller/tree-sitter-make) | | Nix | [cstrahan/tree-sitter-nix](https://github.com/cstrahan/tree-sitter-nix) | | OCaml | [tree-sitter/tree-sitter-ocaml](https://github.com/tree-sitter/tree-sitter-ocaml) | | Perl | [ganezdragon/tree-sitter-perl](https://github.com/ganezdragon/tree-sitter-perl) | diff --git a/src/diff/sliders.rs b/src/diff/sliders.rs index 85e62645c..1a4278099 100644 --- a/src/diff/sliders.rs +++ b/src/diff/sliders.rs @@ -68,9 +68,9 @@ fn prefer_outer_delimiter(language: guess_language::Language) -> bool { // languages have syntax like `foo(bar)` or `foo[bar]` where // the inner delimiter is more relevant. Bash | C | CMake | 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, + | Hack | Haskell | Html | Java | JavaScript | Jsx | Julia | Kotlin | Lua | Make | 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 34eceb661..f54a47be6 100644 --- a/src/parse/guess_language.rs +++ b/src/parse/guess_language.rs @@ -45,6 +45,7 @@ pub enum Language { Jsx, Kotlin, Lua, + Make, Nix, OCaml, OCamlInterface, @@ -202,6 +203,9 @@ fn from_name(path: &Path) -> Option { ".arcconfig" | ".auto-changelog" | ".c8rc" | ".htmlhintrc" | ".imgbotconfig" | ".nycrc" | ".tern-config" | ".tern-project" | ".watchmanconfig" | "Pipfile.lock" | "composer.lock" | "mcmod.info" => Some(Json), + "BSDmakefile" | "GNUmakefile" | "Kbuild" | "Makefile" | "Makefile.am" + | "Makefile.boot" | "Makefile.frag" | "Makefile.in" | "Makefile.inc" + | "Makefile.wat" | "makefile" | "makefile.sco" | "mkfile" => Some(Make), "TARGETS" | "BUCK" | "DEPS" => Some(Python), "Gemfile" | "Rakefile" => Some(Ruby), "Cargo.lock" | "Gopkg.lock" | "Pipfile" | "poetry.lock" => Some(Toml), @@ -249,6 +253,7 @@ pub fn from_extension(extension: &OsStr) -> Option { "jl" => Some(Julia), "kt" | "ktm" | "kts" => Some(Kotlin), "lua" => Some(Lua), + ".mak" | ".d" | ".make" | ".makefile" | ".mk" | ".mkfile" => Some(Make), "nix" => Some(Nix), "ml" => Some(OCaml), "mli" => Some(OCamlInterface), diff --git a/src/parse/tree_sitter_parser.rs b/src/parse/tree_sitter_parser.rs index 1e03325d8..454c3fd34 100644 --- a/src/parse/tree_sitter_parser.rs +++ b/src/parse/tree_sitter_parser.rs @@ -69,6 +69,7 @@ extern "C" { fn tree_sitter_julia() -> ts::Language; fn tree_sitter_kotlin() -> ts::Language; fn tree_sitter_lua() -> ts::Language; + fn tree_sitter_make() -> ts::Language; fn tree_sitter_nix() -> ts::Language; fn tree_sitter_ocaml() -> ts::Language; fn tree_sitter_ocaml_interface() -> ts::Language; @@ -532,6 +533,20 @@ pub fn from_language(language: guess::Language) -> TreeSitterConfig { .unwrap(), } } + Make => { + let language = unsafe { tree_sitter_make() }; + TreeSitterConfig { + name: "Makefile", + language, + atom_nodes: vec![].into_iter().collect(), + delimiter_tokens: vec![("(", ")")].into_iter().collect(), + highlight_query: ts::Query::new( + language, + include_str!("../../vendor/highlights/make.scm"), + ) + .unwrap(), + } + } Nix => { let language = unsafe { tree_sitter_nix() }; TreeSitterConfig { diff --git a/vendor/highlights/make.scm b/vendor/highlights/make.scm new file mode 120000 index 000000000..c6c9061c1 --- /dev/null +++ b/vendor/highlights/make.scm @@ -0,0 +1 @@ +../tree-sitter-make/queries/highlights.scm \ No newline at end of file diff --git a/vendor/tree-sitter-make-src b/vendor/tree-sitter-make-src new file mode 120000 index 000000000..68096484a --- /dev/null +++ b/vendor/tree-sitter-make-src @@ -0,0 +1 @@ +tree-sitter-make/src \ No newline at end of file