UNPKG

tm-grammars

Version:
1,829 lines (1,828 loc) 66.9 kB
{ "displayName": "Haskell", "fileTypes": [ "hs", "hs-boot", "hsig" ], "name": "haskell", "patterns": [ { "include": "#liquid_haskell" }, { "include": "#comment_like" }, { "include": "#numeric_literals" }, { "include": "#string_literal" }, { "include": "#char_literal" }, { "match": "(?<![#@])-}", "name": "invalid" }, { "captures": { "1": { "name": "punctuation.paren.haskell" }, "2": { "name": "punctuation.paren.haskell" } }, "match": "(\\()\\s*(\\))", "name": "constant.language.unit.haskell" }, { "captures": { "1": { "name": "punctuation.paren.haskell" }, "2": { "name": "keyword.operator.hash.haskell" }, "3": { "name": "keyword.operator.hash.haskell" }, "4": { "name": "punctuation.paren.haskell" } }, "match": "(\\()(#)\\s*(#)(\\))", "name": "constant.language.unit.unboxed.haskell" }, { "captures": { "1": { "name": "punctuation.paren.haskell" }, "2": { "name": "punctuation.paren.haskell" } }, "match": "(\\()\\s*,[,\\s]*(\\))", "name": "support.constant.tuple.haskell" }, { "captures": { "1": { "name": "punctuation.paren.haskell" }, "2": { "name": "keyword.operator.hash.haskell" }, "3": { "name": "keyword.operator.hash.haskell" }, "4": { "name": "punctuation.paren.haskell" } }, "match": "(\\()(#)\\s*,[,\\s]*(#)(\\))", "name": "support.constant.tuple.unboxed.haskell" }, { "captures": { "1": { "name": "punctuation.bracket.haskell" }, "2": { "name": "punctuation.bracket.haskell" } }, "match": "(\\[)\\s*(])", "name": "constant.language.empty-list.haskell" }, { "begin": "(\\b(?<!')(module)|^(signature))\\b((?!'))", "beginCaptures": { "2": { "name": "keyword.other.module.haskell" }, "3": { "name": "keyword.other.signature.haskell" } }, "end": "(?=\\b(?<!')where\\b(?!'))", "name": "meta.declaration.module.haskell", "patterns": [ { "include": "#comment_like" }, { "include": "#module_name" }, { "include": "#module_exports" }, { "match": "[a-z]+", "name": "invalid" } ] }, { "include": "#ffi" }, { "begin": "^(\\s*)(class)\\b((?!'))", "beginCaptures": { "2": { "name": "keyword.other.class.haskell" } }, "end": "(?=(?<!')\\bwhere\\b(?!'))|(?=[;}])|^(?!\\1\\s+\\S|\\s*(?:$|\\{-[^@]|--+(?![[\\p{S}\\p{P}]&&[^]\"'(),;\\[_`{}]]).*$))", "name": "meta.declaration.class.haskell", "patterns": [ { "include": "#comment_like" }, { "include": "#where" }, { "include": "#type_signature" } ] }, { "begin": "^(\\s*)(data|newtype)(?:\\s+(instance))?\\s+((?:(?!(?<![[\\p{S}\\p{P}]&&[^]\"'(),;\\[_`{}]])(?:=|--+)(?![[\\p{S}\\p{P}]&&[^]\"'(),;\\[_`{}]])|\\b(?<!')(?:where|deriving)\\b(?!')|\\{-).)*)(?=\\b(?<!'')where\\b(?!''))", "beginCaptures": { "2": { "name": "keyword.other.$2.haskell" }, "3": { "name": "keyword.other.instance.haskell" }, "4": { "patterns": [ { "include": "#type_signature" } ] } }, "end": "(?=(?<!')\\bderiving\\b(?!'))|(?=[;}])|^(?!\\1\\s+\\S|\\s*(?:$|\\{-[^@]|--+(?![[\\p{S}\\p{P}]&&[^]\"'(),;\\[_`{}]]).*$))", "name": "meta.declaration.$2.generalized.haskell", "patterns": [ { "include": "#comment_like" }, { "begin": "(?<!')\\b(where)\\s*(\\{)(?!-)", "beginCaptures": { "1": { "name": "keyword.other.where.haskell" }, "2": { "name": "punctuation.brace.haskell" } }, "end": "(})", "endCaptures": { "1": { "name": "punctuation.brace.haskell" } }, "patterns": [ { "include": "#comment_like" }, { "include": "#gadt_constructor" }, { "match": ";", "name": "punctuation.semicolon.haskell" } ] }, { "match": "\\b(?<!')(where)\\b(?!')", "name": "keyword.other.where.haskell" }, { "include": "#deriving" }, { "include": "#gadt_constructor" } ] }, { "include": "#role_annotation" }, { "begin": "^(\\s*)(pattern)\\s+(.*?)\\s+(::|∷)(?![[\\p{S}\\p{P}]&&[^]\"'(),;\\[_`{}]])", "beginCaptures": { "2": { "name": "keyword.other.pattern.haskell" }, "3": { "patterns": [ { "include": "#comma" }, { "include": "#data_constructor" } ] }, "4": { "name": "keyword.operator.double-colon.haskell" } }, "end": "(?=[;}])|^(?!\\1\\s+\\S|\\s*(?:$|\\{-[^@]|--+(?![[\\p{S}\\p{P}]&&[^]\"'(),;\\[_`{}]]).*$))", "name": "meta.declaration.pattern.type.haskell", "patterns": [ { "include": "#type_signature" } ] }, { "begin": "^\\s*(pattern)\\b(?!')", "captures": { "1": { "name": "keyword.other.pattern.haskell" } }, "end": "(?=[;}])|^(?!\\1\\s+\\S|\\s*(?:$|\\{-[^@]|--+(?![[\\p{S}\\p{P}]&&[^]\"'(),;\\[_`{}]]).*$))", "name": "meta.declaration.pattern.haskell", "patterns": [ { "include": "$self" } ] }, { "begin": "^(\\s*)(data|newtype)(?:\\s+(family|instance))?\\s+(((?!(?<![[\\p{S}\\p{P}]&&[^]\"'(),;\\[_`{}]])(?:=|--+)(?![[\\p{S}\\p{P}]&&[^]\"'(),;\\[_`{}]])|\\b(?<!')(?:where|deriving)\\b(?!')|\\{-).)*)", "beginCaptures": { "2": { "name": "keyword.other.$2.haskell" }, "3": { "name": "keyword.other.$3.haskell" }, "4": { "patterns": [ { "include": "#type_signature" } ] } }, "end": "(?=[;}])|^(?!\\1\\s+\\S|\\s*(?:$|\\{-[^@]|--+(?![[\\p{S}\\p{P}]&&[^]\"'(),;\\[_`{}]]).*$))", "name": "meta.declaration.$2.algebraic.haskell", "patterns": [ { "include": "#comment_like" }, { "include": "#deriving" }, { "include": "#forall" }, { "include": "#adt_constructor" }, { "include": "#context" }, { "include": "#record_decl" }, { "include": "#type_signature" } ] }, { "begin": "^(\\s*)(type)\\s+(family)\\b(?!')(((?!(?<![[\\p{S}\\p{P}]&&[^]\"'(),;\\[_`{}]])(?:=|--+)(?![[\\p{S}\\p{P}]&&[^]\"'(),;\\[_`{}]])|\\b(?<!')where\\b(?!')|\\{-).)*)", "beginCaptures": { "2": { "name": "keyword.other.type.haskell" }, "3": { "name": "keyword.other.family.haskell" }, "4": { "patterns": [ { "include": "#comment_like" }, { "include": "#where" }, { "include": "#type_signature" } ] } }, "end": "(?=[;}])|^(?!\\1\\s+\\S|\\s*(?:$|\\{-[^@]|--+(?![[\\p{S}\\p{P}]&&[^]\"'(),;\\[_`{}]]).*$))", "name": "meta.declaration.type.family.haskell", "patterns": [ { "include": "#comment_like" }, { "include": "#where" }, { "include": "#type_signature" } ] }, { "begin": "^(\\s*)(type)(?:\\s+(instance))?\\s+(((?!(?<![[\\p{S}\\p{P}]&&[^]\"'(),;\\[_`{}]])(?:=|--+|::|∷)(?![[\\p{S}\\p{P}]&&[^]\"'(),;\\[_`{}]])|\\{-).)*)", "beginCaptures": { "2": { "name": "keyword.other.type.haskell" }, "3": { "name": "keyword.other.instance.haskell" }, "4": { "patterns": [ { "include": "#type_signature" } ] } }, "end": "(?=[;}])|^(?!\\1\\s+\\S|\\s*(?:$|\\{-[^@]|--+(?![[\\p{S}\\p{P}]&&[^]\"'(),;\\[_`{}]]).*$))", "name": "meta.declaration.type.haskell", "patterns": [ { "include": "#type_signature" } ] }, { "begin": "^(\\s*)(instance)\\b((?!'))", "beginCaptures": { "2": { "name": "keyword.other.instance.haskell" } }, "end": "(?=\\b(?<!')(where)\\b(?!'))|(?=[;}])|^(?!\\1\\s+\\S|\\s*(?:$|\\{-[^@]|--+(?![[\\p{S}\\p{P}]&&[^]\"'(),;\\[_`{}]]).*$))", "name": "meta.declaration.instance.haskell", "patterns": [ { "include": "#comment_like" }, { "include": "#where" }, { "include": "#type_signature" } ] }, { "begin": "^(\\s*)(import)\\b((?!'))", "beginCaptures": { "2": { "name": "keyword.other.import.haskell" } }, "end": "(?=\\b(?<!')(where)\\b(?!'))|(?=[;}])|^(?!\\1\\s+\\S|\\s*(?:$|\\{-[^@]|--+(?![[\\p{S}\\p{P}]&&[^]\"'(),;\\[_`{}]]).*$))", "name": "meta.import.haskell", "patterns": [ { "include": "#comment_like" }, { "include": "#where" }, { "captures": { "1": { "name": "keyword.other.$1.haskell" } }, "match": "(qualified|as|hiding)" }, { "include": "#module_name" }, { "include": "#module_exports" } ] }, { "include": "#deriving" }, { "include": "#layout_herald" }, { "include": "#keyword" }, { "captures": { "1": { "name": "keyword.other.$1.haskell" }, "2": { "patterns": [ { "include": "#comment_like" }, { "include": "#integer_literals" }, { "include": "#infix_op" } ] } }, "match": "^\\s*(infix[lr]?)\\s+(.*)", "name": "meta.fixity-declaration.haskell" }, { "include": "#overloaded_label" }, { "include": "#type_application" }, { "include": "#reserved_symbol" }, { "include": "#fun_decl" }, { "include": "#qualifier" }, { "include": "#data_constructor" }, { "include": "#start_type_signature" }, { "include": "#prefix_op" }, { "include": "#infix_op" }, { "begin": "(\\()(#)\\s", "beginCaptures": { "1": { "name": "punctuation.paren.haskell" }, "2": { "name": "keyword.operator.hash.haskell" } }, "end": "(#)(\\))", "endCaptures": { "1": { "name": "keyword.operator.hash.haskell" }, "2": { "name": "punctuation.paren.haskell" } }, "patterns": [ { "include": "#comma" }, { "include": "$self" } ] }, { "begin": "(\\()", "beginCaptures": { "1": { "name": "punctuation.paren.haskell" } }, "end": "(\\))", "endCaptures": { "1": { "name": "punctuation.paren.haskell" } }, "patterns": [ { "include": "#comma" }, { "include": "$self" } ] }, { "include": "#quasi_quote" }, { "begin": "(\\[)", "beginCaptures": { "1": { "name": "punctuation.bracket.haskell" } }, "end": "(])", "endCaptures": { "1": { "name": "punctuation.bracket.haskell" } }, "patterns": [ { "include": "#comma" }, { "include": "$self" } ] }, { "include": "#record" } ], "repository": { "adt_constructor": { "patterns": [ { "include": "#comment_like" }, { "begin": "(?<![[\\p{S}\\p{P}]&&[^]\"'(),;\\[_`{}]])(?:(=)|(\\|))(?![[\\p{S}\\p{P}]&&[^]\"'(),;\\[_`{}]])", "beginCaptures": { "1": { "name": "keyword.operator.eq.haskell" }, "2": { "name": "keyword.operator.pipe.haskell" } }, "end": "(?:\\G|^)\\s*(?:(?<!')\\b(['._\\p{Ll}\\p{Lu}\\p{Lt}\\d]+)|('?(?<paren>\\((?:[^()]?|\\g<paren>)*\\)))|('?(?<brac>\\((?:[^]\\[]?|\\g<brac>)*])))\\s*(?:(?<![[\\p{S}\\p{P}]&&[^]\"'(),;\\[_`{}]])(:[[\\p{S}\\p{P}]&&[^]\"'(),;\\[_`{}]]*)|(`)([\\p{Lu}\\p{Lt}]['_\\p{Ll}\\p{Lu}\\p{Lt}\\d]*)(`))|(?<!')\\b([\\p{Lu}\\p{Lt}]['_\\p{Ll}\\p{Lu}\\p{Lt}\\d]*)|(\\()\\s*(:[[\\p{S}\\p{P}]&&[^]\"'(),;\\[_`{}]]*)\\s*(\\))", "endCaptures": { "1": { "patterns": [ { "include": "#type_signature" } ] }, "10": { "name": "constant.other.haskell" }, "11": { "name": "punctuation.paren.haskell" }, "12": { "name": "constant.other.operator.haskell" }, "13": { "name": "punctuation.paren.haskell" }, "2": { "patterns": [ { "include": "#type_signature" } ] }, "4": { "patterns": [ { "include": "#type_signature" } ] }, "6": { "name": "constant.other.operator.haskell" }, "7": { "name": "punctuation.backtick.haskell" }, "8": { "name": "constant.other.haskell" }, "9": { "name": "punctuation.backtick.haskell" } }, "patterns": [ { "include": "#comment_like" }, { "include": "#deriving" }, { "include": "#record_decl" }, { "include": "#forall" }, { "include": "#context" } ] } ] }, "block_comment": { "applyEndPatternLast": 1, "begin": "\\{-", "captures": { "0": { "name": "punctuation.definition.comment.haskell" } }, "end": "-}", "name": "comment.block.haskell", "patterns": [ { "include": "#block_comment" } ] }, "char_literal": { "captures": { "1": { "name": "punctuation.definition.string.begin.haskell" }, "2": { "name": "constant.character.escape.haskell" }, "3": { "name": "constant.character.escape.octal.haskell" }, "4": { "name": "constant.character.escape.hexadecimal.haskell" }, "5": { "name": "constant.character.escape.control.haskell" }, "6": { "name": "punctuation.definition.string.end.haskell" } }, "match": "(?<!['_\\p{Ll}\\p{Lu}\\p{Lt}\\d])(')(?:[ -\\[\\]-~]|(\\\\(?:NUL|SOH|STX|ETX|EOT|ENQ|ACK|BEL|BS|HT|LF|VT|FF|CR|SO|SI|DLE|DC1|DC2|DC3|DC4|NAK|SYN|ETB|CAN|EM|SUB|ESC|FS|GS|RS|US|SP|DEL|[\"\\&'\\\\abfnrtv]))|(\\\\o[0-7]+)|(\\\\x\\h+)|(\\\\\\^[@-_]))(')", "name": "string.quoted.single.haskell" }, "comma": { "match": ",", "name": "punctuation.separator.comma.haskell" }, "comment_like": { "patterns": [ { "include": "#cpp" }, { "include": "#pragma" }, { "include": "#comments" } ] }, "comments": { "patterns": [ { "begin": "^(\\s*)(--\\s[$|])", "beginCaptures": { "2": { "name": "punctuation.whitespace.comment.leading.haskell" } }, "end": "(?=^(?!\\1--+(?![[\\p{S}\\p{P}]&&[^]\"'(),;\\[_`{}]])))", "name": "comment.block.documentation.haskell" }, { "begin": "(^[\\t ]+)?(--\\s[*^])", "beginCaptures": { "1": { "name": "punctuation.whitespace.comment.leading.haskell" } }, "end": "\\n", "name": "comment.line.documentation.haskell" }, { "applyEndPatternLast": 1, "begin": "\\{-\\s?[$*^|]", "captures": { "0": { "name": "punctuation.definition.comment.haskell" } }, "end": "-}", "name": "comment.block.documentation.haskell", "patterns": [ { "include": "#block_comment" } ] }, { "begin": "(^[\\t ]+)?(?=--+(?![[\\p{S}\\p{P}]&&[^]\"'(),;\\[_`{}]]))", "beginCaptures": { "1": { "name": "punctuation.whitespace.comment.leading.haskell" } }, "end": "(?!\\G)", "patterns": [ { "begin": "--", "beginCaptures": { "0": { "name": "punctuation.definition.comment.haskell" } }, "end": "\\n", "name": "comment.line.double-dash.haskell" } ] }, { "include": "#block_comment" } ] }, "context": { "captures": { "1": { "patterns": [ { "include": "#comment_like" }, { "include": "#type_signature" } ] }, "2": { "name": "keyword.operator.big-arrow.haskell" } }, "match": "(.*)(?<![[\\p{S}\\p{P}]&&[^]\"'(),;\\[_`{}]])(=>|⇒)(?![[\\p{S}\\p{P}]&&[^]\"'(),;\\[_`{}]])" }, "cpp": { "captures": { "1": { "name": "punctuation.definition.preprocessor.c" } }, "match": "^(#).*$", "name": "meta.preprocessor.c" }, "data_constructor": { "match": "\\b(?<!')[\\p{Lu}\\p{Lt}]['_\\p{Ll}\\p{Lu}\\p{Lt}\\d]*(?!['.\\w])", "name": "constant.other.haskell" }, "deriving": { "patterns": [ { "begin": "^(\\s*)(deriving)\\s+(?:(via|stock|newtype|anyclass)\\s+)?", "beginCaptures": { "2": { "name": "keyword.other.deriving.haskell" }, "3": { "name": "keyword.other.deriving.strategy.$3.haskell" } }, "end": "(?=[;}])|^(?!\\1\\s+\\S|\\s*(?:$|\\{-[^@]|--+(?![[\\p{S}\\p{P}]&&[^]\"'(),;\\[_`{}]]).*$))", "name": "meta.deriving.haskell", "patterns": [ { "include": "#comment_like" }, { "match": "(?<!')\\b(instance)\\b(?!')", "name": "keyword.other.instance.haskell" }, { "captures": { "1": { "name": "keyword.other.deriving.strategy.$1.haskell" } }, "match": "(?<!')\\b(via|stock|newtype|anyclass)\\b(?!')" }, { "include": "#type_signature" } ] }, { "begin": "(deriving)(?:\\s+(stock|newtype|anyclass))?\\s*(\\()", "beginCaptures": { "1": { "name": "keyword.other.deriving.haskell" }, "2": { "name": "keyword.other.deriving.strategy.$2.haskell" }, "3": { "name": "punctuation.paren.haskell" } }, "end": "(\\))", "endCaptures": { "1": { "name": "punctuation.paren.haskell" } }, "name": "meta.deriving.haskell", "patterns": [ { "include": "#type_signature" } ] }, { "captures": { "1": { "name": "keyword.other.deriving.haskell" }, "2": { "name": "keyword.other.deriving.strategy.$2.haskell" }, "3": { "patterns": [ { "include": "#type_signature" } ] }, "5": { "name": "keyword.other.deriving.strategy.via.haskell" }, "6": { "patterns": [ { "include": "#type_signature" } ] } }, "match": "(deriving)(?:\\s+(stock|newtype|anyclass))?\\s+([\\p{Lu}\\p{Lt}]['_\\p{Ll}\\p{Lu}\\p{Lt}\\d]*)(\\s+(via)\\s+(.*)$)?", "name": "meta.deriving.haskell" }, { "match": "(?<!')\\b(via)\\b(?!')", "name": "keyword.other.deriving.strategy.via.haskell" } ] }, "double_colon": { "captures": { "1": { "name": "keyword.operator.double-colon.haskell" } }, "match": "\\s*(::|∷)(?![[\\p{S}\\p{P}]&&[^]\"'(),;\\[_`{}]])\\s*" }, "export_constructs": { "patterns": [ { "include": "#comment_like" }, { "begin": "\\b(?<!')(pattern)\\b(?!')", "beginCaptures": { "1": { "name": "keyword.other.pattern.haskell" } }, "end": "([\\p{Lu}\\p{Lt}]['_\\p{Ll}\\p{Lu}\\p{Lt}\\d]*)|(\\()\\s*(:[[\\p{S}\\p{P}]&&[^]\"'(),;\\[_`{}]]+)\\s*(\\))", "endCaptures": { "1": { "name": "constant.other.haskell" }, "2": { "name": "punctuation.paren.haskell" }, "3": { "name": "constant.other.operator.haskell" }, "4": { "name": "punctuation.paren.haskell" } }, "patterns": [ { "include": "#comment_like" } ] }, { "begin": "\\b(?<!')(type)\\b(?!')", "beginCaptures": { "1": { "name": "keyword.other.type.haskell" } }, "end": "([\\p{Lu}\\p{Lt}]['_\\p{Ll}\\p{Lu}\\p{Lt}\\d]*)|(\\()\\s*([[\\p{S}\\p{P}]&&[^]\"'(),;\\[_`{}]]+)\\s*(\\))", "endCaptures": { "1": { "name": "storage.type.haskell" }, "2": { "name": "punctuation.paren.haskell" }, "3": { "name": "storage.type.operator.haskell" }, "4": { "name": "punctuation.paren.haskell" } }, "patterns": [ { "include": "#comment_like" } ] }, { "match": "(?<!')\\b[_\\p{Ll}]['_\\p{Ll}\\p{Lu}\\p{Lt}\\d]*", "name": "entity.name.function.haskell" }, { "match": "(?<!')\\b[\\p{Lu}\\p{Lt}]['_\\p{Ll}\\p{Lu}\\p{Lt}\\d]*", "name": "storage.type.haskell" }, { "include": "#record_wildcard" }, { "include": "#reserved_symbol" }, { "include": "#prefix_op" } ] }, "ffi": { "begin": "^(\\s*)(foreign)\\s+((?:im|ex)port)\\s+", "beginCaptures": { "2": { "name": "keyword.other.foreign.haskell" }, "3": { "name": "keyword.other.$3.haskell" } }, "end": "(?=[;}])|^(?!\\1\\s+\\S|\\s*(?:$|\\{-[^@]|--+(?![[\\p{S}\\p{P}]&&[^]\"'(),;\\[_`{}]]).*$))", "name": "meta.$3.foreign.haskell", "patterns": [ { "include": "#comment_like" }, { "captures": { "1": { "name": "keyword.other.calling-convention.$1.haskell" } }, "match": "\\b(?<!')(ccall|cplusplus|dotnet|jvm|stdcall|prim|capi)\\s+" }, { "begin": "(?=\")|(?=\\b(?<!')([_\\p{Ll}]['_\\p{Ll}\\p{Lu}\\p{Lt}\\d]*)\\b(?!'))", "end": "(?=(::|∷)(?![[\\p{S}\\p{P}]&&[^]\"'(),;\\[_`{}]]))", "patterns": [ { "include": "#comment_like" }, { "captures": { "1": { "name": "keyword.other.safety.$1.haskell" }, "2": { "name": "entity.name.foreign.haskell", "patterns": [ { "include": "#string_literal" } ] }, "3": { "name": "entity.name.function.haskell" }, "4": { "name": "entity.name.function.infix.haskell" } }, "match": "\\b(?<!')(safe|unsafe|interruptible)\\b(?!')\\s*(\"(?:\\\\\"|[^\"])*\")?\\s*(?:\\b(?<!'')([_\\p{Ll}]['_\\p{Ll}\\p{Lu}\\p{Lt}\\d]*)\\b(?!')|\\(\\s*(?!--+\\))([[\\p{S}\\p{P}]&&[^]\"'(),;\\[_`{}]]+)\\s*\\))" }, { "captures": { "1": { "name": "keyword.other.safety.$1.haskell" }, "2": { "name": "entity.name.foreign.haskell", "patterns": [ { "include": "#string_literal" } ] } }, "match": "\\b(?<!')(safe|unsafe|interruptible)\\b(?!')\\s*(\"(?:\\\\\"|[^\"])*\")?\\s*$" }, { "captures": { "0": { "name": "entity.name.foreign.haskell", "patterns": [ { "include": "#string_literal" } ] } }, "match": "\"(?:\\\\\"|[^\"])*\"" }, { "captures": { "1": { "name": "entity.name.function.haskell" }, "2": { "name": "punctuation.paren.haskell" }, "3": { "name": "entity.name.function.infix.haskell" }, "4": { "name": "punctuation.paren.haskell" } }, "match": "\\b(?<!'')([_\\p{Ll}]['_\\p{Ll}\\p{Lu}\\p{Lt}\\d]*)\\b(?!')|(\\()\\s*(?!--+\\))([[\\p{S}\\p{P}]&&[^]\"'(),;\\[_`{}]]+)\\s*(\\))" } ] }, { "include": "#double_colon" }, { "include": "#type_signature" } ] }, "float_literals": { "captures": { "1": { "name": "constant.numeric.floating.decimal.haskell" }, "2": { "name": "constant.numeric.floating.hexadecimal.haskell" } }, "match": "\\b(?<!')(?:([0-9][0-9_]*\\.[0-9][0-9_]*(?:[Ee][-+]?[0-9][0-9_]*)?|[0-9][0-9_]*[Ee][-+]?[0-9][0-9_]*)|(0(?:[Xx]_*\\h[_\\h]*\\.\\h[_\\h]*(?:[Pp][-+]?[0-9][0-9_]*)?|[Xx]_*\\h[_\\h]*[Pp][-+]?[0-9][0-9_]*)))\\b(?!')" }, "forall": { "begin": "\\b(?<!')(forall|∀)\\b(?!')", "beginCaptures": { "1": { "name": "keyword.other.forall.haskell" } }, "end": "(\\.)|(->|→)", "endCaptures": { "1": { "name": "keyword.operator.period.haskell" }, "2": { "name": "keyword.operator.arrow.haskell" } }, "patterns": [ { "include": "#comment_like" }, { "include": "#type_variable" }, { "include": "#type_signature" } ] }, "fun_decl": { "begin": "^(\\s*)(?<fn>(?:[_\\p{Ll}]['_\\p{Ll}\\p{Lu}\\p{Lt}\\d]*#*|\\(\\s*(?!--+\\))[[\\p{S}\\p{P}]&&[^]\"'(),:;\\[_`{}]][[\\p{S}\\p{P}]&&[^]\"'(),;\\[_`{}]]*\\s*\\))(?:\\s*,\\s*\\g<fn>)?)\\s*(?<![[\\p{S}\\p{P}]&&[^]\"'),;_`}]])(::|∷)(?![[\\p{S}\\p{P}]&&[^\"'(,;\\[_`{]])", "beginCaptures": { "2": { "name": "entity.name.function.haskell", "patterns": [ { "include": "#reserved_symbol" }, { "include": "#prefix_op" } ] }, "3": { "name": "keyword.operator.double-colon.haskell" } }, "end": "(?=(?<![[\\p{S}\\p{P}]&&[^]\"'(),;\\[_`{}]])((<-|←)|(=)|(-<|↢)|(-<<|⤛))([]\"'(),;\\[_`{}[^\\p{S}\\p{P}]]))|(?=[;}])|^(?!\\1\\s+\\S|\\s*(?:$|\\{-[^@]|--+(?![[\\p{S}\\p{P}]&&[^]\"'(),;\\[_`{}]]).*$))", "name": "meta.function.type-declaration.haskell", "patterns": [ { "include": "#type_signature" } ] }, "gadt_constructor": { "patterns": [ { "begin": "^(\\s*)(?:\\b((?<!')[\\p{Lu}\\p{Lt}]['_\\p{Ll}\\p{Lu}\\p{Lt}\\d]*)|(\\()\\s*(:[[\\p{S}\\p{P}]&&[^]\"'(),;\\[_`{}]]*)\\s*(\\)))", "beginCaptures": { "2": { "name": "constant.other.haskell" }, "3": { "name": "punctuation.paren.haskell" }, "4": { "name": "constant.other.operator.haskell" }, "5": { "name": "punctuation.paren.haskell" } }, "end": "(?=\\b(?<!'')deriving\\b(?!'))|(?=[;}])|^(?!\\1\\s+\\S|\\s*(?:$|\\{-[^@]|--+(?![[\\p{S}\\p{P}]&&[^]\"'(),;\\[_`{}]]).*$))", "patterns": [ { "include": "#comment_like" }, { "include": "#deriving" }, { "include": "#double_colon" }, { "include": "#record_decl" }, { "include": "#type_signature" } ] }, { "begin": "\\b((?<!')[\\p{Lu}\\p{Lt}][_\\p{Ll}\\p{Lu}\\p{Lt}\\d]*)|(\\()\\s*(:[[\\p{S}\\p{P}]&&[^]\"'(),;\\[_`{}]]*)\\s*(\\))", "beginCaptures": { "1": { "name": "constant.other.haskell" }, "2": { "name": "punctuation.paren.haskell" }, "3": { "name": "constant.other.operator.haskell" }, "4": { "name": "punctuation.paren.haskell" } }, "end": "$", "patterns": [ { "include": "#comment_like" }, { "include": "#deriving" }, { "include": "#double_colon" }, { "include": "#record_decl" }, { "include": "#type_signature" } ] } ] }, "infix_op": { "patterns": [ { "captures": { "1": { "name": "keyword.operator.promotion.haskell" }, "2": { "name": "entity.name.namespace.haskell" }, "3": { "name": "keyword.operator.infix.haskell" } }, "match": "((?:(?<!'')('')?[\\p{Lu}\\p{Lt}]['_\\p{Ll}\\p{Lu}\\p{Lt}\\d]*\\.)*)(#+|[[\\p{S}\\p{P}]&&[^]\"'(),;\\[_`{}]]+(?<!#))" }, { "captures": { "1": { "name": "punctuation.backtick.haskell" }, "2": { "name": "entity.name.namespace.haskell" }, "3": { "patterns": [ { "include": "#data_constructor" } ] }, "4": { "name": "punctuation.backtick.haskell" } }, "match": "(`)((?:[\\p{Lu}\\p{Lt}]['_\\p{Ll}\\p{Lu}\\p{Lt}\\d]*\\.)*)([_\\p{Ll}\\p{Lu}]['_\\p{Ll}\\p{Lu}\\p{Lt}\\d]*)(`)", "name": "keyword.operator.function.infix.haskell" } ] }, "inline_phase": { "begin": "\\[", "beginCaptures": { "0": { "name": "punctuation.bracket.haskell" } }, "end": "]", "endCaptures": { "0": { "name": "punctuation.bracket.haskell" } }, "name": "meta.inlining-phase.haskell", "patterns": [ { "match": "~", "name": "punctuation.tilde.haskell" }, { "include": "#integer_literals" }, { "match": "\\w*", "name": "invalid" } ] }, "integer_literals": { "captures": { "1": { "name": "constant.numeric.integral.decimal.haskell" }, "2": { "name": "constant.numeric.integral.hexadecimal.haskell" }, "3": { "name": "constant.numeric.integral.octal.haskell" }, "4": { "name": "constant.numeric.integral.binary.haskell" } }, "match": "\\b(?<!')(?:([0-9][0-9_]*)|(0[Xx]_*\\h[_\\h]*)|(0[Oo]_*[0-7][0-7_]*)|(0[Bb]_*[01][01_]*))\\b(?!')" }, "keyword": { "captures": { "1": { "name": "keyword.other.$1.haskell" }, "2": { "name": "keyword.control.$2.haskell" } }, "match": "\\b(?<!')(?:(where|let|in|default)|(m?do|if|then|else|case|of|proc|rec))\\b(?!')" }, "layout_herald": { "begin": "(?<!')\\b(?:(where|let|m?do)|(of))\\s*(\\{)(?!-)", "beginCaptures": { "1": { "name": "keyword.other.$1.haskell" }, "2": { "name": "keyword.control.of.haskell" }, "3": { "name": "punctuation.brace.haskell" } }, "end": "(})", "endCaptures": { "1": { "name": "punctuation.brace.haskell" } }, "patterns": [ { "include": "$self" }, { "match": ";", "name": "punctuation.semicolon.haskell" } ] }, "liquid_haskell": { "begin": "\\{-@", "end": "@-}", "name": "block.liquidhaskell.haskell", "patterns": [ { "include": "$self" } ] }, "module_exports": { "applyEndPatternLast": 1, "begin": "\\(", "beginCaptures": { "0": { "name": "punctuation.paren.haskell" } }, "end": "\\)", "endCaptures": { "0": { "name": "punctuation.paren.haskell" } }, "name": "meta.declaration.exports.haskell", "patterns": [ { "include": "#comment_like" }, { "captures": { "1": { "name": "keyword.other.module.haskell" } }, "match": "\\b(?<!')(module)\\b(?!')" }, { "include": "#comma" }, { "include": "#export_constructs" }, { "begin": "\\(", "beginCaptures": { "0": { "name": "punctuation.paren.haskell" } }, "end": "\\)", "endCaptures": { "0": { "name": "punctuation.paren.haskell" } }, "patterns": [ { "include": "#comment_like" }, { "include": "#record_wildcard" }, { "include": "#export_constructs" }, { "include": "#comma" } ] } ] }, "module_name": { "match": "(?<conid>[\\p{Lu}\\p{Lt}]['_\\p{Ll}\\p{Lu}\\p{Lt}\\d]*(\\.\\g<conid>)?)", "name": "entity.name.namespace.haskell" }, "numeric_literals": { "patterns": [ { "include": "#float_literals" }, { "include": "#integer_literals" } ] }, "overloaded_label": { "patterns": [ { "captures": { "1": { "name": "keyword.operator.prefix.hash.haskell" }, "2": { "patterns": [ { "include": "#string_literal" } ] } }, "match": "(?<![[_\\p{Ll}\\p{Lu}\\p{Lt}\\d\\p{S}\\p{P}]&&[^(,;\\[`{]])(#)(?:(\"(?:\\\\\"|[^\"])*\")|['._\\p{Ll}\\p{Lu}\\p{Lt}\\d]+)", "name": "entity.name.label.haskell" } ] }, "pragma": { "begin": "\\{-#", "end": "#-}", "name": "meta.preprocessor.haskell", "patterns": [ { "begin": "(?i)\\b(?<!')(LANGUAGE)\\b(?!')", "beginCaptures": { "1": { "name": "keyword.other.preprocessor.pragma.haskell" } }, "end": "(?=#-})", "patterns": [ { "match": "(?:No)?(?:AutoDeriveTypeable|DatatypeContexts|DoRec|IncoherentInstances|MonadFailDesugaring|MonoPatBinds|NullaryTypeClasses|OverlappingInstances|PatternSignatures|RecordPuns|RelaxedPolyRec)", "name": "invalid.deprecated" }, { "captures": { "1": { "name": "keyword.other.preprocessor.extension.haskell" } }, "match": "((?:No)?(?:AllowAmbiguousTypes|AlternativeLayoutRule|AlternativeLayoutRuleTransitional|Arrows|BangPatterns|BinaryLiterals|CApiFFI|CPP|CUSKs|ConstrainedClassMethods|ConstraintKinds|DataKinds|DefaultSignatures|DeriveAnyClass|DeriveDataTypeable|DeriveFoldable|DeriveFunctor|DeriveGeneric|DeriveLift|DeriveTraversable|DerivingStrategies|DerivingVia|DisambiguateRecordFields|DoAndIfThenElse|BlockArguments|DuplicateRecordFields|EmptyCase|EmptyDataDecls|EmptyDataDeriving|ExistentialQuantification|ExplicitForAll|ExplicitNamespaces|ExtendedDefaultRules|FlexibleContexts|FlexibleInstances|ForeignFunctionInterface|FunctionalDependencies|GADTSyntax|GADTs|GHCForeignImportPrim|Generali[sz]edNewtypeDeriving|ImplicitParams|ImplicitPrelude|ImportQualifiedPost|ImpredicativeTypes|TypeFamilyDependencies|InstanceSigs|ApplicativeDo|InterruptibleFFI|JavaScriptFFI|KindSignatures|LambdaCase|LiberalTypeSynonyms|MagicHash|MonadComprehensions|MonoLocalBinds|MonomorphismRestriction|MultiParamTypeClasses|MultiWayIf|NumericUnderscores|NPlusKPatterns|NamedFieldPuns|NamedWildCards|NegativeLiterals|HexFloatLiterals|NondecreasingIndentation|NumDecimals|OverloadedLabels|OverloadedLists|OverloadedStrings|PackageImports|ParallelArrays|ParallelListComp|PartialTypeSignatures|PatternGuards|PatternSynonyms|PolyKinds|PolymorphicComponents|QuantifiedConstraints|PostfixOperators|QuasiQuotes|Rank2Types|RankNTypes|RebindableSyntax|RecordWildCards|RecursiveDo|RelaxedLayout|RoleAnnotations|ScopedTypeVariables|StandaloneDeriving|StarIsType|StaticPointers|Strict|StrictData|TemplateHaskell|TemplateHaskellQuotes|StandaloneKindSignatures|TraditionalRecordSyntax|TransformListComp|TupleSections|TypeApplications|TypeInType|TypeFamilies|TypeOperators|TypeSynonymInstances|UnboxedTuples|UnboxedSums|UndecidableInstances|UndecidableSuperClasses|UnicodeSyntax|UnliftedFFITypes|UnliftedNewtypes|ViewPatterns))" }, { "include": "#comma" } ] }, { "begin": "(?i)\\b(?<!')(SPECIALI[SZ]E)(?:\\s*(\\[[^]\\[]*])?\\s*|\\s+)(instance)\\b(?!')", "beginCaptures": { "1": { "name": "keyword.other.preprocessor.pragma.haskell" }, "2": { "patterns": [ { "include": "#inline_phase" } ] }, "3": { "name": "keyword.other.instance.haskell" } }, "end": "(?=#-})", "patterns": [ { "include": "#type_signature" } ] }, { "begin": "(?i)\\b(?<!')(SPECIALI[SZ]E)\\b(?!')(?:\\s+(INLINE)\\b(?!'))?\\s*(\\[[^]\\[]*])?\\s*", "beginCaptures": { "1": { "name": "keyword.other.preprocessor.pragma.haskell" }, "2": { "name": "keyword.other.preprocessor.pragma.haskell" }, "3": { "patterns": [ { "include": "#inline_phase" } ] } }, "end": "(?=#-})", "patterns": [ { "include": "$self" } ] }, { "match": "(?i)\\b(?<!')(LANGUAGE|OPTIONS_GHC|INCLUDE|MINIMAL|UNPACK|OVERLAPS|INCOHERENT|NOUNPACK|SOURCE|OVERLAPPING|OVERLAPPABLE|INLINE|NOINLINE|INLINE?ABLE|CONLIKE|LINE|COLUMN|RULES|COMPLETE)\\b(?!')", "name": "keyword.other.preprocessor.haskell" }, { "begin": "(?i)\\b(DEPRECATED|WARNING)\\b", "beginCaptures": { "1": { "name": "keyword.other.preprocessor.pragma.haskell" } }, "end": "(?=#-})", "patterns": [ { "include": "#string_literal" } ] } ] }, "prefix_op": { "patterns": [ { "captures": { "1": { "name": "punctuation.paren.haskell" }, "2": { "name": "entity.name.function.infix.haskell" }, "3": { "name": "punctuation.paren.haskell" } }, "match": "(\\()\\s*(?!(?:--+|\\.\\.)\\))(#+|[[\\p{S}\\p{P}]&&[^]\"'(),;\\[_`{}]]+(?<!#))\\s*(\\))" } ] }, "qualifier": { "match": "\\b(?<!')[\\p{Lu}\\p{Lt}]['_\\p{Ll}\\p{Lu}\\p{Lt}\\d]*\\.", "name": "entity.name.namespace.haskell" }, "quasi_quote": { "patterns": [ { "begin": "(\\[)([dep])?(\\|\\|?)", "beginCaptures": { "1": { "name": "keyword.operator.quasi-quotation.begin.haskell" }, "2": { "name": "entity.name.quasi-quoter.haskell" }, "3": { "name": "keyword.operator.quasi-quotation.begin.haskell" } }, "end": "\\3]", "endCaptures": { "0": { "name": "keyword.operator.quasi-quotation.end.haskell" } }, "name": "meta.quasi-quotation.haskell", "patterns": [ { "include": "$self" } ] }, { "begin": "(\\[)(t)(\\|\\|?)", "beginCaptures": { "1": { "name": "keyword.operator.quasi-quotation.begin.haskell" }, "2": { "name": "entity.name.quasi-quoter.haskell" }, "3": { "name": "keyword.operator.quasi-quotation.begin.haskell" } }, "end": "\\3]", "endCaptures": { "0": { "name": "keyword.operator.quasi-quotation.end.haskell" } }, "name": "meta.quasi-quotation.haskell", "patterns": [ { "include": "#type_signature" } ] }, { "begin": "(\\[)(?:(\\$\\$)|(\\$))?(['._[^\\s\\p{S}\\p{P}]]*)(\\|\\|?)", "beginCaptures": { "1": { "name": "keyword.operator.quasi-quotation.begin.haskell" }, "2": { "name": "keyword.operator.prefix.double-dollar.haskell" }, "3": { "name": "keyword.operator.prefix.dollar.haskell" }, "4": { "name": "entity.name.quasi-quoter.haskell", "patterns": [ { "include": "#qualifier" } ] }, "5": { "name": "keyword.operator.quasi-quotation.begin.haskell" } }, "end": "\\5]", "endCaptures": { "0": { "name": "keyword.operator.quasi-quotation.end.haskell" } }, "name": "meta.quasi-quotation.haskell" } ] }, "record": { "begin": "(\\{)(?!-)", "beginCaptures": { "1": { "name": "punctuation.brace.haskell" } }, "end": "(?<!-)(})", "endCaptures": { "1": { "name": "punctuation.brace.haskell" } }, "name": "meta.record.haskell", "patterns": [ { "include": "#comment_like" }, { "include": "#record_field" } ] }, "record_decl": { "begin": "(\\{)(?!-)", "beginCaptures": { "1": { "name": "punctuation.brace.haskell" } }, "end": "(?<!-)(})", "endCaptures": { "1": { "name": "punctuation.brace.haskell" } }, "name": "meta.record.definition.haskell", "patterns": [ { "include": "#comment_like" }, { "include": "#record_decl_field" } ] }, "record_decl_field": { "begin": "([_\\p{Ll}]['_\\p{Ll}\\p{Lu}\\p{Lt}\\d]*)|(\\()\\s*([[\\p{S}\\p{P}]&&[^]\"'(),;\\[_`{}]]+)\\s*(\\))", "beginCaptures": { "1": { "name": "variable.other.member.definition.haskell" }, "2": { "name": "punctuation.paren.haskell" }, "3": { "name": "variable.other.member.definition.haskell" }, "4": { "name": "punctuation.paren.haskell" } }, "end": "(,)|(?=})", "endCaptures": { "1": { "name": "punctuation.comma.haskell" } }, "patterns": [ { "include": "#comment_like" }, { "include": "#comma" }, { "include": "#double_colon" }, { "include": "#type_signature" }, { "include": "#record_decl_field" } ] }, "record_field": { "patterns": [ { "begin": "([_\\p{Ll}\\p{Lu}]['._\\p{Ll}\\p{Lu}\\p{Lt}\\d]*)|(\\()\\s*([[\\p{S}\\p{P}]&&[^]\"'(),;\\[_`{}]]+)\\s*(\\))", "beginCaptures": { "1": { "name": "variable.other.member.haskell", "patterns": [ { "include": "#qualifier" } ] }, "2": { "name": "punctuation.paren.haskell" }, "3": { "name": "variable.other.member.haskell" }, "4": { "name": "punctuation.paren.haskell" } }, "end": "(,)|(?=})", "endCaptures": { "1": { "name": "punctuation.comma.haskell" } }, "patterns": [ { "include": "#comment_like" }, { "include": "#comma" }, { "include": "$self" } ] }, { "include": "#record_wildcard" } ] }, "record_wildcard": { "captures": { "1": { "name": "variable.other.member.wildcard.haskell" } }, "match": "(?<![[\\p{S}\\p{P}]&&[^]\"'(),;\\[_`{}]])(\\.\\.)(?![[\\p{S}\\p{P}]&&[^]\"'(),;\\[_`{}]])" }, "reserved_symbol": { "patterns": [ { "captures": { "1": { "name": "keyword.operator.double-dot.haskell" }, "10": { "name": "keyword.operator.arrow.tail.haskell" }, "11": { "name": "keyword.operator.arrow.tail.double.haskell" }, "12": { "name": "keyword.other.forall.haskell" }, "2": { "name": "keyword.operator.colon.haskell" }, "3": { "name": "keyword.operator.eq.haskell" },