Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

prefer elixir-lang/tree-sitter-elixir #830

Merged
2 changes: 1 addition & 1 deletion .gitmodules
Original file line number Diff line number Diff line change
Expand Up @@ -84,7 +84,7 @@
shallow = true
[submodule "helix-syntax/languages/tree-sitter-elixir"]
path = helix-syntax/languages/tree-sitter-elixir
url = https://github.com/IceDragon200/tree-sitter-elixir
url = https://github.com/elixir-lang/tree-sitter-elixir
shallow = true
[submodule "helix-syntax/languages/tree-sitter-nix"]
path = helix-syntax/languages/tree-sitter-nix
Expand Down
1 change: 1 addition & 0 deletions book/src/themes.md
Original file line number Diff line number Diff line change
Expand Up @@ -119,6 +119,7 @@ We use a similar set of scopes as
- `special`
- `path`
- `url`
- `symbol` - Erlang/Elixir atoms, Ruby symbols, Clojure keywords
Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

this is already in use by the ruby highlights for ruby symbols so I've just added documentation for it here

for everything else I was able to find suitable scopes that were already documented


- `comment` - Code comments
- `line` - Single line comments (`//`)
Expand Down
2 changes: 1 addition & 1 deletion helix-syntax/languages/tree-sitter-elixir
310 changes: 198 additions & 112 deletions runtime/queries/elixir/highlights.scm
Original file line number Diff line number Diff line change
@@ -1,125 +1,213 @@
["when" "and" "or" "not in" "not" "in" "fn" "do" "end" "catch" "rescue" "after" "else"] @keyword
; The following code originates mostly from
; https://github.com/elixir-lang/tree-sitter-elixir, with minor edits to
; align the captures with helix. The following should be considered
; Copyright 2021 The Elixir Team
;
; Licensed under the Apache License, Version 2.0 (the "License");
; you may not use this file except in compliance with the License.
; You may obtain a copy of the License at
;
; https://www.apache.org/licenses/LICENSE-2.0
;
; Unless required by applicable law or agreed to in writing, software
; distributed under the License is distributed on an "AS IS" BASIS,
; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
; See the License for the specific language governing permissions and
; limitations under the License.
Comment on lines +1 to +16
Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Is this ok to add? I don't really know what to do here since I'm effectively copying https://github.com/elixir-lang/tree-sitter-elixir/blob/c3b82ff9160d4780afbba5249b9de884e379c8dd/queries/highlights.scm and making minor edits to align the scopes.

I think it's relatively common practice to do the copying part, especially for queries from the repositories in the @tree-sitter organization, but the attribution part is not very common (e.g. https://github.com/nvim-treesitter/nvim-treesitter/blob/58dd95f4a4db38a011c8f28564786c9d98b010c8/queries/c_sharp/highlights.scm).

@jonatanklosko do you have thoughts on this?

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This looks good to me! Generally I don't mind if it's just a link for the reference, but from formal point of view that's probably the proper way :)

cc @josevalim


; Reserved keywords

["when" "and" "or" "not" "in" "not in" "fn" "do" "end" "catch" "rescue" "after" "else"] @keyword

; Operators

; * doc string
(unary_operator
operator: "@" @comment.block.documentation
operand: (call
target: (identifier) @comment.block.documentation.__attribute__
(arguments
[
(string) @comment.block.documentation
(charlist) @comment.block.documentation
(sigil
quoted_start: _ @comment.block.documentation
quoted_end: _ @comment.block.documentation) @comment.block.documentation
(boolean) @comment.block.documentation
]))
(#match? @comment.block.documentation.__attribute__ "^(moduledoc|typedoc|doc)$"))

; * module attribute
(unary_operator
operator: "@" @variable.property
operand: [
(identifier) @variable.property
(call
target: (identifier) @variable.property)
(boolean) @variable.property
(nil) @variable.property
])

; * capture operator
(unary_operator
operator: "&"
operand: [
(integer) @operator
(binary_operator
left: [
(call target: (dot left: (_) right: (identifier) @function))
(identifier) @function
] operator: "/" right: (integer) @operator)
])

(operator_identifier) @operator

(unary_operator
operator: _ @operator)

(binary_operator
operator: _ @operator)

(dot
operator: _ @operator)

(stab_clause
operator: _ @operator)

; Literals

(nil) @constant.builtin

(boolean) @constant.builtin.boolean

[(true) (false) (nil)] @constant.builtin
[
(integer)
(float)
] @number

(alias) @type

(keyword
[(keyword_literal)
":"] @tag)
(call
target: (dot
left: (atom) @type))

(keyword
(keyword_string
[(string_start)
(string_content)
(string_end)] @tag))
(char) @constant.character

[(atom_literal)
(atom_start)
(atom_content)
(atom_end)] @tag
; Quoted content

[(comment)
(unused_identifier)] @comment
(interpolation "#{" @escape "}" @escape) @embedded

(escape_sequence) @escape

(call function: (function_identifier) @keyword
(#match? @keyword "^(defmodule|defexception|defp|def|with|case|cond|raise|import|require|use|defmacrop|defmacro|defguardp|defguard|defdelegate|defstruct|alias|defimpl|defprotocol|defoverridable|receive|if|for|try|throw|unless|reraise|super|quote|unquote|unquote_splicing)$"))

(call function: (function_identifier) @keyword
[(call
function: (function_identifier) @function
(arguments
[(identifier) @variable.parameter
(_ (identifier) @variable.parameter)
(_ (_ (identifier) @variable.parameter))
(_ (_ (_ (identifier) @variable.parameter)))
(_ (_ (_ (_ (identifier) @variable.parameter))))
(_ (_ (_ (_ (_ (identifier) @variable.parameter)))))]))
(binary_op
left:
(call
function: (function_identifier) @function
(arguments
[(identifier) @variable.parameter
(_ (identifier) @variable.parameter)
(_ (_ (identifier) @variable.parameter))
(_ (_ (_ (identifier) @variable.parameter)))
(_ (_ (_ (_ (identifier) @variable.parameter))))
(_ (_ (_ (_ (_ (identifier) @variable.parameter)))))]))
[
(atom)
(quoted_atom)
(keyword)
(quoted_keyword)
] @string.special.symbol

[
(string)
(charlist)
] @string

; Note that we explicitly target sigil quoted start/end, so they are not overridden by delimiters

(sigil
(sigil_name) @__name__
quoted_start: _ @string
quoted_end: _ @string
(#match? @__name__ "^[sS]$")) @string

(sigil
(sigil_name) @__name__
quoted_start: _ @string.regex
quoted_end: _ @string.regex
(#match? @__name__ "^[rR]$")) @string.regex

(sigil
(sigil_name) @__name__
quoted_start: _ @string.special
quoted_end: _ @string.special) @string.special

; Calls

; * definition keyword
(call
target: (identifier) @keyword
(#match? @keyword "^(def|defdelegate|defexception|defguard|defguardp|defimpl|defmacro|defmacrop|defmodule|defn|defnp|defoverridable|defp|defprotocol|defstruct)$"))

; * kernel or special forms keyword
(call
target: (identifier) @keyword
(#match? @keyword "^(alias|case|cond|else|for|if|import|quote|raise|receive|require|reraise|super|throw|try|unless|unquote|unquote_splicing|use|with)$"))

; * function call
(call
target: [
; local
(identifier) @function
; remote
(dot
right: (identifier) @function)
])

; * just identifier in function definition
(call
target: (identifier) @keyword
(arguments
[
(identifier) @function
(binary_operator
left: (identifier) @function
operator: "when")
(binary_op
left: (identifier) @variable.parameter
operator: _ @function
right: (identifier) @variable.parameter)]
(#match? @keyword "^(defp|def|defmacrop|defmacro|defguardp|defguard|defdelegate)$"))

(call (function_identifier) @keyword
[(call
function: (function_identifier) @function)
(identifier) @function
(binary_op
left:
[(call
function: (function_identifier) @function)
(identifier) @function]
operator: "when")]
(#match? @keyword "^(defp|def|defmacrop|defmacro|defguardp|defguard|defdelegate)$"))

(anonymous_function
(stab_expression
left: (bare_arguments
[(identifier) @variable.parameter
(_ (identifier) @variable.parameter)
(_ (_ (identifier) @variable.parameter))
(_ (_ (_ (identifier) @variable.parameter)))
(_ (_ (_ (_ (identifier) @variable.parameter))))
(_ (_ (_ (_ (_ (identifier) @variable.parameter)))))])))

(unary_op
operator: "@"
(call (identifier) @attribute
(heredoc
[(heredoc_start)
(heredoc_content)
(heredoc_end)] @doc))
(#match? @attribute "^(doc|moduledoc)$"))

(module) @type

(unary_op
operator: "@" @attribute
[(call
function: (function_identifier) @attribute)
(identifier) @attribute])

(unary_op
operator: _ @operator)

(binary_op
operator: _ @operator)

(heredoc
[(heredoc_start)
(heredoc_content)
(heredoc_end)] @string)

(string
[(string_start)
(string_content)
(string_end)] @string)

(sigil_start) @string.special
(sigil_content) @string
(sigil_end) @string.special

(interpolation
"#{" @punctuation.special
"}" @punctuation.special)
])
(#match? @keyword "^(def|defdelegate|defguard|defguardp|defmacro|defmacrop|defn|defnp|defp)$"))

; * pipe into identifier (definition)
(call
target: (identifier) @keyword
(arguments
(binary_operator
operator: "|>"
right: (identifier) @variable))
(#match? @keyword "^(def|defdelegate|defguard|defguardp|defmacro|defmacrop|defn|defnp|defp)$"))

; * pipe into identifier (function call)
(binary_operator
operator: "|>"
right: (identifier) @function)

; Identifiers

; * special
(
(identifier) @constant.builtin
(#match? @constant.builtin "^(__MODULE__|__DIR__|__ENV__|__CALLER__|__STACKTRACE__)$")
)

; * unused
(
(identifier) @comment
(#match? @comment "^_")
)

; * regular
(identifier) @variable

; Comment

(comment) @comment

; Punctuation

[
"%"
] @punctuation

[
","
"->"
"."
";"
] @punctuation.delimiter

[
Expand All @@ -133,6 +221,4 @@
">>"
] @punctuation.bracket

(special_identifier) @function.special

(ERROR) @warning