Unnamed repository; edit this file 'description' to name the repository.
Diffstat (limited to 'runtime/queries/haskell/highlights.scm')
-rw-r--r--runtime/queries/haskell/highlights.scm471
1 files changed, 39 insertions, 432 deletions
diff --git a/runtime/queries/haskell/highlights.scm b/runtime/queries/haskell/highlights.scm
index b0efb5b4..dada80b6 100644
--- a/runtime/queries/haskell/highlights.scm
+++ b/runtime/queries/haskell/highlights.scm
@@ -1,438 +1,45 @@
-;----------------------------------------------------------------------------
-; Parameters and variables
-; NOTE: These are at the top, so that they have low priority,
-; and don't override destructured parameters
(variable) @variable
-
-(pattern/wildcard) @variable
-
-(decl/function
- patterns: (patterns
- (_) @variable.parameter))
-
-(expression/lambda
- (_)+ @variable.parameter
- "->")
-
-(decl/function
- (infix
- (pattern) @variable.parameter))
-
-; ----------------------------------------------------------------------------
-; Literals and comments
-(integer) @constant.numeric.integer
-
-(negation) @constant.numeric
-
-(expression/literal
- (float)) @constant.numeric.float
-
-(char) @constant.character
-
-(string) @string
-
-(unit) @string.special.symbol ; unit, as in ()
-
+(operator) @operator
+(exp_name (constructor) @constructor)
+(constructor_operator) @operator
+(module) @namespace
+(type) @type
+(type) @class
+(constructor) @constructor
+(pragma) @pragma
(comment) @comment
-
-((haddock) @comment.documentation)
-
-; ----------------------------------------------------------------------------
-; Punctuation
+(signature name: (variable) @fun_type_name)
+(function name: (variable) @function)
+(constraint class: (class_name (type)) @class)
+(class (class_head class: (class_name (type)) @class))
+(instance (instance_head class: (class_name (type)) @class))
+(integer) @number
+(exp_literal (float)) @number
+(char) @literal
+(con_unit) @literal
+(con_list) @literal
+(tycon_arrow) @operator
+(where) @keyword
+"module" @keyword
+"let" @keyword
+"in" @keyword
+"class" @keyword
+"instance" @keyword
+"data" @keyword
+"newtype" @keyword
+"family" @keyword
+"type" @keyword
+"import" @keyword
+"qualified" @keyword
+"as" @keyword
+"deriving" @keyword
+"via" @keyword
+"stock" @keyword
+"anyclass" @keyword
+"do" @keyword
+"mdo" @keyword
+"rec" @keyword
[
"("
")"
- "{"
- "}"
- "["
- "]"
] @punctuation.bracket
-
-[
- ","
- ";"
-] @punctuation.delimiter
-
-; ----------------------------------------------------------------------------
-; Keywords, operators, includes
-[
- "forall"
- ; "∀" ; utf-8 is not cross-platform safe
-] @keyword.repeat
-
-(pragma) @keyword.directive
-
-[
- "if"
- "then"
- "else"
- "case"
- "of"
-] @keyword.conditional
-
-[
- "import"
- "qualified"
- "module"
-] @keyword.import
-
-[
- (operator)
- (constructor_operator)
- (all_names)
- (wildcard)
- "."
- ".."
- "="
- "|"
- "::"
- "=>"
- "->"
- "<-"
- "\\"
- "`"
- "@"
-] @operator
-
-; TODO broken, also huh?
-; ((qualified_module
-; (module) @constructor)
-; .
-; (module))
-
-(module
- (module_id) @namespace)
-
-[
- "where"
- "let"
- "in"
- "class"
- "instance"
- "pattern"
- "data"
- "newtype"
- "family"
- "type"
- "as"
- "hiding"
- "deriving"
- "via"
- "stock"
- "anyclass"
- "do"
- "mdo"
- "rec"
- "infix"
- "infixl"
- "infixr"
-] @keyword
-
-; ----------------------------------------------------------------------------
-; Functions and variables
-(decl
- [
- name: (variable) @function
- names: (binding_list (variable) @function)
- ])
-
-(decl/bind
- name: (variable) @variable)
-
-; Consider signatures (and accompanying functions)
-; with only one value on the rhs as variables
-(decl/signature
- name: (variable) @variable
- type: (type))
-
-((decl/signature
- name: (variable) @variable.name
- type: (type))
- .
- (decl
- name: (variable) @variable)
- match: (_)
- (#eq? @variable.name @variable))
-
-; but consider a type that involves 'IO' a decl/function
-(decl/signature
- name: (variable) @function
- type: (type/apply
- constructor: (name) @type)
- (#eq? @type "IO"))
-
-((decl/signature
- name: (variable) @function.name
- type: (type/apply
- constructor: (name) @type)
- (#eq? @type "IO"))
- .
- (decl
- name: (variable) @function)
- match: (_)
- (#eq? @function.name @function))
-
-((decl/signature) @function
- .
- (decl/function
- name: (variable) @function))
-
-(decl/bind
- name: (variable) @function
- (match
- expression: (expression/lambda)))
-
-; view patterns
-(view_pattern
- [
- (expression/variable) @function.call
- (expression/qualified
- (variable) @function.call)
- ])
-
-; consider infix functions as operators
-(infix_id
- [
- (variable) @operator
- (qualified
- (variable) @operator)
- ])
-
-; decl/function calls with an infix operator
-; e.g. func <$> a <*> b
-(infix
- [
- (variable) @function.call
- (qualified
- ((module) @namespace
- (variable) @function.call))
- ]
- .
- (operator))
-
-; infix operators applied to variables
-((expression/variable) @variable
- .
- (operator))
-
-((operator)
- .
- [
- (expression/variable) @variable
- (expression/qualified
- (variable) @variable)
- ])
-
-; decl/function calls with infix operators
-([
- (expression/variable) @function.call
- (expression/qualified
- (variable) @function.call)
- ]
- .
- (operator) @operator
- (#any-of? @operator "$" "<$>" ">>=" "=<<"))
-
-; right hand side of infix operator
-((infix
- [
- (operator)
- (infix_id (variable))
- ] ; infix or `func`
- .
- [
- (variable) @function.call
- (qualified
- (variable) @function.call)
- ])
- .
- (operator) @operator
- (#any-of? @operator "$" "<$>" "=<<"))
-
-; decl/function composition, arrows, monadic composition (lhs)
-(
- [
- (expression/variable) @function
- (expression/qualified
- (variable) @function)
- ]
- .
- (operator) @operator
- (#any-of? @operator "." ">>>" "***" ">=>" "<=<"))
-
-; right hand side of infix operator
-((infix
- [
- (operator)
- (infix_id (variable))
- ] ; infix or `func`
- .
- [
- (variable) @function
- (qualified
- (variable) @function)
- ])
- .
- (operator) @operator
- (#any-of? @operator "." ">>>" "***" ">=>" "<=<"))
-
-; function composition, arrows, monadic composition (rhs)
-((operator) @operator
- .
- [
- (expression/variable) @function
- (expression/qualified
- (variable) @function)
- ]
- (#any-of? @operator "." ">>>" "***" ">=>" "<=<"))
-
-; function defined in terms of a function composition
-(decl/function
- name: (variable) @function
- (match
- expression: (infix
- operator: (operator) @operator
- (#any-of? @operator "." ">>>" "***" ">=>" "<=<"))))
-
-(apply
- [
- (expression/variable) @function.call
- (expression/qualified
- (variable) @function.call)
- ])
-
-; function compositions, in parentheses, applied
-; lhs
-(apply
- .
- (expression/parens
- (infix
- [
- (variable) @function.call
- (qualified
- (variable) @function.call)
- ]
- .
- (operator))))
-
-; rhs
-(apply
- .
- (expression/parens
- (infix
- (operator)
- .
- [
- (variable) @function.call
- (qualified
- (variable) @function.call)
- ])))
-
-; variables being passed to a function call
-(apply
- (_)
- .
- [
- (expression/variable) @variable
- (expression/qualified
- (variable) @variable)
- ])
-
-; main is always a function
-; (this prevents `main = undefined` from being highlighted as a variable)
-(decl/bind
- name: (variable) @function
- (#eq? @function "main"))
-
-; scoped function types (func :: a -> b)
-(signature
- pattern: (pattern/variable) @function
- type: (quantified_type))
-
-; signatures that have a function type
-; + binds that follow them
-(decl/signature
- name: (variable) @function
- type: (quantified_type))
-
-((decl/signature
- name: (variable) @function.name
- type: (quantified_type))
- .
- (decl/bind
- (variable) @function)
- (#eq? @function @function.name))
-
-; ----------------------------------------------------------------------------
-; Types
-(name) @type
-
-(type/star) @type
-
-; (variable) @type
-
-(constructor) @constructor
-
-; True or False
-((constructor) @constant.builtin.boolean
- (#any-of? @constant.builtin.boolean "True" "False"))
-
-; otherwise (= True)
-((variable) @constant.builtin.boolean
- (#eq? @constant.builtin.boolean "otherwise"))
-
-; ----------------------------------------------------------------------------
-; Quasi-quotes
-(quoter) @function.call
-
-(quasiquote
- [
- (quoter) @_name
- (_
- (variable) @_name)
- ]
- (#eq? @_name "qq")
- (quasiquote_body) @string)
-
-(quasiquote
- (_
- (variable) @_name)
- (#eq? @_name "qq")
- (quasiquote_body) @string)
-
-; namespaced quasi-quoter
-(quasiquote
- (_
- (module) @namespace
- .
- (variable) @function.call))
-
-; Highlighting of quasiquote_body for other languages is handled by injections.scm
-; ----------------------------------------------------------------------------
-; Exceptions/error handling
-((variable) @keyword.exception
- (#any-of? @keyword.exception
- "error" "undefined" "try" "tryJust" "tryAny" "catch" "catches" "catchJust" "handle" "handleJust"
- "throw" "throwIO" "throwTo" "throwError" "ioError" "mask" "mask_" "uninterruptibleMask"
- "uninterruptibleMask_" "bracket" "bracket_" "bracketOnErrorSource" "finally" "fail"
- "onException" "expectationFailure"))
-
-; ----------------------------------------------------------------------------
-; Debugging
-((variable) @keyword.debug
- (#any-of? @keyword.debug
- "trace" "traceId" "traceShow" "traceShowId" "traceWith" "traceShowWith" "traceStack" "traceIO"
- "traceM" "traceShowM" "traceEvent" "traceEventWith" "traceEventIO" "flushEventLog" "traceMarker"
- "traceMarkerIO"))
-
-; ----------------------------------------------------------------------------
-; Fields
-
-(field_name
- (variable) @variable.member)
-
-(import_name
- (name)
- .
- (children
- (variable) @variable.member))