blob: 47ca4290ffd4f856c6d5fd9e9cf4ebba55ffa694 [file] [log] [blame] [raw]
// Copyright (c) 2012-2018, Matt Godbolt, Rubén Rincón, byteally
// All rights reserved.
//
// Redistribution and use in source and binary forms, with or without
// modification, are permitted provided that the following conditions are met:
//
// * Redistributions of source code must retain the above copyright notice,
// this list of conditions and the following disclaimer.
// * Redistributions in binary form must reproduce the above copyright
// notice, this list of conditions and the following disclaimer in the
// documentation and/or other materials provided with the distribution.
//
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
// ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
// LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
// CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
// SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
// INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
// CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
// POSSIBILITY OF SUCH DAMAGE.
"use strict";
// From https://github.com/byteally/monaco-haskell
// It does not work right now. Here as a reminder until the author fixes it
function definition() {
return {
module: /^(module)\b/,
import: /^(import)\b/,
module_name: /([A-Z][\w']*)(\.[A-Z][\w']*)*/,
module_exports: /([A-Z][\w']*)(\.[A-Z][\w']*)*/,
target: /([A-Z][\w']*)(\.[A-Z][\w']*)*/,
invalid: /[a-z]+/,
datatype: /[A-Z][\w]+/,
datatypekey: /Int|Float|Text/,
functions: /[a-z]+/,
datacons: /[A-Z][\w]+/,
typcons: /\s*[A-Z][\w]+/,
text: /[A-Z][\w]+/,
classname: /\s*[A-Z][\w]+/,
arguments: /[a-z][\w]*/,
reservedid: /qualified|hiding|case|default|deriving|do|else|if|import|in|infix|infixr|let|of|then|type|where|show|_/,
tokenizer: {
root: [
[/(@module)/, 'keyword.module.haskell', '@module'],
[/@import/, 'keyword.module.haskell', '@import'],
[/\bdata\b(?=@typcons)/, 'keyword', '@typcons'],
[/\bnewtype\b(?=\s*@typcons)/, 'keyword', '@typcons'],
[/\bclass\b(?=\s*@classname)/, 'keyword', '@classname'],
[/\bclass\b(?=\s*\()/, 'keyword', '@classname'],
[/@reservedid/, 'keyword'],
[/[a-z][\w]+(?=\s*?=)/, 'binderas', '@binder'],
[/[a-z][\w]+(?=\s*::)/, 'binderad', '@typconss'],
[/[a-z][\w]+(?=\s*?[a-z]\w*)/, 'binder', '@typconss'],
[/[a-z][\w]+(?=\s*?::\s*?@datatypekey)/, 'bind', '@binder'],
[/[a-z][\w]+(?=\s*?=\s*?@datacons)/, 'bindings'],
{include: '@whitespace'},
{include: '@comment'}
],
import: [
[/@module_name/, 'storage.module,haskell'],
[/(@module_name)(?=\s*as)/, 'storage.module.haskell'],
[/\b(qualified)\b(?=\s*@module_name)/, 'keyword'],
[/(@module_name)(?=\s*?\()/, 'storage.module.haskell'],
[/(@module_name)(?=\s*\bhiding\b)/, 'storage.module.haskell'],
[/\b(hiding)\b(?=\s*?\()/, 'keyword'],
[/\b(as)\b(?=\s*@module_name)/, 'keyword'],
[/\(/, 'openbracketss', '@functions'],
{include: '@comment'}
//{include:'@blockComment'}
],
module: [
[/(@module_name)/, 'storage.module.haskell'],
[/\(/, 'openbracket', '@module_exports'],
[/@reservedid/, 'keyword', '@pop'],
[/@invalid/, 'invalid'],
[/,/, 'commas'],
{include: '@whitespace'},
{include: '@comment'}
//{include:'@blockComment'}
],
functions: [
[/@datatype/, 'dcataype', '@datatype'],
[/@functions/, 'functions'],
[/,/, 'commas'],
[/\)(?=\))/, 'closebracket'],
[/\)/, 'closebracketalla', '@popall'],
{include: '@comment'}
//{include:'@blockComment'}
],
typconss: [
[/=/, 'eqals'],
[/\bundefined\b/, 'val', '@all'],
[/\bclass\b(?=\s*@classname)/, 'keyword', '@classname'],
[/\bclass\b(?=\s*\()/, 'keyword', '@classname'],
[/\binstance\b/, 'keyword', '@classname'],
[/\bdata\b(?=@typcons)/, 'keyword', '@typcons'],
[/\bnewtype\b(?=\s*@typcons)/, 'keyword', '@typcons'],
[/@reservedid/, 'keyword', '@function'],
[/[a-z]\w*/, 'arguments121'],
[/[a-z][\w]+(?=\s*=)/, 'binderad', '@datacons'],
[/[a-z][\w]+(?=\s*::)/, 'binderad', '@typconss'],
[/[a-z][\w]+(?=\s*[a-z]\w*)/, 'binderad', '@typconss'],
[/[a-z]\w*/, 'arguments121'],
[/::/, 'dcol', '@datacons'],
[/->/, 'pipes', '@binder'],
{include: '@whitespace'},
{include: '@comment'}
//{include:'@blockComment'}
],
function: [
[/@reservedid/, 'keyword'],
[/@datatypekey/, 'dtype'],
[/[a-z][\w]+(?=\s*::)/, 'binderad', '@typconss'],
[/[a-z][\w]+(?=\s*?[a-z]\w*)/, 'binder', '@typconss'],
[/[a-z]\w*/, 'arguments12'],
[/::/, 'dcol'],
[/->/, 'pipe'],
[/\bclass\b(?=\s*@classname)/, 'keyword', '@classname'],
[/\bclass\b(?=\s*\()/, 'keyword', '@classname'],
[/\binstance\b/, 'keyword', '@classname'],
[/\bdata\b(?=@typcons)/, 'keyword', '@typcons'],
[/\bnewtype\b(?=\s*@typcons)/, 'keyword'],
{include: '@comment'}
//{include:'@blockComment'}
],
typcons: [
[/=>/, 'pipes'],
[/->/, 'pipe', '@bind'],
[/\bclass\b(?=\s*@classname)/, 'keyword', '@classname'],
[/\bclass\b(?=\s*\()/, 'keyword', '@classname'],
[/\binstance\b/, 'keyword', '@classname'],
[/\bdata\b(?=@typcons)/, 'keyword', '@typcons'],
[/\bnewtype\b(?=\s*@typcons)/, 'keyword'],
[/@reservedid(?=\s*\()/, 'keyword', '@typcons'],
[/@reservedid(?=\s*[A-Z][\w]+)/, 'keyword', '@typcons'],
[/@reservedid/, 'keyword', '@binder'],
[/@datatypekey/, 'dtypes2'],
[/[A-Z][\w]+(?=\s*,)/, 'classname', '@types'],
[/[A-Z][\w]+(?=\s*[a-z][\w]*\s*,)/, 'classname', '@types'],
[/@arguments(?=\s*,\s*)/, 'argument', '@types'],
[/[A-Z][\w]+/, 'typecons'],
[/[a-z][\w]+(?=\s*?=)/, 'binderas', '@binder'],
[/[a-z][\w]+(?=\s*::)/, 'binderad', '@typconss'],
[/[a-z][\w]+(?=\s*?[a-z]\w*)/, 'bind', '@typconss'],
[/[a-z][\w]+(?=\s*?::\s*?@datatypekey)/, 'bind', '@binder'],
[/[a-z][\w]+(?=\s*?=\s*?@datacons)/, 'bindings'],
[/{/, 'oopen', '@initialise'],
[/[a-z]\w*/, 'arguments13'],
[/\(/, 'open_bracket'],
[/=/, 'Equalss', '@datacons'],
[/,/, 'commaa'],
[/::/, 'colondouble', '@datacons'],
[/\)/, 'closebrak', '@initialise'],
[/\)(?=\s* \t\r\n\bdata\b)/, 'closed', '@popall'],
{include: '@whitespace'},
{include: '@comment'}
// {include:'@blockComment'}
],
bind: [
[/@datatypekey/, 'dtyp', '@typconss'],
[/[a-z][\w]*/, 'typvar', '@typconss'],
[/\(/, 'opens', '@typcons'],
{include: '@whitespace'}
],
types: [
[/[a-z][\w]*/, 'argument123'],
[/,/, 'commaa'],
[/[A-Z][\w]*/, 'classname'],
[/\)/, 'closex'],
[/=>/, 'pipe', '@type'],
{include: '@whitespace'},
{include: '@comment'}
// {include:'@blockComment'}
],
datacons: [
[/=/, 'Equalst'],
[/\bclass\b(?=\s*@classname)/, 'keyword', '@classname'],
[/\bclass\b(?=\s*\()/, 'keyword', '@classname'],
[/\bundefined\b/, 'val', '@all'],
[/\bnewtype\b(?=\s*@typcons)/, 'keyword', '@typcons'],
[/\binstance\b/, 'keyword', '@classname'],
[/[a-z][\w]*(?=\s*?->)/, 'typvar', '@typcons'],
[/@reservedid(?=\s*\()/, 'keyword', '@typcons'],
[/@datatypekey(?=\s*[a-z]\w*)/, 'dtypess1', '@typcons'],
[/@datatypekey/, 'dtypes1'],
[/@reservedid(?=\s*[A-Z][\w]+)/, 'keyword', '@typcons'],
[/@reservedid/, 'keyword'],
[/[A-Z][\w]+(?=\s*=>)/, 'classname', '@type'],
[/[A-Z][\w]+(?=\s*[a-z][\w]*\s*=>)/, 'classnames', '@type'],
[/[a-z][\w]+(?=\s*?::)/, 'bindera', '@typconss'],
[/[a-z][\w]+(?=\s*?[a-z]\w*)/, 'binde', '@typconss'],
[/[a-z][\w]+/, 'binder', '@typconss'],
[/\bdata\b(?=@typcons)/, 'keyword', '@typcons'],
[/@datacons/, 'datacon'],
[/@reservedid/, 'keyword', '@binder'],
[/@datacons(?=\s*@datatypekey)/, 'datacons'],
[/[a-z][\w]+(?=\s*?::\s*@datatype,)/, 'bindera', '@binder'],
[/[a-z][\w]+(?=\s*?::\s*@datatype,)/, 'bindera', '@binder'],
[/[a-z][\w]+(?=\s*?=\s*(\d)+,)/, 'binderb', '@binder'],
[/[a-z][\w]+(?=\s*?=\s*(\d)+)/, 'binderc', '@binder'],
[/[a-z][\w]+(?=\s*?=\s*"(\w)+.+?")/, 'binderd', '@binder'],
[/[a-z][\w]+(?=\s*?=\s*"(\w)+.+?",)/, 'bindere', '@binder'],
[/{/, 'openbracketd', '@initialise'],
[/"\w+.+"/, 'type'],
[/\d+/, 'type'],
[/->/, 'pip', '@binder'],
[/,/, 'commas33', '@initialise'],
[/\|/, 'alternate'],
[/\(/, 'open', '@typcons'],
[/}/, 'clos', '@initialise'],
{include: '@whitespace'},
{include: '@comment'}
// {include:'@blockComment'}
],
type: [
[/[a-z][\w]*/, 'argument'],
[/,/, 'commas'],
[/=>/, 'pipe'],
[/[A-Z][\w]*/, 'typcons'],
[/->/, 'pipe', '@binder'],
{include: '@whitespace'},
{include: '@comment'}
// {include:'@blockComment'}
],
all: [
[/=/, 'equals'],
[/\binstance\b/, 'keyword', '@classname'],
[/\bclass\b(?=\s*@classname)/, 'keyword', '@classname'],
[/\bclass\b(?=\s*\()/, 'keyword', '@classname'],
[/\bdata\b(?=@typcons)/, 'keyword', '@typcons'],
[/\bnewtype\b(?=\s*@typcons)/, 'keyword'],
[/@reservedid/, 'keyword', '@typconss'],
[/[A-Z][\w]+/, 'typecons', '@typcons'],
[/[a-z][\w]+(?=\s*=)/, 'binderad', '@typconss'],
[/[a-z][\w]+(?=\s*::)/, 'binderad', '@typconss'],
[/[a-z][\w]+(?=\s*?[a-z]\w*)/, 'binder', '@typconss'],
{include: '@comment'}
// {include:'@blockComment'}
],
selectors: [
[/[a-z][\w]+/, 'selectors'],
[/=/, 'Equalsto', '@datacons'],
[/"(\w)+.+"/, 'type'],
[/\d+/, 'type'],
[/}/, 'closeS'],
{include: '@comment'}
// {include:'@blockComment'}
],
initialise: [
[/\binstance\b/, 'keyword', '@classname'],
[/\bdata\b(?=\s*@typcons)/, 'keyword', '@typcons'],
[/\bnewtype\b(?=\s*@typcons)/, 'keyword', '@typcons'],
[/\bclass\b(?=\s*@classname)/, 'keyword', '@classname'],
[/\bclass\b(?=\s*\()/, 'keyword', '@classname'],
[/@datatypekey(?=\s*)/, 'datatype'],
[/{/, 'open'],
[/@reservedid/, 'keyword'],
[/\(/, 'opn', '@typcons'],
[/\|/, 'alternates', '@datacons'],
[/,/, 'comma3'],
[/[a-z][\w]+(?=\s*?=\s*?\b@reservedid\b)/, 'binder', '@all'],
[/[a-z][\w]+(?=\s*?=\s*?\bundefined\b)/, 'binder', '@binder'],
[/[a-z][\w]+(?=\s*?=\s*?@datacons)/, 'bindings'],
[/[a-z][\w]+(?=\s*?::\s*@datatypekey)/, 'bindera', '@binder'],
[/[a-z][\w]+(?=\s*::)/, 'binder', '@binder'],
[/[a-z][\w]+(?=\s*?::\s*@datatypekey,)/, 'binderb', '@binder'],
[/[a-z][\w]+(?=\s*?=\s*(\d)+,)/, 'binderc', '@binder'],
[/[a-z][\w]+(?=\s*?=\s*(\d)+)/, 'binderd', '@binder'],
[/[a-z][\w]+(?=\s*?=\s*"(\w)+.+?",)/, 'binders', '@binder'],
[/[a-z][\w]+(?=\s*?=\s*"(\w)+.+?")/, 'bindere', '@binder'],
[/[a-z][\w]+(?=\s*[a-z]\w*)/, 'binder', '@typconss'],
[/::/, 'doublecolons', '@datacons'],
[/=/, 'Equalsto', '@datacons'],
{include: '@whitespace'},
{include: '@comment'}
// {include:'@blockComment'}
],
classname: [
[/\binstance\b/, 'keyword', '@classname'],
[/\bclass\b(?=\s*@classname)/, 'keyword', '@classname'],
[/\bclass\b(?=\s*\()/, 'keyword', '@classname'],
[/\bdata\b(?=\s*?@typcons)/, 'keyword', '@typcons'],
[/\bnewtype\b(?=\s*@typcons)/, 'keyword', '@typcons'],
[/[a-z][\w]+(?=\s*?=)/, 'binderas', '@binder'],
[/[a-z][\w]+(?=\s*?::\s*?@datatypekey)/, 'binderas', '@binder'],
[/@datatypekey/, 'dtype'],
[/[A-Z][\w]*/, 'classname'],
[/@reservedid/, 'keyword', '@typcons'],
[/[a-z]\w*/, 'arguments'],
[/,/, 'commas'],
[/\(/, 'openbracket'],
[/\)/, 'closebracket'],
[/=>/, 'pipe', '@superclass'],
{include: '@whitespace'},
{include: '@comment'}
// {include:'@blockComment'}
],
binder: [
[/\binstance\b/, 'keyword', '@classname'],
[/\bclass\b(?=\s*@classname)/, 'keyword', '@classname'],
[/\bclass\b(?=\s*\()/, 'keyword', '@classname'],
[/\bdata\b(?=\s*?@typcons)/, 'keyword', '@typcons'],
[/@reservedid/, 'keyword'],
[/[a-z][\w]+(?=\s*::)/, 'binder'],
[/[a-z][\w]+(?=\s*=)/, 'binder'],
[/::/, 'doublecolons', '@datacons'],
[/@datatypekey(?=\s*[a-z]\w*)/, 'dtypes', '@typcons'],
[/@datatypekey/, 'dtypess'],
[/\bnewtype\b(?=\s*@typcons)/, 'keyword', '@typcons'],
[/->/, 'pipe'],
[/\d+/, 'digit'],
[/{/, 'open'],
[/=/, 'Equalsto', '@datacons'],
[/\(/, 'opn', '@typcons'],
[/\|/, 'alternates', '@datacons'],
[/,/, 'comma3'],
[/[a-z][\w]*/, 'typvar', '@typconss'],
[/\bclass\b(?=\s*@classname)/, 'keyword', '@classname'],
[/\bclass\b(?=\s*\()/, 'keyword', '@classname'],
[/\binstance\b/, 'keyword', '@classname'],
[/\bundefined\b/, 'value'],
{include: '@whitespace'},
{include: '@comment'}
// {include:'@blockComment'}
],
superclass: [
[/[A-Z][\w]+/, 'typeclass'],
[/@reservedid/, 'keyword', '@typcons'],
[/[a-z][\w]*/, 'typearguments'],
{include: '@whitespace'},
{include: '@comment'}
//{include:'@blockComment'}
],
argument: [
[/[a-z][\w]*(?=\s*->)/, 'argument'],
[/->/, 'pipea', '@binder'],
{include: '@whitespace'},
{include: '@comment'}
// {include:'@blockComment'}
],
datatype: [
[/\(/, 'openbracketd', '@pop'],
{include: '@comment'}
//{include:'@blockComment'}
],
module_exports: [
[/(@module_exports)/, 'storage.module.haskell'],
[/\(/, 'openbracket', '@target'],
[/\)/, 'closebracket', '@popall'],
[/,/, 'comma1'],
[/@invalid/, 'invalid'],
{include: '@whitespace'},
{include: '@comment'}
// {include:'@blockcomment'}
],
target: [
[/(@target)/, 'target'],
[/,/, 'comma2'],
[/\)/, 'closebracket', '@pop'],
{include: '@comment'}
// {include:'@blockComment'}
],
whitespace: [
[/\t\r\n/, 'whitespace'],
[/\s*/, 'whitespace']
],
comment: [
[/--/, 'punctuation.comment.haskell'],
{include: '@whitespace'}
],
Block_comment: [
[/{-/, 'punctuation.comment.haskell'],
[/-}/, 'comment.block.haskell'],
{include: '@whitespace'}
]
}
};
}
monaco.languages.register({id: 'haskell'});
// TODO: Currently not working. Here as a reminder
/*monaco.languages.setMonarchTokensProvider('haskell', definition());*/