| /* |
| * Licensed under the Apache License, Version 2.0 (the "License"); |
| * you may not use this file except in compliance with the License. |
| * You may obtain a copy of the License at |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| */ |
| |
| 'use strict'; |
| |
| import { languages } from 'monaco-editor'; |
| |
| type IRichLanguageConfiguration = languages.LanguageConfiguration; |
| type ILanguage = languages.IMonarchLanguage; |
| |
| export const conf: IRichLanguageConfiguration = { |
| // the default separators except `@$` |
| wordPattern: /(-?\d*\.\d\w*)|([^\`\~\!\#\%\^\&\*\(\)\-\=\+\[\{\]\}\\\|\;\:\'\"\,\.\<\>\/\?\s]+)/g, |
| comments: { |
| lineComment: '//', |
| blockComment: ['/*', '*/'] |
| }, |
| brackets: [ |
| ['{', '}'], |
| ['[', ']'], |
| ['(', ')'] |
| ], |
| autoClosingPairs: [ |
| { open: '{', close: '}' }, |
| { open: '[', close: ']' }, |
| { open: '(', close: ')' }, |
| { open: '"', close: '"' }, |
| { open: "'", close: "'" } |
| ], |
| surroundingPairs: [ |
| { open: '{', close: '}' }, |
| { open: '[', close: ']' }, |
| { open: '(', close: ')' }, |
| { open: '"', close: '"' }, |
| { open: "'", close: "'" }, |
| { open: '<', close: '>' } |
| ] |
| }; |
| |
| export const language = { |
| defaultToken: '', |
| tokenPostfix: '.scala', |
| |
| keywords: [ |
| // From https://www.scala-lang.org/files/archive/spec/2.11/01-lexical-syntax.html |
| 'abstract', |
| 'case', |
| 'catch', |
| 'class', |
| 'def', |
| 'do', |
| 'else', |
| 'extends', |
| 'false', |
| 'final', |
| 'finally', |
| 'for', |
| 'forSome', |
| 'if', |
| 'implicit', |
| 'import', |
| 'lazy', |
| 'macro', |
| 'match', |
| 'new', |
| 'null', |
| 'object', |
| 'override', |
| 'package', |
| 'private', |
| 'protected', |
| 'return', |
| 'sealed', |
| 'super', |
| 'this', |
| 'throw', |
| 'trait', |
| 'try', |
| 'true', |
| 'type', |
| 'val', |
| 'var', |
| 'while', |
| 'with', |
| 'yield' |
| ], |
| |
| operators: [ |
| '_', |
| ':', |
| '=', |
| '=>', |
| '<-', |
| '<:', |
| '<%', |
| '>:', |
| '#', |
| '@', |
| |
| // Copied from java.ts, to be validated |
| '=', |
| '>', |
| '<', |
| '!', |
| '~', |
| '?', |
| ':', |
| '==', |
| '<=', |
| '>=', |
| '!=', |
| '&&', |
| '||', |
| '++', |
| '--', |
| '+', |
| '-', |
| '*', |
| '/', |
| '&', |
| '|', |
| '^', |
| '%', |
| '<<', |
| '>>', |
| '>>>', |
| '+=', |
| '-=', |
| '*=', |
| '/=', |
| '&=', |
| '|=', |
| '^=', |
| '%=', |
| '<<=', |
| '>>=', |
| '>>>=' |
| ], |
| |
| // we include these common regular expressions |
| symbols: /[=><!~?:&|+\-*\/\^%]+/, |
| escapes: /\\(?:[abfnrtv\\"']|x[0-9A-Fa-f]{1,4}|u[0-9A-Fa-f]{4}|U[0-9A-Fa-f]{8})/, |
| digits: /\d+(_+\d+)*/, |
| octaldigits: /[0-7]+(_+[0-7]+)*/, |
| binarydigits: /[0-1]+(_+[0-1]+)*/, |
| hexdigits: /[[0-9a-fA-F]+(_+[0-9a-fA-F]+)*/, |
| |
| // The main tokenizer for our languages |
| tokenizer: { |
| root: [ |
| // identifiers and keywords |
| [ |
| /[a-zA-Z_$][\w$]*/, |
| { |
| cases: { |
| '@keywords': { token: 'keyword.$0' }, |
| '@default': 'identifier' |
| } |
| } |
| ], |
| |
| // whitespace |
| { include: '@whitespace' }, |
| |
| // delimiters and operators |
| [/[{}()\[\]]/, '@brackets'], |
| [/[<>](?!@symbols)/, '@brackets'], |
| [ |
| /@symbols/, |
| { |
| cases: { |
| '@operators': 'delimiter', |
| '@default': '' |
| } |
| } |
| ], |
| |
| // @ annotations. |
| [/@\s*[a-zA-Z_\$][\w\$]*/, 'annotation'], |
| |
| // numbers |
| [/(@digits)[eE]([\-+]?(@digits))?[fFdD]?/, 'number.float'], |
| [/(@digits)\.(@digits)([eE][\-+]?(@digits))?[fFdD]?/, 'number.float'], |
| [/0[xX](@hexdigits)[Ll]?/, 'number.hex'], |
| [/0(@octaldigits)[Ll]?/, 'number.octal'], |
| [/0[bB](@binarydigits)[Ll]?/, 'number.binary'], |
| [/(@digits)[fFdD]/, 'number.float'], |
| [/(@digits)[lL]?/, 'number'], |
| |
| // delimiter: after number because of .\d floats |
| [/[;,.]/, 'delimiter'], |
| |
| // strings |
| [/"([^"\\]|\\.)*$/, 'string.invalid'], // non-teminated string |
| [/"/, 'string', '@string'], |
| |
| // characters |
| [/'[^\\']'/, 'string'], |
| [/(')(@escapes)(')/, ['string', 'string.escape', 'string']], |
| [/'/, 'string.invalid'] |
| ], |
| |
| whitespace: [ |
| [/[ \t\r\n]+/, ''], |
| [/\/\*\*(?!\/)/, 'comment.doc', '@scaladoc'], |
| [/\/\*/, 'comment', '@comment'], |
| [/\/\/.*$/, 'comment'] |
| ], |
| |
| comment: [ |
| [/[^\/*]+/, 'comment'], |
| // [/\/\*/, 'comment', '@push' ], // nested comment not allowed :-( |
| // [/\/\*/, 'comment.invalid' ], // this breaks block comments in the shape of /* //*/ |
| [/\*\//, 'comment', '@pop'], |
| [/[\/*]/, 'comment'] |
| ], |
| // Identical copy of comment above, except for the addition of .doc |
| scaladoc: [ |
| [/[^\/*]+/, 'comment.doc'], |
| // [/\/\*/, 'comment.doc', '@push' ], // nested comment not allowed :-( |
| [/\/\*/, 'comment.doc.invalid'], |
| [/\*\//, 'comment.doc', '@pop'], |
| [/[\/*]/, 'comment.doc'] |
| ], |
| |
| // eslint-disable-next-line id-blacklist |
| string: [ |
| [/[^\\"]+/, 'string'], |
| [/@escapes/, 'string.escape'], |
| [/\\./, 'string.escape.invalid'], |
| [/"/, 'string', '@pop'] |
| ] |
| } |
| } as ILanguage; |