-
-
Notifications
You must be signed in to change notification settings - Fork 2.6k
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
Changes from all commits
6c0786e
d1b434d
5db248c
95ab40d
b2655a7
c502caf
4771cc7
8f658f0
80b54f2
4d8eb09
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
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
There was a problem hiding this comment. Choose a reason for hiding this commentThe 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 @jonatanklosko do you have thoughts on this? There was a problem hiding this comment. Choose a reason for hiding this commentThe 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 | ||
|
||
[ | ||
|
@@ -133,6 +221,4 @@ | |
">>" | ||
] @punctuation.bracket | ||
|
||
(special_identifier) @function.special | ||
|
||
(ERROR) @warning |
There was a problem hiding this comment.
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