From d6e9afd3d6c0434d07ed483db58b94ccf1cb7321 Mon Sep 17 00:00:00 2001 From: Alex Perkins Date: Fri, 1 Apr 2022 11:44:43 -0400 Subject: [PATCH] add support for Elm --- build.rs | 5 ++++ sample_files/compare.expected | 3 +++ sample_files/elm_after.elm | 40 ++++++++++++++++++++++++++++++++ sample_files/elm_before.elm | 43 +++++++++++++++++++++++++++++++++++ src/guess_language.rs | 3 +++ src/tree_sitter_parser.rs | 15 ++++++++++++ vendor/highlights/elm.scm | 1 + vendor/tree-sitter-elm-src | 1 + 8 files changed, 111 insertions(+) create mode 100644 sample_files/elm_after.elm create mode 100644 sample_files/elm_before.elm create mode 120000 vendor/highlights/elm.scm create mode 120000 vendor/tree-sitter-elm-src diff --git a/build.rs b/build.rs index 977a0a518..9bf397879 100644 --- a/build.rs +++ b/build.rs @@ -109,6 +109,11 @@ fn main() { 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-go", src_dir: "vendor/tree-sitter-go-src", diff --git a/sample_files/compare.expected b/sample_files/compare.expected index e1cd29508..70eb7d262 100644 --- a/sample_files/compare.expected +++ b/sample_files/compare.expected @@ -28,6 +28,9 @@ f4233ebbe6c46a7c07bc88eca20e4856 - sample_files/elisp_contiguous_before.el sample_files/elisp_contiguous_after.el e3946aef566a707c718edd7a86340566 - +sample_files/elm_before.elm sample_files/elm_after.elm +16777d5b5204b34cf7891b9fd476d9fc - + sample_files/hack_before.php sample_files/hack_after.php b8c51005df7e1eaaeaf738a4353ac88f - diff --git a/sample_files/elm_after.elm b/sample_files/elm_after.elm new file mode 100644 index 000000000..fa8f4e146 --- /dev/null +++ b/sample_files/elm_after.elm @@ -0,0 +1,40 @@ +module Main exposing (blue, list, x, y) + + +list : List Int +list = + [ 1 + , 2 + , 3 + , 4 + ] + + +blue : a -> String +blue = + \_ -> "blue" + + +green : String +green = + "yellow" ++ "blue" + + +x : Int +x = + (*) 2 <| 4 + + +y : Int +y = + 4 |> (*) 2 + + +fn : + () + -> Int + -> List String + -> () + -> String +fn () n strings () = + String.join (String.fromInt n) strings diff --git a/sample_files/elm_before.elm b/sample_files/elm_before.elm new file mode 100644 index 000000000..60d77a6df --- /dev/null +++ b/sample_files/elm_before.elm @@ -0,0 +1,43 @@ +module Main exposing (blue, green, list, x, y, z) + + +list : List Int +list = + [ 1, 2, 3 ] + + +blue : a -> String +blue = + always "blue" + + +green : a -> String +green = + always "blue" + + +y : Int + + +x = + (*) 2 4 + + +y : Int +y = + (*) 2 4 + + +z : String +z = + "abc" + + +fn : () -> Int -> List String -> String +fn _ n strings = + let + foo : List String -> String + foo = + String.join (String.fromInt n) + in + foo strings diff --git a/src/guess_language.rs b/src/guess_language.rs index 82e2d829f..e0bdc528e 100644 --- a/src/guess_language.rs +++ b/src/guess_language.rs @@ -27,6 +27,7 @@ pub enum Language { Css, Dart, Elixir, + Elm, EmacsLisp, Gleam, Go, @@ -99,6 +100,7 @@ fn from_emacs_mode_header(src: &str) -> Option { "dart" => Some(Dart), "c++" => Some(CPlusPlus), "elixir" => Some(Elixir), + "elm" => Some(Elm), "emacs-lisp" => Some(EmacsLisp), "gleam" => Some(Gleam), "go" => Some(Go), @@ -196,6 +198,7 @@ pub fn from_extension(extension: &OsStr) -> Option { "css" => Some(Css), "dart" => Some(Dart), "el" => Some(EmacsLisp), + "elm" => Some(Elm), "ex" | "exs" => Some(Elixir), "gleam" => Some(Gleam), "go" => Some(Go), diff --git a/src/tree_sitter_parser.rs b/src/tree_sitter_parser.rs index e1b40929c..4acb63045 100644 --- a/src/tree_sitter_parser.rs +++ b/src/tree_sitter_parser.rs @@ -54,6 +54,7 @@ extern "C" { 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_go() -> ts::Language; fn tree_sitter_haskell() -> ts::Language; fn tree_sitter_janet_simple() -> ts::Language; @@ -256,6 +257,20 @@ pub fn from_language(language: guess::Language) -> TreeSitterConfig { .unwrap(), } } + Elm => { + let language = unsafe { tree_sitter_elm() }; + TreeSitterConfig { + name: "Elm", + language, + atom_nodes: vec!["string_constant_expr"].into_iter().collect(), + delimiter_tokens: vec![("{", "}"), ("[", "]"), ("(", ")")], + highlight_query: ts::Query::new( + language, + include_str!("../vendor/highlights/elm.scm"), + ) + .unwrap(), + } + } Go => { let language = unsafe { tree_sitter_go() }; TreeSitterConfig { diff --git a/vendor/highlights/elm.scm b/vendor/highlights/elm.scm new file mode 120000 index 000000000..6a19b68cf --- /dev/null +++ b/vendor/highlights/elm.scm @@ -0,0 +1 @@ +../tree-sitter-elm/queries/highlights.scm \ No newline at end of file diff --git a/vendor/tree-sitter-elm-src b/vendor/tree-sitter-elm-src new file mode 120000 index 000000000..b2445e8b2 --- /dev/null +++ b/vendor/tree-sitter-elm-src @@ -0,0 +1 @@ +tree-sitter-elm/src \ No newline at end of file