on master help sign in
feat(languages): Elm (#1514)

* Add Elm language support * Fix docs gen * Updates based on PR feedback

commitb2c8aa1ee709edcd5302b27f6d6467b7b624ca84 authorJared Ramirez <jaredramirez@hey.com> dateThu 20 Jan 2022, 07:47 (5 years ago) parent440d4ae
8 files changed+137
.gitmodules+4 book/src/generated/lang-support.md+1 helix-syntax/languages/tree-sitter-elm+1 languages.toml+11 runtime/queries/elm/highlights.scm+83 runtime/queries/elm/injections.scm+4 runtime/queries/elm/locals.scm+14 runtime/queries/elm/tags.scm+19
.gitmodules+4
@@ -206,3 +206,7 @@
206206 path = helix-syntax/languages/tree-sitter-git-config
207207 url = https://github.com/the-mikedavis/tree-sitter-git-config.git
208208 shallow = true
209+[submodule "helix-syntax/languages/tree-sitter-elm"]
210+ path = helix-syntax/languages/tree-sitter-elm
211+ url = https://github.com/elm-tooling/tree-sitter-elm
212+ shallow = true
book/src/generated/lang-support.md+1
@@ -10,6 +10,7 @@
1010| dart | ✓ | | ✓ | `dart` |
1111| dockerfile | ✓ | | | `docker-langserver` |
1212| elixir | ✓ | | | `elixir-ls` |
13+| elm | ✓ | | | `elm-language-server` |
1314| fish | ✓ | ✓ | ✓ | |
1415| git-commit | ✓ | | | |
1516| git-config | ✓ | | | |
helix-syntax/languages/tree-sitter-elmnew file+1

Submodule changed.

languages.toml+11
@@ -567,3 +567,14 @@ file-types = [".gitmodules", ".gitconfig"]
567567injection-regex = "git-config"
568568comment-token = "#"
569569indent = { tab-width = 4, unit = "\t" }
570+
571+[[language]]
572+name = "elm"
573+scope = "source.elm"
574+injection-regex = "elm"
575+file-types = ["elm"]
576+roots = ["elm.json"]
577+auto-format = true
578+comment-token = "--"
579+language-server = { command = "elm-language-server" }
580+indent = { tab-width = 4, unit = " " }
runtime/queries/elm/highlights.scmnew file+83
@@ -0,0 +1,83 @@
1+; Keywords
2+[
3+ "if"
4+ "then"
5+ "else"
6+ "let"
7+ "in"
8+ ] @keyword.control
9+(case) @keyword.control
10+(of) @keyword.control
11+
12+(colon) @keyword.operator
13+(backslash) @keyword
14+(as) @keyword
15+(port) @keyword
16+(exposing) @keyword
17+(alias) @keyword
18+(infix) @keyword
19+
20+(arrow) @keyword.operator
21+(dot) @keyword.operator
22+
23+(port) @keyword
24+
25+(type_annotation(lower_case_identifier) @function)
26+(port_annotation(lower_case_identifier) @function)
27+(file (value_declaration (function_declaration_left(lower_case_identifier) @function)))
28+
29+(field name: (lower_case_identifier) @attribute)
30+(field_access_expr(lower_case_identifier) @attribute)
31+
32+(operator_identifier) @keyword.operator
33+(eq) @keyword.operator.assignment
34+
35+[
36+ "("
37+ ")"
38+ "["
39+ "]"
40+ "{"
41+ "}"
42+] @punctuation.bracket
43+
44+"|" @keyword
45+"," @punctuation.delimiter
46+
47+[
48+ "|>"
49+] @keyword
50+
51+
52+(import) @keyword.contol.import
53+(module) @keyword.other
54+
55+(number_constant_expr) @constant.numeric
56+
57+(type) @type
58+
59+(type_declaration(upper_case_identifier) @type)
60+(type_ref) @type
61+(type_alias_declaration name: (upper_case_identifier) @type)
62+
63+(union_pattern constructor: (upper_case_qid (upper_case_identifier) @label (dot) (upper_case_identifier) @variable.other.member))
64+(union_pattern constructor: (upper_case_qid (upper_case_identifier) @variable.other.member))
65+
66+(union_variant(upper_case_identifier) @variable.other.member)
67+(value_expr name: (value_qid (upper_case_identifier) @label))
68+(value_expr (upper_case_qid (upper_case_identifier) @label (dot) (upper_case_identifier) @variable.other.member))
69+(value_expr(upper_case_qid(upper_case_identifier)) @variable.other.member)
70+
71+; comments
72+(line_comment) @comment
73+(block_comment) @comment
74+
75+; strings
76+(string_escape) @constant.character.escape
77+
78+(open_quote) @string
79+(close_quote) @string
80+(regular_string_part) @string
81+
82+(open_char) @constant.character
83+(close_char) @constant.character
runtime/queries/elm/injections.scmnew file+4
@@ -0,0 +1,4 @@
1+; Parse glsl where defined
2+
3+((glsl_content) @injection.content
4+ (#set! injection.language "glsl"))
runtime/queries/elm/locals.scmnew file+14
@@ -0,0 +1,14 @@
1+(value_declaration) @local.scope
2+(type_alias_declaration) @local.scope
3+(type_declaration) @local.scope
4+(type_annotation) @local.scope
5+(port_annotation) @local.scope
6+(infix_declaration) @local.scope
7+(let_in_expr) @local.scope
8+
9+(function_declaration_left (lower_pattern (lower_case_identifier)) @local.definition)
10+(function_declaration_left (lower_case_identifier) @local.definition)
11+
12+(value_expr(value_qid(upper_case_identifier)) @local.reference)
13+(value_expr(value_qid(lower_case_identifier)) @local.reference)
14+(type_ref (upper_case_qid) @local.reference)
runtime/queries/elm/tags.scmnew file+19
@@ -0,0 +1,19 @@
1+(value_declaration (function_declaration_left (lower_case_identifier) @name)) @definition.function
2+
3+(function_call_expr (value_expr (value_qid) @name)) @reference.function
4+(exposed_value (lower_case_identifier) @name) @reference.function
5+(type_annotation ((lower_case_identifier) @name) (colon)) @reference.function
6+
7+(type_declaration ((upper_case_identifier) @name) ) @definition.type
8+
9+(type_ref (upper_case_qid (upper_case_identifier) @name)) @reference.type
10+(exposed_type (upper_case_identifier) @name) @reference.type
11+
12+(type_declaration (union_variant (upper_case_identifier) @name)) @definition.union
13+
14+(value_expr (upper_case_qid (upper_case_identifier) @name)) @reference.union
15+
16+
17+(module_declaration
18+ (upper_case_qid (upper_case_identifier)) @name
19+) @definition.module