helix-mods/runtime/queries/erlang/highlights.scm
Michael Davis 82da9bd4f2 update Erlang grammar and queries
The update to the grammar itself covers the case where the document
is a single expression without a trailing newline such as "min(A, B)".
A small change to the parser now parses these expressions correctly
which improves the display of the function head in the signature
help popup.

The update to the queries marks 'andalso', 'orelse', 'not', etc. as
`@keyword.operator` which improves the look - it looks odd to see
operators that are words highlighted the same as tokens like '->'
or '=:='.
2022-05-25 21:26:26 +09:00

123 lines
2.6 KiB
Scheme

; 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
(arguments
(_) @keyword.directive)
(#match? @keyword "ifn?def"))
(attribute
name: (atom) @keyword
module: (atom) @module
(#eq? @keyword "(spec|callback)"))
; 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)
["case" "fun" "if" "of" "when" "end" "receive" "try" "catch" "after" "begin" "maybe"] @keyword
; Operators
(binary_operator
left: (atom) @function
operator: "/"
right: (integer) @constant.numeric.integer)
((binary_operator operator: _ @keyword.operator)
(#match? @keyword.operator "^\\w+$"))
((unary_operator operator: _ @keyword.operator)
(#match? @keyword.operator "^\\w+$"))
(binary_operator operator: _ @operator)
(unary_operator operator: _ @operator)
["/" ":" "#" "->"] @operator
(tripledot) @comment.discard
(comment) @comment
; Macros
(macro
"?"+ @keyword.directive
name: (_) @keyword.directive)
; Comments
((variable) @comment.discard
(#match? @comment.discard "^_"))
; Basic types
(variable) @variable
(atom) @string.special.symbol
(string) @string
(character) @constant.character
(integer) @constant.numeric.integer
(float) @constant.numeric.float
; Punctuation
["," "." "-" ";"] @punctuation.delimiter
["(" ")" "{" "}" "[" "]" "<<" ">>"] @punctuation.bracket
; (ERROR) @error