/*--------------------------------------------------------------------------------------------- * Copyright (c) Microsoft Corporation. All rights reserved. * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ 'use strict'; export var conf = { // 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: '>' }, ], folding: { markers: { start: new RegExp("^\\s*//\\s*(?:(?:#?region\\b)|(?:))") } } }; var keywords = [ 'abstract', 'activate', 'and', 'any', 'array', 'as', 'asc', 'assert', 'autonomous', 'begin', 'bigdecimal', 'blob', 'boolean', 'break', 'bulk', 'by', 'case', 'cast', 'catch', 'char', 'class', 'collect', 'commit', 'const', 'continue', 'convertcurrency', 'decimal', 'default', 'delete', 'desc', 'do', 'double', 'else', 'end', 'enum', 'exception', 'exit', 'export', 'extends', 'false', 'final', 'finally', 'float', 'for', 'from', 'future', 'get', 'global', 'goto', 'group', 'having', 'hint', 'if', 'implements', 'import', 'in', 'inner', 'insert', 'instanceof', 'int', 'interface', 'into', 'join', 'last_90_days', 'last_month', 'last_n_days', 'last_week', 'like', 'limit', 'list', 'long', 'loop', 'map', 'merge', 'native', 'new', 'next_90_days', 'next_month', 'next_n_days', 'next_week', 'not', 'null', 'nulls', 'number', 'object', 'of', 'on', 'or', 'outer', 'override', 'package', 'parallel', 'pragma', 'private', 'protected', 'public', 'retrieve', 'return', 'returning', 'rollback', 'savepoint', 'search', 'select', 'set', 'short', 'sort', 'stat', 'static', 'strictfp', 'super', 'switch', 'synchronized', 'system', 'testmethod', 'then', 'this', 'this_month', 'this_week', 'throw', 'throws', 'today', 'tolabel', 'tomorrow', 'transaction', 'transient', 'trigger', 'true', 'try', 'type', 'undelete', 'update', 'upsert', 'using', 'virtual', 'void', 'volatile', 'webservice', 'when', 'where', 'while', 'yesterday' ]; // create case variations of the keywords - apex is case insensitive, but we can't make the highlighter case insensitive // because we use a heuristic to assume that identifiers starting with an upper case letter are types. var uppercaseFirstLetter = function (lowercase) { return lowercase.charAt(0).toUpperCase() + lowercase.substr(1); }; var keywordsWithCaseVariations = []; keywords.forEach(function (lowercase) { keywordsWithCaseVariations.push(lowercase); keywordsWithCaseVariations.push(lowercase.toUpperCase()); keywordsWithCaseVariations.push(uppercaseFirstLetter(lowercase)); }); export var language = { defaultToken: '', tokenPostfix: '.apex', keywords: keywordsWithCaseVariations, operators: [ '=', '>', '<', '!', '~', '?', ':', '==', '<=', '>=', '!=', '&&', '||', '++', '--', '+', '-', '*', '/', '&', '|', '^', '%', '<<', '>>', '>>>', '+=', '-=', '*=', '/=', '&=', '|=', '^=', '%=', '<<=', '>>=', '>>>=' ], // we include these common regular expressions symbols: /[=>](?!@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'], [/(@digits)[fFdD]/, 'number.float'], [/(@digits)[lL]?/, 'number'], // delimiter: after number because of .\d floats [/[;,.]/, 'delimiter'], // strings [/"([^"\\]|\\.)*$/, 'string.invalid'], [/'([^'\\]|\\.)*$/, 'string.invalid'], [/"/, 'string', '@string."'], [/'/, 'string', '@string.\''], // characters [/'[^\\']'/, 'string'], [/(')(@escapes)(')/, ['string', 'string.escape', 'string']], [/'/, 'string.invalid'] ], whitespace: [ [/[ \t\r\n]+/, ''], [/\/\*\*(?!\/)/, 'comment.doc', '@apexdoc'], [/\/\*/, '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 apexdoc: [ [/[^\/*]+/, 'comment.doc'], [/\*\//, 'comment.doc', '@pop'], [/[\/*]/, 'comment.doc'] ], string: [ [/[^\\"']+/, 'string'], [/@escapes/, 'string.escape'], [/\\./, 'string.escape.invalid'], [/["']/, { cases: { '$#==$S2': { token: 'string', next: '@pop' }, '@default': 'string' } }] ], }, };