From 3a83a764e3a03ecf463c8fcfc141e48ed2d807ab Mon Sep 17 00:00:00 2001 From: Michael Davis Date: Mon, 14 Feb 2022 19:14:02 -0600 Subject: [PATCH] add tree-sitter-erlang (#1657) --- .gitmodules | 3 + book/src/generated/lang-support.md | 1 + helix-syntax/languages/tree-sitter-erlang | 1 + languages.toml | 9 ++ runtime/queries/erlang/highlights.scm | 118 ++++++++++++++++++++++ runtime/queries/erlang/injections.scm | 2 + 6 files changed, 134 insertions(+) create mode 160000 helix-syntax/languages/tree-sitter-erlang create mode 100644 runtime/queries/erlang/highlights.scm create mode 100644 runtime/queries/erlang/injections.scm diff --git a/.gitmodules b/.gitmodules index 55ed97b32..5b6609a80 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 64dab6d33..894050731 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 index 000000000..86985bde3 --- /dev/null +++ b/helix-syntax/languages/tree-sitter-erlang @@ -0,0 +1 @@ +Subproject commit 86985bde399c5f40b00bc75f7ab70a6c69a5f9c3 diff --git a/languages.toml b/languages.toml index 6f8bf1143..35758566a 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 000000000..fc742f3a2 --- /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 000000000..321c90add --- /dev/null +++ b/runtime/queries/erlang/injections.scm @@ -0,0 +1,2 @@ +((comment) @injection.content + (#set! injection.language "comment"))