summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--.gitmodules3
-rw-r--r--book/src/generated/lang-support.md1
m---------helix-syntax/languages/tree-sitter-erlang0
-rw-r--r--languages.toml9
-rw-r--r--runtime/queries/erlang/highlights.scm118
-rw-r--r--runtime/queries/erlang/injections.scm2
6 files changed, 133 insertions, 0 deletions
diff --git a/.gitmodules b/.gitmodules
index 55ed97b3..5b6609a8 100644
--- a/.gitmodules
+++ b/.gitmodules
@@ -226,3 +226,6 @@
path = helix-syntax/languages/tree-sitter-rescript
url = https://github.com/jaredramirez/tree-sitter-rescript
shallow = true
+[submodule "helix-syntax/languages/tree-sitter-erlang"]
+ path = helix-syntax/languages/tree-sitter-erlang
+ url = https://github.com/the-mikedavis/tree-sitter-erlang
diff --git a/book/src/generated/lang-support.md b/book/src/generated/lang-support.md
index 64dab6d3..89405073 100644
--- a/book/src/generated/lang-support.md
+++ b/book/src/generated/lang-support.md
@@ -11,6 +11,7 @@
| dockerfile | ✓ | | | `docker-langserver` |
| elixir | ✓ | | | `elixir-ls` |
| elm | ✓ | | | `elm-language-server` |
+| erlang | ✓ | | | |
| fish | ✓ | ✓ | ✓ | |
| git-commit | ✓ | | | |
| git-config | ✓ | | | |
diff --git a/helix-syntax/languages/tree-sitter-erlang b/helix-syntax/languages/tree-sitter-erlang
new file mode 160000
+Subproject 86985bde399c5f40b00bc75f7ab70a6c69a5f9c
diff --git a/languages.toml b/languages.toml
index 6f8bf114..35758566 100644
--- a/languages.toml
+++ b/languages.toml
@@ -732,3 +732,12 @@ auto-format = true
comment-token = "//"
language-server = { command = "rescript-language-server", args = ["--stdio"] }
indent = { tab-width = 2, unit = " " }
+
+[[language]]
+name = "erlang"
+scope = "source.erlang"
+injection-regex = "^erl$"
+file-types = ["erl", "hrl", "app", "rebar.config"]
+roots = ["rebar.config"]
+comment-token = "%%"
+indent = { tab-width = 4, unit = " " }
diff --git a/runtime/queries/erlang/highlights.scm b/runtime/queries/erlang/highlights.scm
new file mode 100644
index 00000000..fc742f3a
--- /dev/null
+++ b/runtime/queries/erlang/highlights.scm
@@ -0,0 +1,118 @@
+; Attributes
+; module declaration
+(attribute
+ name: (atom) @keyword
+ (arguments (atom) @module)
+ (#eq? @keyword "module"))
+
+(attribute
+ name: (atom) @keyword
+ (arguments
+ .
+ (atom) @module)
+ (#eq? @keyword "import"))
+
+(attribute
+ name: (atom) @keyword
+ (arguments
+ .
+ (atom) @type
+ [
+ (tuple (atom) @variable.other.member)
+ (tuple
+ (binary_operator
+ left: (atom) @variable.other.member
+ operator: "="))
+ (tuple
+ (binary_operator
+ left:
+ (binary_operator
+ left: (atom) @variable.other.member
+ operator: "=")
+ operator: "::"))
+ ])
+ (#eq? @keyword "record"))
+
+(attribute
+ name: (atom) @keyword
+ (arguments
+ .
+ [
+ (atom) @keyword.directive
+ (variable) @keyword.directive
+ (call
+ function:
+ [(variable) (atom)] @keyword.directive)
+ ])
+ (#eq? @keyword "define"))
+
+(attribute
+ name: (atom) @keyword
+ module: (atom) @module
+ (#eq? @keyword "spec"))
+
+; Functions
+(function name: (atom) @function)
+(call module: (atom) @module)
+(call function: (atom) @function)
+(stab_clause name: (atom) @function)
+(function_capture module: (atom) @module)
+(function_capture function: (atom) @function)
+
+; Records
+(record_content
+ (binary_operator
+ left: (atom) @variable.other.member
+ operator: "="))
+
+(record field: (atom) @variable.other.member)
+(record name: (atom) @type)
+
+; Keywords
+((attribute name: (atom) @keyword)
+ (#match?
+ @keyword
+ "^(define|export|export_type|include|include_lib|ifdef|ifndef|if|elif|else|endif|vsn|on_load|behaviour|record|file|type|opaque|spec)$"))
+
+["case" "fun" "if" "of" "when" "end" "receive" "try" "catch" "after"] @keyword
+
+; Operators
+(binary_operator
+ left: (atom) @function
+ operator: "/"
+ right: (integer) @constant.numeric.integer)
+
+(binary_operator operator: _ @operator)
+(unary_operator operator: _ @operator)
+["/" ":" "#" "->"] @operator
+
+; Comments
+((variable) @comment.discard
+ (#match? @comment.discard "^_"))
+
+(tripledot) @comment.discard
+
+(comment) @comment
+
+; Macros
+(macro
+ "?"+ @keyword.directive
+ name: (_) @keyword.directive)
+
+; Basic types
+(variable) @variable
+[
+ (atom)
+ (quoted_atom)
+] @string.special.symbol
+(string) @string
+(character) @constant.character
+
+(integer) @constant.numeric.integer
+(float) @constant.numeric.float
+
+; Punctuation
+["," "." "-" ";"] @punctuation.delimiter
+["(" ")" "{" "}" "[" "]" "<<" ">>"] @punctuation.bracket
+
+; (ERROR) @error
diff --git a/runtime/queries/erlang/injections.scm b/runtime/queries/erlang/injections.scm
new file mode 100644
index 00000000..321c90ad
--- /dev/null
+++ b/runtime/queries/erlang/injections.scm
@@ -0,0 +1,2 @@
+((comment) @injection.content
+ (#set! injection.language "comment"))