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.scm387
1 files changed, 37 insertions, 350 deletions
diff --git a/runtime/queries/haskell/highlights.scm b/runtime/queries/haskell/highlights.scm
index b0efb5b4..5009f3b5 100644
--- a/runtime/queries/haskell/highlights.scm
+++ b/runtime/queries/haskell/highlights.scm
@@ -1,44 +1,20 @@
-;----------------------------------------------------------------------------
-; 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))
+;; ----------------------------------------------------------------------------
+;; Literals and comments
-(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
-
+(exp_negation) @constant.numeric.integer
+(exp_literal (float)) @constant.numeric.float
(char) @constant.character
-
(string) @string
-(unit) @string.special.symbol ; unit, as in ()
+(con_unit) @constant.builtin ; unit, as in ()
(comment) @comment
-((haddock) @comment.documentation)
-; ----------------------------------------------------------------------------
-; Punctuation
+;; ----------------------------------------------------------------------------
+;; Punctuation
+
[
"("
")"
@@ -49,18 +25,15 @@
] @punctuation.bracket
[
- ","
+ (comma)
";"
] @punctuation.delimiter
-; ----------------------------------------------------------------------------
-; Keywords, operators, includes
-[
- "forall"
- ; "∀" ; utf-8 is not cross-platform safe
-] @keyword.repeat
-(pragma) @keyword.directive
+;; ----------------------------------------------------------------------------
+;; Keywords, operators, includes
+
+(pragma) @constant.macro
[
"if"
@@ -68,21 +41,22 @@
"else"
"case"
"of"
-] @keyword.conditional
+] @keyword.control.conditional
[
"import"
"qualified"
"module"
-] @keyword.import
+] @keyword.control.import
[
(operator)
(constructor_operator)
+ (type_operator)
+ (tycon_arrow)
+ (qualified_module) ; grabs the `.` (dot), ex: import System.IO
(all_names)
(wildcard)
- "."
- ".."
"="
"|"
"::"
@@ -94,22 +68,17 @@
"@"
] @operator
-; TODO broken, also huh?
-; ((qualified_module
-; (module) @constructor)
-; .
-; (module))
-
-(module
- (module_id) @namespace)
+(qualified_module (module) @constructor)
+(qualified_type (module) @namespace)
+(qualified_variable (module) @namespace)
+(import (module) @namespace)
[
- "where"
+ (where)
"let"
"in"
"class"
"instance"
- "pattern"
"data"
"newtype"
"family"
@@ -123,316 +92,34 @@
"do"
"mdo"
"rec"
+ "forall"
+ "∀"
"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))
+;; ----------------------------------------------------------------------------
+;; Functions and variables
-; infix operators applied to variables
-((expression/variable) @variable
- .
- (operator))
+(signature name: (variable) @type)
+(function name: (variable) @function)
-((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))
+(variable) @variable
+"_" @variable.builtin
-; signatures that have a function type
-; + binds that follow them
-(decl/signature
- name: (variable) @function
- type: (quantified_type))
+(exp_infix (variable) @operator) ; consider infix functions as operators
-((decl/signature
- name: (variable) @function.name
- type: (quantified_type))
- .
- (decl/bind
- (variable) @function)
- (#eq? @function @function.name))
+("@" @namespace) ; "as" pattern operator, e.g. x@Constructor
-; ----------------------------------------------------------------------------
-; Types
-(name) @type
-(type/star) @type
+;; ----------------------------------------------------------------------------
+;; Types
-; (variable) @type
+(type) @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))
+((constructor) @_bool (#match? @_bool "(True|False)")) @constant.builtin.boolean