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 | 660 |
1 files changed, 311 insertions, 349 deletions
diff --git a/runtime/queries/haskell/highlights.scm b/runtime/queries/haskell/highlights.scm index b0efb5b4..162b0a17 100644 --- a/runtime/queries/haskell/highlights.scm +++ b/runtime/queries/haskell/highlights.scm @@ -1,44 +1,267 @@ -;---------------------------------------------------------------------------- -; 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 - "->") +;; ---------------------------------------------------------------------------- +;; Literals and comments -(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 () +(exp_apply + (exp_name + (variable) @function.builtin + (#any-of? @function.builtin + ; built in functions from the Haskell prelude (https://hackage.haskell.org/package/base-4.21.0.0/docs/Prelude.html) + ; basic data types + "not" + "maybe" + "either" + + ; tuples + "fst" + "snd" + "curry" + "uncurry" + + ; Ord + "compare" + "min" + "max" + + ; Enum + "succ" + "pred" + "toEnum" + "fromEnum" + "enumFrom" + "enumFromThen" + "enumFromThenTo" + + ; Num + "negate" + "abs" + "signum" + "fromInteger" + + ; Real + "toRational" + + ; Integral + "quot" + "rem" + "div" + "mod" + "quotRem" + "divMod" + "toInteger" + + ; Fractional + "recip" + "fromRational" + + ; Floating + "exp" + "log" + "sqrt" + "logBase" + "sin" + "cos" + "tan" + "asin" + "acos" + "atan" + "sinh" + "cosh" + "tanh" + "asinh" + "acosh" + "atanh" + + ; RealFrac + "properFraction" + "truncate" + "round" + "ceiling" + "floor" + + ; RealFloat + "floatRadix" + "floatDigits" + "floatRange" + "decodeFloat" + "encodeFloat" + "exponent" + "significand" + "scaleFloat" + "isNaN" + "isInfinite" + "isDenormalized" + "isNegativeZero" + "isIEEE" + "atan2" + + ; Numeric functions + "subtract" + "even" + "odd" + "gcd" + "lcm" + "fromIntegral" + "realToFrac" + + ; Monoid + "mempty" + "mconcat" + "mappend" + + ; Functor + "fmap" + + ; Applicative + "liftA2" + "pure" + + ; Monad + "return" + + ; MonadFail + "fail" + "mapM_" + "sequence_" + + ; Foldable + "foldMap" + "foldr" + "foldl" + "foldl'" + "foldr1" + "foldl1" + "elem" + "maximum" + "minimum" + "sum" + "product" + + ; Traversable + "traverse" + "sequenceA" + "mapM" + "sequence" + + ; miscellaneous + "id" + "const" + "flip" + "until" + "asTypeOf" + "error" + "errorWithoutStackTrace" + "undefined" + + ; List + "map" + "filter" + "head" + "last" + "tail" + "init" + "null" + "length" + "reverse" + + ; Foldable + "and" + "or" + "any" + "all" + "concat" + "concatMap" + + ; Building lists + "scanl" + "scanl1" + "scanr" + "scanr1" + + ; Infinite lists + "iterate" + "repeat" + "replicate" + "cycle" + + ; Sublists + "take" + "drop" + "takeWhile" + "dropWhile" + "span" + "break" + "splitAt" + + ; Searching lists + "notElem" + "lookup" + + ; zipping and unzipping + "zip" + "zip3" + "zipWith" + "zipWith3" + "unzip" + "unzip3" + + ; String + "lines" + "words" + "unlines" + "unwords" + + ; Converting to String + "show" + "showList" + "shows" + "showChar" + "showString" + "showParen" + + ; Converting from String + "readsPrec" + "readList" + "reads" + "readParen" + "read" + "lex" + + ; Input and output + "putChar" + "putStr" + "putStrLn" + "print" + "getChar" + "getLine" + "getContents" + "interact" + + ; Files + "readFile" + "writeFile" + "appendFile" + "readIO" + "readLn" + + ; Exception handling + "ioError" + "userError") + ) +) + (comment) @comment -((haddock) @comment.documentation) -; ---------------------------------------------------------------------------- -; Punctuation +;; ---------------------------------------------------------------------------- +;; Punctuation + [ "(" ")" @@ -49,18 +272,34 @@ ] @punctuation.bracket [ - "," + (comma) ";" ] @punctuation.delimiter -; ---------------------------------------------------------------------------- -; Keywords, operators, includes + +;; ---------------------------------------------------------------------------- +;; Literals and comments + +(integer) @constant.numeric.integer +(exp_negation) @constant.numeric.integer +(exp_literal (float)) @constant.numeric.float +(char) @constant.character +(string) @string + +(comment) @comment + +(con_unit [ "(" ")" ] @constant.builtin) ; unit, as in () + + +;; ---------------------------------------------------------------------------- +;; Keywords, operators, includes + [ "forall" - ; "∀" ; utf-8 is not cross-platform safe -] @keyword.repeat + "∀" +] @keyword.control.repeat -(pragma) @keyword.directive +(pragma) @constant.macro [ "if" @@ -68,21 +307,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 +334,14 @@ "@" ] @operator -; TODO broken, also huh? -; ((qualified_module -; (module) @constructor) -; . -; (module)) - -(module - (module_id) @namespace) +(module) @namespace [ - "where" + (where) "let" "in" "class" "instance" - "pattern" "data" "newtype" "family" @@ -128,311 +360,41 @@ "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)) +;; ---------------------------------------------------------------------------- +;; Functions and variables + +(variable) @variable -; signatures that have a function type -; + binds that follow them -(decl/signature +(signature name: (variable) @type) +(function name: (variable) @function - type: (quantified_type)) + patterns: (patterns)) +((signature (fun)) . (function (variable) @function)) +((signature (context (fun))) . (function (variable) @function)) +((signature (forall (context (fun)))) . (function (variable) @function)) + +(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)) +(exp_infix (exp_name) @function) +(exp_apply . (exp_name (variable) @function)) +(exp_apply . (exp_name (qualified_variable (variable) @function))) -; ---------------------------------------------------------------------------- -; Types -(name) @type +(pat_wildcard) @variable -(type/star) @type +;; ---------------------------------------------------------------------------- +;; Types -; (variable) @type +(type) @type +(type_variable) @type.parameter (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 + +;; ---------------------------------------------------------------------------- +;; Quasi-quotes + +(quoter) @function +; Highlighting of quasiquote_body is handled by injections.scm |