Add Elvish support

Add support for [Elvish](https://elv.sh).
pull/226/head
cherryblossom 2022-04-02 10:34:14 +07:00
parent ffcb39e041
commit defc084637
No known key found for this signature in database
GPG Key ID: 03B34648D6DEB639
10 changed files with 93 additions and 21 deletions

@ -107,16 +107,21 @@ fn main() {
src_dir: "vendor/tree-sitter-elixir-src",
extra_files: vec!["scanner.cc"],
},
TreeSitterParser {
name: "tree-sitter-gleam",
src_dir: "vendor/tree-sitter-gleam-src",
extra_files: vec![],
},
TreeSitterParser {
name: "tree-sitter-elm",
src_dir: "vendor/tree-sitter-elm-src",
extra_files: vec!["scanner.cc"],
},
TreeSitterParser {
name: "tree-sitter-elvish",
src_dir: "vendor/tree-sitter-elvish-src",
extra_files: vec![],
},
TreeSitterParser {
name: "tree-sitter-gleam",
src_dir: "vendor/tree-sitter-gleam-src",
extra_files: vec![],
},
TreeSitterParser {
name: "tree-sitter-go",
src_dir: "vendor/tree-sitter-go-src",

@ -12,6 +12,7 @@ Difftastic supports the following programming languages.
| Common Lisp | [theHamsta/tree-sitter-commonlisp](https://github.com/theHamsta/tree-sitter-commonlisp) |
| Dart | [UserNobody14/tree-sitter-dart](https://github.com/UserNobody14/tree-sitter-dart) |
| Elixir | [elixir-lang/tree-sitter-elixir](https://github.com/elixir-lang/tree-sitter-elixir) |
| Elvish | [ckafi/tree-sitter-elvish](https://github.com/ckafi/tree-sitter-elvish) |
| 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) |

@ -34,6 +34,9 @@ e3946aef566a707c718edd7a86340566 -
sample_files/elm_before.elm sample_files/elm_after.elm
c1ea9f99a815b2ae5ce2a7d58fb65368 -
sample_files/elvish_before.elv sample_files/elvish_after.elv
0107abd4d8c25034207bedd407a499ac -
sample_files/hack_before.php sample_files/hack_after.php
b8c51005df7e1eaaeaf738a4353ac88f -

@ -0,0 +1,20 @@
# Taken from the Elvish homepage https://elv.sh
curl https://api.github.com/repos/elves/elvish/issues |
from-json | all (one) |
each {|x| echo (exact-num $x[number]): $x[title] } |
head -n 5
if $false { echo good } else { echo bad }
for x [lorem ipsum] {
echo $x.rs
}
try {
fail 'bad error'
} except e {
echo error $e
} else {
echo ok
}

@ -0,0 +1,20 @@
# Taken from the Elvish homepage https://elv.sh
curl https://api.github.com/repos/elves/elvish/issues |
from-json | all (one) |
each {|x| echo (exact-num $x[number]): $x[title] } |
head -n 7
if $true { echo good } else { echo bad }
for x [lorem ipsum] {
echo $x.pdf
}
try {
fail 'bad error'
} except e {
echo error $e
} else {
echo ok
}

@ -28,6 +28,7 @@ pub enum Language {
Dart,
Elixir,
Elm,
Elvish,
EmacsLisp,
Gleam,
Go,
@ -107,6 +108,7 @@ fn from_emacs_mode_header(src: &str) -> Option<Language> {
"c++" => Some(CPlusPlus),
"elixir" => Some(Elixir),
"elm" => Some(Elm),
"elvish" => Some(Elvish),
"emacs-lisp" => Some(EmacsLisp),
"gleam" => Some(Gleam),
"go" => Some(Go),
@ -155,6 +157,7 @@ fn from_shebang(src: &str) -> Option<Language> {
"tcc" => return Some(C),
"lisp" | "sbc" | "ccl" | "clisp" | "ecl" => return Some(CommonLisp),
"elixir" => return Some(Elixir),
"elvish" => return Some(Elvish),
"runghc" | "runhaskell" | "runhugs" => return Some(Haskell),
"chakra" | "d8" | "gjs" | "js" | "node" | "nodejs" | "qjs" | "rhino" | "v8"
| "v8-shell" => return Some(JavaScript),
@ -214,6 +217,7 @@ pub fn from_extension(extension: &OsStr) -> Option<Language> {
"el" => Some(EmacsLisp),
"elm" => Some(Elm),
"ex" | "exs" => Some(Elixir),
"elv" => Some(Elvish),
"gleam" => Some(Gleam),
"go" => Some(Go),
"hs" => Some(Haskell),

@ -65,9 +65,11 @@ 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 | Gleam | Go | Haskell | Java
| JavaScript | Jsx | Kotlin | Lua | Nix | OCaml | OCamlInterface | Perl | Php | Python
| Ruby | Rust | Scala | Swift | Tsx | TypeScript | Yaml | Zig => false,
Bash | C | CPlusPlus | CSharp | Css | Dart | Elixir | Elm | Elvish | Gleam | Go
| Haskell | Java | JavaScript | Jsx | Kotlin | Lua | Nix | OCaml | OCamlInterface
| Perl | Php | Python | Ruby | Rust | Scala | Swift | Tsx | TypeScript | Yaml | Zig => {
false
}
}
}

@ -53,8 +53,9 @@ extern "C" {
fn tree_sitter_dart() -> ts::Language;
fn tree_sitter_elisp() -> ts::Language;
fn tree_sitter_elixir() -> ts::Language;
fn tree_sitter_gleam() -> ts::Language;
fn tree_sitter_elm() -> ts::Language;
fn tree_sitter_elvish() -> ts::Language;
fn tree_sitter_gleam() -> ts::Language;
fn tree_sitter_go() -> ts::Language;
fn tree_sitter_haskell() -> ts::Language;
fn tree_sitter_hcl() -> ts::Language;
@ -249,30 +250,44 @@ pub fn from_language(language: guess::Language) -> TreeSitterConfig {
.unwrap(),
}
}
Gleam => {
let language = unsafe { tree_sitter_gleam() };
Elm => {
let language = unsafe { tree_sitter_elm() };
TreeSitterConfig {
name: "Gleam",
name: "Elm",
language,
atom_nodes: ["string"].into(),
delimiter_tokens: vec![("(", ")"), ("[", "]"), ("{", "}")],
atom_nodes: vec!["string_constant_expr"].into_iter().collect(),
delimiter_tokens: vec![("{", "}"), ("[", "]"), ("(", ")")],
highlight_query: ts::Query::new(
language,
include_str!("../vendor/highlights/gleam.scm"),
include_str!("../vendor/highlights/elm.scm"),
)
.unwrap(),
}
}
Elm => {
let language = unsafe { tree_sitter_elm() };
Elvish => {
let language = unsafe { tree_sitter_elvish() };
TreeSitterConfig {
name: "Elm",
name: "Elvish",
language,
atom_nodes: vec!["string_constant_expr"].into_iter().collect(),
delimiter_tokens: vec![("{", "}"), ("[", "]"), ("(", ")")],
atom_nodes: [].into(),
delimiter_tokens: vec![("{", "}"), ("(", ")"), ("[", "]"), ("|", "|")],
highlight_query: ts::Query::new(
language,
include_str!("../vendor/highlights/elm.scm"),
include_str!("../vendor/highlights/elvish.scm"),
)
.unwrap(),
}
}
Gleam => {
let language = unsafe { tree_sitter_gleam() };
TreeSitterConfig {
name: "Gleam",
language,
atom_nodes: ["string"].into(),
delimiter_tokens: vec![("(", ")"), ("[", "]"), ("{", "}")],
highlight_query: ts::Query::new(
language,
include_str!("../vendor/highlights/gleam.scm"),
)
.unwrap(),
}

@ -0,0 +1 @@
../tree-sitter-elvish/queries/highlights.scm

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