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.scm | 387 |
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 |