/*--------------------------------------------------------------------------------------------- * Copyright (c) Microsoft Corporation. All rights reserved. * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ "use strict"; import LanguageConfiguration = monaco.languages.LanguageConfiguration; import IMonarchLanguage = monaco.languages.IMonarchLanguage; export const conf: LanguageConfiguration = { comments: { lineComment: "//", blockComment: ["/*", "*/"] }, brackets: [ ["{", "}"], ["[", "]"], ["(", ")"] ], autoClosingPairs: [ { open: "{", close: "}" }, { open: "[", close: "]" }, { open: "(", close: ")" }, { open: "'", close: "'", notIn: ["string", "comment"] }, { open: '"', close: '"', notIn: ["string"] }, { open: "`", close: "`", notIn: ["string", "comment"] }, { open: "/**", close: " */", notIn: ["string"] } ], surroundingPairs: [ { open: "{", close: "}" }, { open: "[", close: "]" }, { open: "(", close: ")" }, { open: "<", close: ">" }, { open: "'", close: "'" }, { open: "(", close: ")" }, { open: '"', close: '"' }, { open: "`", close: "`" } ], folding: { markers: { start: /^\s*\s*#?region\b/, end: /^\s*\s*#?endregion\b/ } } }; export const language = { defaultToken: "invalid", tokenPostfix: ".dart", keywords: [ "abstract", "dynamic", "implements", "show", "as", "else", "import", "static", "assert", "enum", "in", "super", "async", "export", "interface", "switch", "await", "extends", "is", "sync", "break", "external", "library", "this", "case", "factory", "mixin", "throw", "catch", "false", "new", "true", "class", "final", "null", "try", "const", "finally", "on", "typedef", "continue", "for", "operator", "var", "covariant", "Function", "part", "void", "default", "get", "rethrow", "while", "deferred", "hide", "return", "with", "do", "if", "set", "yield" ], typeKeywords: ["int", "double", "String", "bool"], operators: [ "+", "-", "*", "/", "~/", "%", "++", "--", "==", "!=", ">", "<", ">=", "<=", "=", "-=", "/=", "%=", ">>=", "^=", "+=", "*=", "~/=", "<<=", "&=", "!=", "||", "&&", "&", "|", "^", "~", "<<", ">>", "!", ">>>", "??", "?", ":", "|=" ], // we include these common regular expressions symbols: /[=>](?!@symbols)/, "@brackets"], [/!(?=([^=]|$))/, "delimiter"], [ /@symbols/, { cases: { "@operators": "delimiter", "@default": "" } } ], // numbers [/(@digits)[eE]([\-+]?(@digits))?/, "number.float"], [/(@digits)\.(@digits)([eE][\-+]?(@digits))?/, "number.float"], [/0[xX](@hexdigits)n?/, "number.hex"], [/0[oO]?(@octaldigits)n?/, "number.octal"], [/0[bB](@binarydigits)n?/, "number.binary"], [/(@digits)n?/, "number"], // delimiter: after number because of .\d floats [/[;,.]/, "delimiter"], // strings [/"([^"\\]|\\.)*$/, "string.invalid"], // non-teminated string [/'([^'\\]|\\.)*$/, "string.invalid"], // non-teminated string [/"/, "string", "@string_double"], [/'/, "string", "@string_single"], [/`/, "string", "@string_backtick"] // [/[a-zA-Z]+/, "variable"] ], whitespace: [ [/[ \t\r\n]+/, ""], [/\/\*\*(?!\/)/, "comment.doc", "@jsdoc"], [/\/\*/, "comment", "@comment"], [/\/\/.*$/, "comment"] ], comment: [ [/[^\/*]+/, "comment"], [/\*\//, "comment", "@pop"], [/[\/*]/, "comment"] ], jsdoc: [ [/[^\/*]+/, "comment.doc"], [/\*\//, "comment.doc", "@pop"], [/[\/*]/, "comment.doc"] ], // We match regular expression quite precisely regexp: [ [ /(\{)(\d+(?:,\d*)?)(\})/, [ "regexp.escape.control", "regexp.escape.control", "regexp.escape.control" ] ], [ /(\[)(\^?)(?=(?:[^\]\\\/]|\\.)+)/, [ "regexp.escape.control", { token: "regexp.escape.control", next: "@regexrange" } ] ], [ /(\()(\?:|\?=|\?!)/, ["regexp.escape.control", "regexp.escape.control"] ], [/[()]/, "regexp.escape.control"], [/@regexpctl/, "regexp.escape.control"], [/[^\\\/]/, "regexp"], [/@regexpesc/, "regexp.escape"], [/\\\./, "regexp.invalid"], [ /(\/)([gimsuy]*)/, [ { token: "regexp", bracket: "@close", next: "@pop" }, "keyword.other" ] ] ], regexrange: [ [/-/, "regexp.escape.control"], [/\^/, "regexp.invalid"], [/@regexpesc/, "regexp.escape"], [/[^\]]/, "regexp"], [ /\]/, { token: "regexp.escape.control", next: "@pop", bracket: "@close" } ] ], string_double: [ [/\$\{/, { token: "delimiter.bracket", next: "@bracketCounting" }], [/[^\\"]+/, "string"], [/@escapes/, "string.escape"], [/\\./, "string.escape.invalid"], [/"/, "string", "@pop"] ], string_single: [ [/[^\\']+/, "string"], [/@escapes/, "string.escape"], [/\\./, "string.escape.invalid"], [/'/, "string", "@pop"] ], string_backtick: [ [/\$\{/, { token: "delimiter.bracket", next: "@bracketCounting" }], [/[^\\`$]+/, "string"], [/@escapes/, "string.escape"], [/\\./, "string.escape.invalid"], [/`/, "string", "@pop"] ], bracketCounting: [ [/\{/, "delimiter.bracket", "@bracketCounting"], [/\}/, "delimiter.bracket", "@pop"], { include: "common" } ] } };