{"version":3,"sources":["webpack:///./node_modules/monaco-editor/esm/vs/basic-languages/ruby/ruby.js"],"names":["conf","comments","lineComment","blockComment","brackets","autoClosingPairs","open","close","surroundingPairs","indentationRules","increaseIndentPattern","RegExp","decreaseIndentPattern","language","tokenPostfix","keywords","keywordops","builtins","declarations","linedecls","operators","token","symbols","escape","escapes","decpart","decimal","delim","heredelim","regexpctl","regexpesc","tokenizer","root","cases","next","include","dodecl","switchTo","modifier","sstring","dstring","heredoc","interpolated","interpolated_compound","pregexp","regexp","regexcontrol","regexrange","regexpcomment","pstring","qstring","qqstring","whitespace","comment"],"mappings":"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","file":"static/js/chunk-2d2295e9.8eaff5ce.js","sourcesContent":["/*---------------------------------------------------------------------------------------------\r\n * Copyright (c) Microsoft Corporation. All rights reserved.\r\n * Licensed under the MIT License. See License.txt in the project root for license information.\r\n *--------------------------------------------------------------------------------------------*/\r\n'use strict';\r\nexport var conf = {\r\n comments: {\r\n lineComment: '#',\r\n blockComment: ['=begin', '=end'],\r\n },\r\n brackets: [\r\n ['(', ')'],\r\n ['{', '}'],\r\n ['[', ']']\r\n ],\r\n autoClosingPairs: [\r\n { open: '{', close: '}' },\r\n { open: '[', close: ']' },\r\n { open: '(', close: ')' },\r\n { open: '\"', close: '\"' },\r\n { open: '\\'', close: '\\'' },\r\n ],\r\n surroundingPairs: [\r\n { open: '{', close: '}' },\r\n { open: '[', close: ']' },\r\n { open: '(', close: ')' },\r\n { open: '\"', close: '\"' },\r\n { open: '\\'', close: '\\'' },\r\n ],\r\n indentationRules: {\r\n increaseIndentPattern: new RegExp('^\\\\s*((begin|class|(private|protected)\\\\s+def|def|else|elsif|ensure|for|if|module|rescue|unless|until|when|while|case)|([^#]*\\\\sdo\\\\b)|([^#]*=\\\\s*(case|if|unless)))\\\\b([^#\\\\{;]|(\"|\\'|\\/).*\\\\4)*(#.*)?$'),\r\n decreaseIndentPattern: new RegExp('^\\\\s*([}\\\\]]([,)]?\\\\s*(#|$)|\\\\.[a-zA-Z_]\\\\w*\\\\b)|(end|rescue|ensure|else|elsif|when)\\\\b)'),\r\n }\r\n};\r\n/*\r\n * Ruby language definition\r\n *\r\n * Quite a complex language due to elaborate escape sequences\r\n * and quoting of literate strings/regular expressions, and\r\n * an 'end' keyword that does not always apply to modifiers like until and while,\r\n * and a 'do' keyword that sometimes starts a block, but sometimes is part of\r\n * another statement (like 'while').\r\n *\r\n * (1) end blocks:\r\n * 'end' may end declarations like if or until, but sometimes 'if' or 'until'\r\n * are modifiers where there is no 'end'. Also, 'do' sometimes starts a block\r\n * that is ended by 'end', but sometimes it is part of a 'while', 'for', or 'until'\r\n * To do proper brace matching we do some elaborate state manipulation.\r\n * some examples:\r\n *\r\n * until bla do\r\n * work until tired\r\n * list.each do\r\n * something if test\r\n * end\r\n * end\r\n *\r\n * or\r\n *\r\n * if test\r\n * something (if test then x end)\r\n * bar if bla\r\n * end\r\n *\r\n * or, how about using class as a property..\r\n *\r\n * class Test\r\n * def endpoint\r\n * self.class.endpoint || routes\r\n * end\r\n * end\r\n *\r\n * (2) quoting:\r\n * there are many kinds of strings and escape sequences. But also, one can\r\n * start many string-like things as '%qx' where q specifies the kind of string\r\n * (like a command, escape expanded, regular expression, symbol etc.), and x is\r\n * some character and only another 'x' ends the sequence. Except for brackets\r\n * where the closing bracket ends the sequence.. and except for a nested bracket\r\n * inside the string like entity. Also, such strings can contain interpolated\r\n * ruby expressions again (and span multiple lines). Moreover, expanded\r\n * regular expression can also contain comments.\r\n */\r\nexport var language = {\r\n tokenPostfix: '.ruby',\r\n keywords: [\r\n '__LINE__', '__ENCODING__', '__FILE__', 'BEGIN', 'END', 'alias', 'and', 'begin',\r\n 'break', 'case', 'class', 'def', 'defined?', 'do', 'else', 'elsif', 'end',\r\n 'ensure', 'for', 'false', 'if', 'in', 'module', 'next', 'nil', 'not', 'or', 'redo',\r\n 'rescue', 'retry', 'return', 'self', 'super', 'then', 'true', 'undef', 'unless',\r\n 'until', 'when', 'while', 'yield',\r\n ],\r\n keywordops: [\r\n '::', '..', '...', '?', ':', '=>'\r\n ],\r\n builtins: [\r\n 'require', 'public', 'private', 'include', 'extend', 'attr_reader',\r\n 'protected', 'private_class_method', 'protected_class_method', 'new'\r\n ],\r\n // these are closed by 'end' (if, while and until are handled separately)\r\n declarations: [\r\n 'module', 'class', 'def', 'case', 'do', 'begin', 'for', 'if', 'while', 'until', 'unless'\r\n ],\r\n linedecls: [\r\n 'def', 'case', 'do', 'begin', 'for', 'if', 'while', 'until', 'unless'\r\n ],\r\n operators: [\r\n '^', '&', '|', '<=>', '==', '===', '!~', '=~', '>', '>=', '<', '<=', '<<', '>>', '+',\r\n '-', '*', '/', '%', '**', '~', '+@', '-@', '[]', '[]=', '`',\r\n '+=', '-=', '*=', '**=', '/=', '^=', '%=', '<<=', '>>=', '&=', '&&=', '||=', '|='\r\n ],\r\n brackets: [\r\n { open: '(', close: ')', token: 'delimiter.parenthesis' },\r\n { open: '{', close: '}', token: 'delimiter.curly' },\r\n { open: '[', close: ']', token: 'delimiter.square' }\r\n ],\r\n // we include these common regular expressions\r\n symbols: /[=> where decl is the current opening declaration (like 'class')\r\n root: [\r\n // identifiers and keywords\r\n // most complexity here is due to matching 'end' correctly with declarations.\r\n // We distinguish a declaration that comes first on a line, versus declarations further on a line (which are most likey modifiers)\r\n [/^(\\s*)([a-z_]\\w*[!?=]?)/, ['white',\r\n {\r\n cases: {\r\n 'for|until|while': { token: 'keyword.$2', next: '@dodecl.$2' },\r\n '@declarations': { token: 'keyword.$2', next: '@root.$2' },\r\n 'end': { token: 'keyword.$S2', next: '@pop' },\r\n '@keywords': 'keyword',\r\n '@builtins': 'predefined',\r\n '@default': 'identifier'\r\n }\r\n }]],\r\n [/[a-z_]\\w*[!?=]?/,\r\n {\r\n cases: {\r\n 'if|unless|while|until': { token: 'keyword.$0x', next: '@modifier.$0x' },\r\n 'for': { token: 'keyword.$2', next: '@dodecl.$2' },\r\n '@linedecls': { token: 'keyword.$0', next: '@root.$0' },\r\n 'end': { token: 'keyword.$S2', next: '@pop' },\r\n '@keywords': 'keyword',\r\n '@builtins': 'predefined',\r\n '@default': 'identifier'\r\n }\r\n }],\r\n [/[A-Z][\\w]*[!?=]?/, 'constructor.identifier'],\r\n [/\\$[\\w]*/, 'global.constant'],\r\n [/@[\\w]*/, 'namespace.instance.identifier'],\r\n [/@@[\\w]*/, 'namespace.class.identifier'],\r\n // here document\r\n [/<<[-~](@heredelim).*/, { token: 'string.heredoc.delimiter', next: '@heredoc.$1' }],\r\n [/[ \\t\\r\\n]+<<(@heredelim).*/, { token: 'string.heredoc.delimiter', next: '@heredoc.$1' }],\r\n [/^<<(@heredelim).*/, { token: 'string.heredoc.delimiter', next: '@heredoc.$1' }],\r\n // whitespace\r\n { include: '@whitespace' },\r\n // strings\r\n [/\"/, { token: 'string.d.delim', next: '@dstring.d.\"' }],\r\n [/'/, { token: 'string.sq.delim', next: '@sstring.sq' }],\r\n // % literals. For efficiency, rematch in the 'pstring' state\r\n [/%([rsqxwW]|Q?)/, { token: '@rematch', next: 'pstring' }],\r\n // commands and symbols\r\n [/`/, { token: 'string.x.delim', next: '@dstring.x.`' }],\r\n [/:(\\w|[$@])\\w*[!?=]?/, 'string.s'],\r\n [/:\"/, { token: 'string.s.delim', next: '@dstring.s.\"' }],\r\n [/:'/, { token: 'string.s.delim', next: '@sstring.s' }],\r\n // regular expressions. Lookahead for a (not escaped) closing forwardslash on the same line\r\n [/\\/(?=(\\\\\\/|[^\\/\\n])+\\/)/, { token: 'regexp.delim', next: '@regexp' }],\r\n // delimiters and operators\r\n [/[{}()\\[\\]]/, '@brackets'],\r\n [/@symbols/, {\r\n cases: {\r\n '@keywordops': 'keyword',\r\n '@operators': 'operator',\r\n '@default': ''\r\n }\r\n }],\r\n [/[;,]/, 'delimiter'],\r\n // numbers\r\n [/0[xX][0-9a-fA-F](_?[0-9a-fA-F])*/, 'number.hex'],\r\n [/0[_oO][0-7](_?[0-7])*/, 'number.octal'],\r\n [/0[bB][01](_?[01])*/, 'number.binary'],\r\n [/0[dD]@decpart/, 'number'],\r\n [/@decimal((\\.@decpart)?([eE][\\-+]?@decpart)?)/, {\r\n cases: {\r\n '$1': 'number.float',\r\n '@default': 'number'\r\n }\r\n }],\r\n ],\r\n // used to not treat a 'do' as a block opener if it occurs on the same\r\n // line as a 'do' statement: 'while|until|for'\r\n // dodecl. where decl is the declarations started, like 'while'\r\n dodecl: [\r\n [/^/, { token: '', switchTo: '@root.$S2' }],\r\n [/[a-z_]\\w*[!?=]?/, {\r\n cases: {\r\n 'end': { token: 'keyword.$S2', next: '@pop' },\r\n 'do': { token: 'keyword', switchTo: '@root.$S2' },\r\n '@linedecls': { token: '@rematch', switchTo: '@root.$S2' },\r\n '@keywords': 'keyword',\r\n '@builtins': 'predefined',\r\n '@default': 'identifier'\r\n }\r\n }],\r\n { include: '@root' }\r\n ],\r\n // used to prevent potential modifiers ('if|until|while|unless') to match\r\n // with 'end' keywords.\r\n // modifier.x where decl is the declaration starter, like 'if'\r\n modifier: [\r\n [/^/, '', '@pop'],\r\n [/[a-z_]\\w*[!?=]?/, {\r\n cases: {\r\n 'end': { token: 'keyword.$S2', next: '@pop' },\r\n 'then|else|elsif|do': { token: 'keyword', switchTo: '@root.$S2' },\r\n '@linedecls': { token: '@rematch', switchTo: '@root.$S2' },\r\n '@keywords': 'keyword',\r\n '@builtins': 'predefined',\r\n '@default': 'identifier'\r\n }\r\n }],\r\n { include: '@root' }\r\n ],\r\n // single quote strings (also used for symbols)\r\n // sstring. where kind is 'sq' (single quote) or 's' (symbol)\r\n sstring: [\r\n [/[^\\\\']+/, 'string.$S2'],\r\n [/\\\\\\\\|\\\\'|\\\\$/, 'string.$S2.escape'],\r\n [/\\\\./, 'string.$S2.invalid'],\r\n [/'/, { token: 'string.$S2.delim', next: '@pop' }]\r\n ],\r\n // double quoted \"string\".\r\n // dstring.. where kind is 'd' (double quoted), 'x' (command), or 's' (symbol)\r\n // and delim is the ending delimiter (\" or `)\r\n dstring: [\r\n [/[^\\\\`\"#]+/, 'string.$S2'],\r\n [/#/, 'string.$S2.escape', '@interpolated'],\r\n [/\\\\$/, 'string.$S2.escape'],\r\n [/@escapes/, 'string.$S2.escape'],\r\n [/\\\\./, 'string.$S2.escape.invalid'],\r\n [/[`\"]/, {\r\n cases: {\r\n '$#==$S3': { token: 'string.$S2.delim', next: '@pop' },\r\n '@default': 'string.$S2'\r\n }\r\n }]\r\n ],\r\n // literal documents\r\n // heredoc. where close is the closing delimiter\r\n heredoc: [\r\n [/^(\\s*)(@heredelim)$/, {\r\n cases: {\r\n '$2==$S2': ['string.heredoc', { token: 'string.heredoc.delimiter', next: '@pop' }],\r\n '@default': ['string.heredoc', 'string.heredoc']\r\n }\r\n }],\r\n [/.*/, 'string.heredoc'],\r\n ],\r\n // interpolated sequence\r\n interpolated: [\r\n [/\\$\\w*/, 'global.constant', '@pop'],\r\n [/@\\w*/, 'namespace.class.identifier', '@pop'],\r\n [/@@\\w*/, 'namespace.instance.identifier', '@pop'],\r\n [/[{]/, { token: 'string.escape.curly', switchTo: '@interpolated_compound' }],\r\n ['', '', '@pop'],\r\n ],\r\n // any code\r\n interpolated_compound: [\r\n [/[}]/, { token: 'string.escape.curly', next: '@pop' }],\r\n { include: '@root' },\r\n ],\r\n // %r quoted regexp\r\n // pregexp.. where open/close are the open/close delimiter\r\n pregexp: [\r\n { include: '@whitespace' },\r\n // turns out that you can quote using regex control characters, aargh!\r\n // for example; %r|kgjgaj| is ok (even though | is used for alternation)\r\n // so, we need to match those first\r\n [/[^\\(\\{\\[\\\\]/, {\r\n cases: {\r\n '$#==$S3': { token: 'regexp.delim', next: '@pop' },\r\n '$#==$S2': { token: 'regexp.delim', next: '@push' },\r\n '~[)}\\\\]]': '@brackets.regexp.escape.control',\r\n '~@regexpctl': 'regexp.escape.control',\r\n '@default': 'regexp'\r\n }\r\n }],\r\n { include: '@regexcontrol' },\r\n ],\r\n // We match regular expression quite precisely\r\n regexp: [\r\n { include: '@regexcontrol' },\r\n [/[^\\\\\\/]/, 'regexp'],\r\n ['/[ixmp]*', { token: 'regexp.delim' }, '@pop'],\r\n ],\r\n regexcontrol: [\r\n [/(\\{)(\\d+(?:,\\d*)?)(\\})/, ['@brackets.regexp.escape.control', 'regexp.escape.control', '@brackets.regexp.escape.control']],\r\n [/(\\[)(\\^?)/, ['@brackets.regexp.escape.control', { token: 'regexp.escape.control', next: '@regexrange' }]],\r\n [/(\\()(\\?[:=!])/, ['@brackets.regexp.escape.control', 'regexp.escape.control']],\r\n [/\\(\\?#/, { token: 'regexp.escape.control', next: '@regexpcomment' }],\r\n [/[()]/, '@brackets.regexp.escape.control'],\r\n [/@regexpctl/, 'regexp.escape.control'],\r\n [/\\\\$/, 'regexp.escape'],\r\n [/@regexpesc/, 'regexp.escape'],\r\n [/\\\\\\./, 'regexp.invalid'],\r\n [/#/, 'regexp.escape', '@interpolated'],\r\n ],\r\n regexrange: [\r\n [/-/, 'regexp.escape.control'],\r\n [/\\^/, 'regexp.invalid'],\r\n [/\\\\$/, 'regexp.escape'],\r\n [/@regexpesc/, 'regexp.escape'],\r\n [/[^\\]]/, 'regexp'],\r\n [/\\]/, '@brackets.regexp.escape.control', '@pop'],\r\n ],\r\n regexpcomment: [\r\n [/[^)]+/, 'comment'],\r\n [/\\)/, { token: 'regexp.escape.control', next: '@pop' }]\r\n ],\r\n // % quoted strings\r\n // A bit repetitive since we need to often special case the kind of ending delimiter\r\n pstring: [\r\n [/%([qws])\\(/, { token: 'string.$1.delim', switchTo: '@qstring.$1.(.)' }],\r\n [/%([qws])\\[/, { token: 'string.$1.delim', switchTo: '@qstring.$1.[.]' }],\r\n [/%([qws])\\{/, { token: 'string.$1.delim', switchTo: '@qstring.$1.{.}' }],\r\n [/%([qws])' }],\r\n [/%([qws])(@delim)/, { token: 'string.$1.delim', switchTo: '@qstring.$1.$2.$2' }],\r\n [/%r\\(/, { token: 'regexp.delim', switchTo: '@pregexp.(.)' }],\r\n [/%r\\[/, { token: 'regexp.delim', switchTo: '@pregexp.[.]' }],\r\n [/%r\\{/, { token: 'regexp.delim', switchTo: '@pregexp.{.}' }],\r\n [/%r' }],\r\n [/%r(@delim)/, { token: 'regexp.delim', switchTo: '@pregexp.$1.$1' }],\r\n [/%(x|W|Q?)\\(/, { token: 'string.$1.delim', switchTo: '@qqstring.$1.(.)' }],\r\n [/%(x|W|Q?)\\[/, { token: 'string.$1.delim', switchTo: '@qqstring.$1.[.]' }],\r\n [/%(x|W|Q?)\\{/, { token: 'string.$1.delim', switchTo: '@qqstring.$1.{.}' }],\r\n [/%(x|W|Q?)' }],\r\n [/%(x|W|Q?)(@delim)/, { token: 'string.$1.delim', switchTo: '@qqstring.$1.$2.$2' }],\r\n [/%([rqwsxW]|Q?)./, { token: 'invalid', next: '@pop' }],\r\n [/./, { token: 'invalid', next: '@pop' }],\r\n ],\r\n // non-expanded quoted string.\r\n // qstring...\r\n // kind = q|w|s (single quote, array, symbol)\r\n // open = open delimiter\r\n // close = close delimiter\r\n qstring: [\r\n [/\\\\$/, 'string.$S2.escape'],\r\n [/\\\\./, 'string.$S2.escape'],\r\n [/./, {\r\n cases: {\r\n '$#==$S4': { token: 'string.$S2.delim', next: '@pop' },\r\n '$#==$S3': { token: 'string.$S2.delim', next: '@push' },\r\n '@default': 'string.$S2'\r\n }\r\n }],\r\n ],\r\n // expanded quoted string.\r\n // qqstring...\r\n // kind = Q|W|x (double quote, array, command)\r\n // open = open delimiter\r\n // close = close delimiter\r\n qqstring: [\r\n [/#/, 'string.$S2.escape', '@interpolated'],\r\n { include: '@qstring' }\r\n ],\r\n // whitespace & comments\r\n whitespace: [\r\n [/[ \\t\\r\\n]+/, ''],\r\n [/^\\s*=begin\\b/, 'comment', '@comment'],\r\n [/#.*$/, 'comment'],\r\n ],\r\n comment: [\r\n [/[^=]+/, 'comment'],\r\n [/^\\s*=begin\\b/, 'comment.invalid'],\r\n [/^\\s*=end\\b.*/, 'comment', '@pop'],\r\n [/[=]/, 'comment']\r\n ],\r\n }\r\n};\r\n"],"sourceRoot":""}