UNPKG

@aurahelper/languages

Version:

Language Libraries to work with XML, Aura, Apex... files. tokenizers, parsers, system classes and much more

809 lines 86 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.ApexTokenizer = void 0; var core_1 = require("@aurahelper/core"); var system_1 = require("../system"); var Utils = core_1.CoreUtils.Utils; var Validator = core_1.CoreUtils.Validator; var StrUtils = core_1.CoreUtils.StrUtils; var symbolTokens = { ">>>=": core_1.ApexTokenTypes.OPERATOR.BITWISE.UNSIGNED_RIGHT_ASSIGN, ">>=": core_1.ApexTokenTypes.OPERATOR.BITWISE.SIGNED_RIGTH_ASSIGN, "<<=": core_1.ApexTokenTypes.OPERATOR.BITWISE.LEFT_ASSIGN, ">>>": core_1.ApexTokenTypes.OPERATOR.BITWISE.UNSIGNED_RIGHT, "!==": core_1.ApexTokenTypes.OPERATOR.LOGICAL.INEQUALITY_EXACT, "===": core_1.ApexTokenTypes.OPERATOR.LOGICAL.EQUALITY_EXACT, ">>": core_1.ApexTokenTypes.OPERATOR.BITWISE.SIGNED_RIGHT, "<<": core_1.ApexTokenTypes.OPERATOR.BITWISE.SIGNED_LEFT, "^=": core_1.ApexTokenTypes.OPERATOR.BITWISE.EXCLUSIVE_OR_ASSIGN, "--": core_1.ApexTokenTypes.OPERATOR.ARITHMETIC.DECREMENT, "++": core_1.ApexTokenTypes.OPERATOR.ARITHMETIC.INCREMENT, "!=": core_1.ApexTokenTypes.OPERATOR.LOGICAL.INEQUALITY, "<>": core_1.ApexTokenTypes.OPERATOR.LOGICAL.INEQUALITY, "==": core_1.ApexTokenTypes.OPERATOR.LOGICAL.EQUALITY, "||": core_1.ApexTokenTypes.OPERATOR.LOGICAL.OR, "|=": core_1.ApexTokenTypes.OPERATOR.LOGICAL.OR_ASSIGN, "&&": core_1.ApexTokenTypes.OPERATOR.LOGICAL.AND, "&=": core_1.ApexTokenTypes.OPERATOR.LOGICAL.AND_ASSIGN, ">=": core_1.ApexTokenTypes.OPERATOR.LOGICAL.GREATER_THAN_EQUALS, "<=": core_1.ApexTokenTypes.OPERATOR.LOGICAL.LESS_THAN_EQUALS, "=>": core_1.ApexTokenTypes.OPERATOR.ASSIGN.MAP_KEY_VALUE, "+=": core_1.ApexTokenTypes.OPERATOR.ARITHMETIC.ADD_ASSIGN, "-=": core_1.ApexTokenTypes.OPERATOR.ARITHMETIC.SUBSTRACT_ASSIGN, "*=": core_1.ApexTokenTypes.OPERATOR.ARITHMETIC.MULTIPLY_ASSIGN, "/=": core_1.ApexTokenTypes.OPERATOR.ARITHMETIC.DIVIDE_ASSIGN, "^": core_1.ApexTokenTypes.OPERATOR.BITWISE.EXCLUSIVE_OR, "|": core_1.ApexTokenTypes.OPERATOR.BITWISE.OR, "&": core_1.ApexTokenTypes.OPERATOR.BITWISE.AND, "+": core_1.ApexTokenTypes.OPERATOR.ARITHMETIC.ADD, "-": core_1.ApexTokenTypes.OPERATOR.ARITHMETIC.SUBSTRACT, "*": core_1.ApexTokenTypes.OPERATOR.ARITHMETIC.MULTIPLY, "/": core_1.ApexTokenTypes.OPERATOR.ARITHMETIC.DIVIDE, "!": core_1.ApexTokenTypes.OPERATOR.LOGICAL.NOT, "<": core_1.ApexTokenTypes.OPERATOR.LOGICAL.LESS_THAN, ">": core_1.ApexTokenTypes.OPERATOR.LOGICAL.GREATER_THAN, "=": core_1.ApexTokenTypes.OPERATOR.ASSIGN.ASSIGN, "/**": core_1.ApexTokenTypes.COMMENT.BLOCK_START, "/*": core_1.ApexTokenTypes.COMMENT.BLOCK_START, "*/": core_1.ApexTokenTypes.COMMENT.BLOCK_END, "//": core_1.ApexTokenTypes.COMMENT.LINE, "///": core_1.ApexTokenTypes.COMMENT.LINE_DOC, "(": core_1.ApexTokenTypes.OPERATOR.PRIORITY.PARENTHESIS_OPEN, ")": core_1.ApexTokenTypes.OPERATOR.PRIORITY.PARENTHESIS_CLOSE, "{": core_1.ApexTokenTypes.BRACKET.CURLY_OPEN, "}": core_1.ApexTokenTypes.BRACKET.CURLY_CLOSE, "[": core_1.ApexTokenTypes.BRACKET.SQUARE_OPEN, "]": core_1.ApexTokenTypes.BRACKET.SQUARE_CLOSE, ",": core_1.ApexTokenTypes.PUNCTUATION.COMMA, ";": core_1.ApexTokenTypes.PUNCTUATION.SEMICOLON, ":": core_1.ApexTokenTypes.PUNCTUATION.COLON, ".": core_1.ApexTokenTypes.PUNCTUATION.OBJECT_ACCESSOR, "?.": core_1.ApexTokenTypes.PUNCTUATION.SAFE_OBJECT_ACCESSOR, "\\": core_1.ApexTokenTypes.PUNCTUATION.BACKSLASH, "'": core_1.ApexTokenTypes.PUNCTUATION.QUOTTES, "@": core_1.ApexTokenTypes.PUNCTUATION.AT, "?": core_1.ApexTokenTypes.PUNCTUATION.EXMARK, }; var primitiveDatatypes = { "blob": core_1.ApexTokenTypes.DATATYPE.PRIMITIVE, "boolean": core_1.ApexTokenTypes.DATATYPE.PRIMITIVE, "byte": core_1.ApexTokenTypes.DATATYPE.PRIMITIVE, "date": core_1.ApexTokenTypes.DATATYPE.PRIMITIVE, "datetime": core_1.ApexTokenTypes.DATATYPE.PRIMITIVE, "decimal": core_1.ApexTokenTypes.DATATYPE.PRIMITIVE, "double": core_1.ApexTokenTypes.DATATYPE.PRIMITIVE, "id": core_1.ApexTokenTypes.DATATYPE.PRIMITIVE, "integer": core_1.ApexTokenTypes.DATATYPE.PRIMITIVE, "long": core_1.ApexTokenTypes.DATATYPE.PRIMITIVE, "object": core_1.ApexTokenTypes.DATATYPE.PRIMITIVE, "string": core_1.ApexTokenTypes.DATATYPE.PRIMITIVE, "time": core_1.ApexTokenTypes.DATATYPE.PRIMITIVE, "void": core_1.ApexTokenTypes.DATATYPE.PRIMITIVE, }; var collectionsDatatypes = { "list": core_1.ApexTokenTypes.DATATYPE.COLLECTION, "set": core_1.ApexTokenTypes.DATATYPE.COLLECTION, "map": core_1.ApexTokenTypes.DATATYPE.COLLECTION, "array": core_1.ApexTokenTypes.DATATYPE.COLLECTION, }; var dateLiterals = { "yesterday": core_1.ApexTokenTypes.LITERAL.DATE, "today": core_1.ApexTokenTypes.LITERAL.DATE, "tomorrow": core_1.ApexTokenTypes.LITERAL.DATE, "last_week": core_1.ApexTokenTypes.LITERAL.DATE, "this_week": core_1.ApexTokenTypes.LITERAL.DATE, "next_week": core_1.ApexTokenTypes.LITERAL.DATE, "last_month": core_1.ApexTokenTypes.LITERAL.DATE, "this_month": core_1.ApexTokenTypes.LITERAL.DATE, "next_month": core_1.ApexTokenTypes.LITERAL.DATE, "last_90_days": core_1.ApexTokenTypes.LITERAL.DATE, "next_90_days": core_1.ApexTokenTypes.LITERAL.DATE, "last_n_days": core_1.ApexTokenTypes.LITERAL.DATE_PARAMETRIZED, "next_n_days": core_1.ApexTokenTypes.LITERAL.DATE_PARAMETRIZED, "next_n_weeks": core_1.ApexTokenTypes.LITERAL.DATE_PARAMETRIZED, "last_n_weeks": core_1.ApexTokenTypes.LITERAL.DATE_PARAMETRIZED, "next_n_months": core_1.ApexTokenTypes.LITERAL.DATE_PARAMETRIZED, "last_n_months": core_1.ApexTokenTypes.LITERAL.DATE_PARAMETRIZED, "this_quarter": core_1.ApexTokenTypes.LITERAL.DATE, "last_quarter": core_1.ApexTokenTypes.LITERAL.DATE, "next_quarter": core_1.ApexTokenTypes.LITERAL.DATE, "next_n_quarters": core_1.ApexTokenTypes.LITERAL.DATE_PARAMETRIZED, "last_n_quarters": core_1.ApexTokenTypes.LITERAL.DATE_PARAMETRIZED, "this_year": core_1.ApexTokenTypes.LITERAL.DATE, "last_year": core_1.ApexTokenTypes.LITERAL.DATE, "next_n_years": core_1.ApexTokenTypes.LITERAL.DATE_PARAMETRIZED, "last_n_years": core_1.ApexTokenTypes.LITERAL.DATE_PARAMETRIZED, "this_fiscal_quarter": core_1.ApexTokenTypes.LITERAL.DATE, "last_fiscal_quarter": core_1.ApexTokenTypes.LITERAL.DATE, "next_fiscal_quarter": core_1.ApexTokenTypes.LITERAL.DATE, "next_n_fiscal_quarters": core_1.ApexTokenTypes.LITERAL.DATE_PARAMETRIZED, "last_n_fiscal_quarters": core_1.ApexTokenTypes.LITERAL.DATE_PARAMETRIZED, "this_fiscal_year": core_1.ApexTokenTypes.LITERAL.DATE, "last_fiscal_year": core_1.ApexTokenTypes.LITERAL.DATE, "next_fiscal_year": core_1.ApexTokenTypes.LITERAL.DATE, "next_n_fiscal_years": core_1.ApexTokenTypes.LITERAL.DATE_PARAMETRIZED, "last_n_fiscal_years": core_1.ApexTokenTypes.LITERAL.DATE_PARAMETRIZED, }; var reservedKeywords = { "abstract": core_1.ApexTokenTypes.KEYWORD.MODIFIER.DEFINITION, "after": core_1.ApexTokenTypes.DATABASE.TRIGGER_EXEC, "any": core_1.ApexTokenTypes.KEYWORD.FOR_FUTURE, "activate": core_1.ApexTokenTypes.KEYWORD.FOR_FUTURE, "as": core_1.ApexTokenTypes.KEYWORD.OTHER, "asc": core_1.ApexTokenTypes.QUERY.ORDER, "autonomous": core_1.ApexTokenTypes.KEYWORD.FOR_FUTURE, "begin": core_1.ApexTokenTypes.KEYWORD.FOR_FUTURE, "before": core_1.ApexTokenTypes.DATABASE.TRIGGER_EXEC, "bigdecimal": core_1.ApexTokenTypes.KEYWORD.FOR_FUTURE, "break": core_1.ApexTokenTypes.KEYWORD.FLOW_CONTROL.BREAK, "bulk": core_1.ApexTokenTypes.KEYWORD.OTHER, "case": core_1.ApexTokenTypes.KEYWORD.FOR_FUTURE, "cast": core_1.ApexTokenTypes.KEYWORD.FOR_FUTURE, "catch": core_1.ApexTokenTypes.KEYWORD.FLOW_CONTROL.CATCH, "char": core_1.ApexTokenTypes.KEYWORD.FOR_FUTURE, "class": core_1.ApexTokenTypes.KEYWORD.DECLARATION.CLASS, "collect": core_1.ApexTokenTypes.KEYWORD.FOR_FUTURE, "commit": core_1.ApexTokenTypes.KEYWORD.OTHER, "const": core_1.ApexTokenTypes.KEYWORD.FOR_FUTURE, "continue": core_1.ApexTokenTypes.KEYWORD.FLOW_CONTROL.CONTINUE, "default": core_1.ApexTokenTypes.KEYWORD.FOR_FUTURE, "delete": core_1.ApexTokenTypes.DATABASE.DML, "desc": core_1.ApexTokenTypes.QUERY.ORDER, "do": core_1.ApexTokenTypes.KEYWORD.FLOW_CONTROL.DO, "else": core_1.ApexTokenTypes.KEYWORD.FLOW_CONTROL.ELSE, "enum": core_1.ApexTokenTypes.KEYWORD.DECLARATION.ENUM, "exit": core_1.ApexTokenTypes.KEYWORD.FOR_FUTURE, "export": core_1.ApexTokenTypes.KEYWORD.FOR_FUTURE, "extends": core_1.ApexTokenTypes.KEYWORD.DECLARATION.EXTENDS, "false": core_1.ApexTokenTypes.LITERAL.BOOLEAN, "final": core_1.ApexTokenTypes.KEYWORD.MODIFIER.FINAL, "finally": core_1.ApexTokenTypes.KEYWORD.FLOW_CONTROL.FINALLY, "float": core_1.ApexTokenTypes.KEYWORD.FOR_FUTURE, "for": core_1.ApexTokenTypes.KEYWORD.FLOW_CONTROL.FOR, "global": core_1.ApexTokenTypes.KEYWORD.MODIFIER.ACCESS, "goto": core_1.ApexTokenTypes.KEYWORD.FOR_FUTURE, "group": core_1.ApexTokenTypes.KEYWORD.FOR_FUTURE, "hint": core_1.ApexTokenTypes.KEYWORD.FOR_FUTURE, "if": core_1.ApexTokenTypes.KEYWORD.FLOW_CONTROL.IF, "implements": core_1.ApexTokenTypes.KEYWORD.DECLARATION.IMPLEMENTS, "import": core_1.ApexTokenTypes.KEYWORD.FOR_FUTURE, "inner": core_1.ApexTokenTypes.KEYWORD.FOR_FUTURE, "insert": core_1.ApexTokenTypes.DATABASE.DML, "instanceof": core_1.ApexTokenTypes.OPERATOR.LOGICAL.INSTANCE_OF, "interface": core_1.ApexTokenTypes.KEYWORD.DECLARATION.INTERFACE, "into": core_1.ApexTokenTypes.KEYWORD.FOR_FUTURE, "join": core_1.ApexTokenTypes.KEYWORD.FOR_FUTURE, "loop": core_1.ApexTokenTypes.KEYWORD.FOR_FUTURE, "merge": core_1.ApexTokenTypes.DATABASE.DML, "new": core_1.ApexTokenTypes.KEYWORD.OBJECT.NEW, "null": core_1.ApexTokenTypes.LITERAL.NULL, "number": core_1.ApexTokenTypes.KEYWORD.OTHER, "of": core_1.ApexTokenTypes.KEYWORD.FOR_FUTURE, "on": core_1.ApexTokenTypes.KEYWORD.OTHER, "outer": core_1.ApexTokenTypes.KEYWORD.FOR_FUTURE, "override": core_1.ApexTokenTypes.KEYWORD.MODIFIER.OVERRIDE, "package": core_1.ApexTokenTypes.KEYWORD.OTHER, "parallel": core_1.ApexTokenTypes.KEYWORD.FOR_FUTURE, "pragma": core_1.ApexTokenTypes.KEYWORD.FOR_FUTURE, "private": core_1.ApexTokenTypes.KEYWORD.MODIFIER.ACCESS, "protected": core_1.ApexTokenTypes.KEYWORD.MODIFIER.ACCESS, "public": core_1.ApexTokenTypes.KEYWORD.MODIFIER.ACCESS, "retrieve": core_1.ApexTokenTypes.KEYWORD.FOR_FUTURE, "return": core_1.ApexTokenTypes.KEYWORD.FLOW_CONTROL.RETURN, "returning": core_1.ApexTokenTypes.KEYWORD.FOR_FUTURE, "search": core_1.ApexTokenTypes.KEYWORD.FOR_FUTURE, "select": core_1.ApexTokenTypes.QUERY.CLAUSE.SELECT, "short": core_1.ApexTokenTypes.KEYWORD.FOR_FUTURE, "sort": core_1.ApexTokenTypes.KEYWORD.OTHER, "stat": core_1.ApexTokenTypes.KEYWORD.FOR_FUTURE, "static": core_1.ApexTokenTypes.KEYWORD.MODIFIER.STATIC, "super": core_1.ApexTokenTypes.KEYWORD.OBJECT.SUPER, "switch": core_1.ApexTokenTypes.KEYWORD.FLOW_CONTROL.SWITCH, "synchronized": core_1.ApexTokenTypes.KEYWORD.FOR_FUTURE, "testmethod": core_1.ApexTokenTypes.KEYWORD.MODIFIER.TEST_METHOD, "this": core_1.ApexTokenTypes.KEYWORD.OBJECT.THIS, "throw": core_1.ApexTokenTypes.KEYWORD.FLOW_CONTROL.THROW, "transaction": core_1.ApexTokenTypes.KEYWORD.FOR_FUTURE, "trigger": core_1.ApexTokenTypes.KEYWORD.DECLARATION.TRIGGER, "true": core_1.ApexTokenTypes.LITERAL.BOOLEAN, "try": core_1.ApexTokenTypes.KEYWORD.FLOW_CONTROL.TRY, "type": core_1.ApexTokenTypes.KEYWORD.FOR_FUTURE, "transient": core_1.ApexTokenTypes.KEYWORD.MODIFIER.TRANSIENT, "undelete": core_1.ApexTokenTypes.DATABASE.DML, "update": core_1.ApexTokenTypes.DATABASE.DML, "upsert": core_1.ApexTokenTypes.DATABASE.DML, "virtual": core_1.ApexTokenTypes.KEYWORD.MODIFIER.DEFINITION, "webservice": core_1.ApexTokenTypes.KEYWORD.MODIFIER.WEB_SERVICE, "while": core_1.ApexTokenTypes.KEYWORD.FLOW_CONTROL.WHILE, "when": core_1.ApexTokenTypes.KEYWORD.FLOW_CONTROL.SWITCH_CASE, }; var soqlFunctions = { "avg": core_1.ApexTokenTypes.QUERY.FUNCTION, "calendar_month": core_1.ApexTokenTypes.QUERY.FUNCTION, "calendar_quarter": core_1.ApexTokenTypes.QUERY.FUNCTION, "calendar_year": core_1.ApexTokenTypes.QUERY.FUNCTION, "convertcurrency": core_1.ApexTokenTypes.QUERY.FUNCTION, "converttimezone": core_1.ApexTokenTypes.QUERY.FUNCTION, "count": core_1.ApexTokenTypes.QUERY.FUNCTION, "day_in_month": core_1.ApexTokenTypes.QUERY.FUNCTION, "day_in_week": core_1.ApexTokenTypes.QUERY.FUNCTION, "day_in_year": core_1.ApexTokenTypes.QUERY.FUNCTION, "day_only": core_1.ApexTokenTypes.QUERY.FUNCTION, "data category": core_1.ApexTokenTypes.QUERY.FUNCTION, "tolabel": core_1.ApexTokenTypes.QUERY.FUNCTION, "includes": core_1.ApexTokenTypes.QUERY.FUNCTION, "excludes": core_1.ApexTokenTypes.QUERY.FUNCTION, "fiscal_month": core_1.ApexTokenTypes.QUERY.FUNCTION, "fiscal_quarter": core_1.ApexTokenTypes.QUERY.FUNCTION, "fiscal_year": core_1.ApexTokenTypes.QUERY.FUNCTION, "format": core_1.ApexTokenTypes.QUERY.FUNCTION, "grouping": core_1.ApexTokenTypes.QUERY.FUNCTION, "group by cube": core_1.ApexTokenTypes.QUERY.FUNCTION, "group by rollup": core_1.ApexTokenTypes.QUERY.FUNCTION, "hour_in_day": core_1.ApexTokenTypes.QUERY.FUNCTION, "max": core_1.ApexTokenTypes.QUERY.FUNCTION, "min": core_1.ApexTokenTypes.QUERY.FUNCTION, "sum": core_1.ApexTokenTypes.QUERY.FUNCTION, "week_in_month": core_1.ApexTokenTypes.QUERY.FUNCTION, "week_in_year": core_1.ApexTokenTypes.QUERY.FUNCTION, }; var queryClauses = { "using scope": core_1.ApexTokenTypes.QUERY.CLAUSE.USING_SCOPE, "order by": core_1.ApexTokenTypes.QUERY.CLAUSE.ORDER_BY, "where": core_1.ApexTokenTypes.QUERY.CLAUSE.WHERE, "when": core_1.ApexTokenTypes.QUERY.CLAUSE.WHEN, "typeof": core_1.ApexTokenTypes.QUERY.CLAUSE.TYPE_OF, "then": core_1.ApexTokenTypes.QUERY.CLAUSE.THEN, "nulls": core_1.ApexTokenTypes.QUERY.CLAUSE.NULLS, "from": core_1.ApexTokenTypes.QUERY.CLAUSE.FROM, "end": core_1.ApexTokenTypes.QUERY.CLAUSE.END, "else": core_1.ApexTokenTypes.QUERY.CLAUSE.ELSE, "group by": core_1.ApexTokenTypes.QUERY.CLAUSE.GROUP_BY, "having": core_1.ApexTokenTypes.QUERY.CLAUSE.HAVING, "with": core_1.ApexTokenTypes.QUERY.CLAUSE.WITH, "limit": core_1.ApexTokenTypes.QUERY.CLAUSE.LIMIT, "offset": core_1.ApexTokenTypes.QUERY.CLAUSE.OFFSET, "for": core_1.ApexTokenTypes.QUERY.CLAUSE.FOR, }; var soqlOperators = { "above": core_1.ApexTokenTypes.QUERY.OPERATOR, "above_or_below": core_1.ApexTokenTypes.QUERY.OPERATOR, "and": core_1.ApexTokenTypes.QUERY.OPERATOR, "at": core_1.ApexTokenTypes.QUERY.OPERATOR, "reference": core_1.ApexTokenTypes.QUERY.OPERATOR, "update": core_1.ApexTokenTypes.QUERY.OPERATOR, "view": core_1.ApexTokenTypes.QUERY.OPERATOR, "in": core_1.ApexTokenTypes.QUERY.OPERATOR, "like": core_1.ApexTokenTypes.QUERY.OPERATOR, "not in": core_1.ApexTokenTypes.QUERY.OPERATOR, "not": core_1.ApexTokenTypes.QUERY.OPERATOR, "or": core_1.ApexTokenTypes.QUERY.OPERATOR, "update tracking": core_1.ApexTokenTypes.QUERY.OPERATOR, "update viewstat": core_1.ApexTokenTypes.QUERY.OPERATOR, "data category": core_1.ApexTokenTypes.QUERY.OPERATOR, "snippet": core_1.ApexTokenTypes.QUERY.OPERATOR, "network": core_1.ApexTokenTypes.QUERY.OPERATOR, "metadata": core_1.ApexTokenTypes.QUERY.OPERATOR, "using listview": core_1.ApexTokenTypes.QUERY.OPERATOR, "division": core_1.ApexTokenTypes.QUERY.OPERATOR, "highlight": core_1.ApexTokenTypes.QUERY.OPERATOR, "spell_correction": core_1.ApexTokenTypes.QUERY.OPERATOR, "returning": core_1.ApexTokenTypes.QUERY.OPERATOR }; var annotations = { "auraenabled": core_1.ApexTokenTypes.ANNOTATION.NAME, "deprecated": core_1.ApexTokenTypes.ANNOTATION.NAME, "future": core_1.ApexTokenTypes.ANNOTATION.NAME, "invocablemethod": core_1.ApexTokenTypes.ANNOTATION.NAME, "invocablevariable": core_1.ApexTokenTypes.ANNOTATION.NAME, "istest": core_1.ApexTokenTypes.ANNOTATION.NAME, "namespaceaccesible": core_1.ApexTokenTypes.ANNOTATION.NAME, "readonly": core_1.ApexTokenTypes.ANNOTATION.NAME, "remoteaction": core_1.ApexTokenTypes.ANNOTATION.NAME, "suppresswarnings": core_1.ApexTokenTypes.ANNOTATION.NAME, "testsetup": core_1.ApexTokenTypes.ANNOTATION.NAME, "testvisible": core_1.ApexTokenTypes.ANNOTATION.NAME, "restresource": core_1.ApexTokenTypes.ANNOTATION.NAME, "httpdelete": core_1.ApexTokenTypes.ANNOTATION.NAME, "httpget": core_1.ApexTokenTypes.ANNOTATION.NAME, "httppatch": core_1.ApexTokenTypes.ANNOTATION.NAME, "httppost": core_1.ApexTokenTypes.ANNOTATION.NAME, "httpPut": core_1.ApexTokenTypes.ANNOTATION.NAME, }; var nsSummary; /** * Class to Tokenize any apex node to extract all tokens */ var ApexTokenizer = /** @class */ (function () { function ApexTokenizer() { } /** * Method to tokenize an Apex file * @param {string} filePathOrContent File path or file content to tokenize * @param {ParserData} [systemData] Object with the system data to identify tokens with more precission * @param {number} [tabSize] Integer number with the tab size for the file * @returns {Token[]} Returns an array with all file tokens */ ApexTokenizer.tokenize = function (filePathOrContent, systemData, tabSize) { var _a; if (!tabSize) { tabSize = 4; } var content; if (Utils.isString(filePathOrContent)) { try { content = core_1.FileReader.readFileSync(Validator.validateFilePath(filePathOrContent)); } catch (error) { content = filePathOrContent; } } else { throw new Error('You must to select a file path,or file content'); } var sObjects = systemData ? systemData.sObjects : []; var userClasses = systemData ? systemData.userClasses : []; var namespacesSummary = systemData ? systemData.namespaceSummary : undefined; if (!namespacesSummary) { nsSummary = system_1.System.getAllNamespacesSummary(); } else { nsSummary = namespacesSummary; } var systemNamespace = nsSummary['system']; var NUM_FORMAT = /[0-9]/; var ID_FORMAT = /([a-zA-Z0-9À-ÿ]|_|–)/; content = StrUtils.replace(content, '\r\n', '\n'); var tokens = []; var lineNumber = 0; var column = 0; var onCommentBlock = false; var onCommentLine = false; var onText = false; var onQuery = false; var onSObjectInstance = false; var onAnnotation = false; var sqBracketIndent = 0; var aBracketsIndex = []; var parentIndex = []; var bracketIndex = []; var auxBracketIndex = []; var classDeclarationIndex = []; var classDeclarationNames = []; var enumDeclarationIndex = []; var sqBracketIndex = []; var quottesIndex = []; var commentBlockIndex = []; for (var charIndex = 0, len = content.length; charIndex < len; charIndex++) { var fourChars = content.substring(charIndex, charIndex + 4); var threeChars = content.substring(charIndex, charIndex + 3); var twoChars = content.substring(charIndex, charIndex + 2); var char = content.charAt(charIndex); var token = void 0; var lastToken = (tokens.length > 0) ? tokens[tokens.length - 1] : undefined; var twoLastToken = (tokens.length > 1) ? tokens[tokens.length - 2] : undefined; if (fourChars.length === 4 && symbolTokens[fourChars] && aBracketsIndex.length === 0) { token = new core_1.Token(symbolTokens[fourChars], fourChars, lineNumber, column); charIndex += 3; column += 4; } else if (threeChars.length === 3 && symbolTokens[threeChars] && aBracketsIndex.length === 0) { token = new core_1.Token(symbolTokens[threeChars], threeChars, lineNumber, column); charIndex += 2; column += 3; } else if (twoChars.length === 2 && symbolTokens[twoChars]) { if (isLogicalOperator(symbolTokens[twoChars])) { aBracketsIndex = []; } if (aBracketsIndex.length === 0) { token = new core_1.Token(symbolTokens[twoChars], twoChars, lineNumber, column); charIndex += 1; column += 2; } else if (symbolTokens[char]) { token = new core_1.Token(symbolTokens[char], char, lineNumber, column); column++; } } else if (symbolTokens[char]) { token = new core_1.Token(symbolTokens[char], char, lineNumber, column); if (mustResetABracketIndex(token)) { aBracketsIndex = []; } column++; } else if (NUM_FORMAT.test(char)) { var numContent = ''; while (NUM_FORMAT.test(char) || char === '.' || char === ':' || char === '+' || char === '-' || char.toLowerCase() === 't' || char.toLowerCase() === 'z') { numContent += char; char = content.charAt(++charIndex); } if (numContent.indexOf(':') !== -1 && numContent.indexOf('-') !== -1) { token = new core_1.Token(core_1.ApexTokenTypes.LITERAL.DATETIME, numContent, lineNumber, column); } else if (numContent.indexOf('-') !== -1) { token = new core_1.Token(core_1.ApexTokenTypes.LITERAL.DATE, numContent, lineNumber, column); } else if (numContent.indexOf(':') !== -1) { token = new core_1.Token(core_1.ApexTokenTypes.LITERAL.TIME, numContent, lineNumber, column); } else if (numContent.indexOf('.') !== -1) { token = new core_1.Token(core_1.ApexTokenTypes.LITERAL.DOUBLE, numContent, lineNumber, column); } else { token = new core_1.Token(core_1.ApexTokenTypes.LITERAL.INTEGER, numContent, lineNumber, column); } charIndex--; column += numContent.length; } else if (ID_FORMAT.test(char)) { var idContent = ''; while (ID_FORMAT.test(char)) { idContent += char; char = content.charAt(++charIndex); } charIndex--; token = new core_1.Token(core_1.ApexTokenTypes.IDENTIFIER, idContent, lineNumber, column); column += idContent.length; } else if (char === "\n") { if (onCommentLine) { onCommentLine = false; } lineNumber++; column = 0; } else if (char !== "\t" && char !== " " && char.trim().length !== 0) { token = new core_1.Token(core_1.ApexTokenTypes.UNKNOWN, char, lineNumber, column); column++; } else if (char === "\t") { column += tabSize; } else { column++; } if (token !== undefined) { if (!onText && !onCommentBlock && !onCommentLine && token.type === core_1.ApexTokenTypes.PUNCTUATION.QUOTTES && (!lastToken || lastToken.text !== '\\')) { if (onAnnotation) { token.type = core_1.ApexTokenTypes.ANNOTATION.CONTENT; } else { token.type = core_1.ApexTokenTypes.PUNCTUATION.QUOTTES_START; quottesIndex.push(tokens.length); } onText = true; token.parentToken = tokens.length - 1; } else if (onText && token.type === core_1.ApexTokenTypes.PUNCTUATION.QUOTTES && (!lastToken || lastToken.text !== '\\')) { if (onAnnotation && lastToken) { token.type = core_1.ApexTokenTypes.ANNOTATION.CONTENT; var whitespaces = (lastToken.range.start.line !== token.range.start.line) ? 0 : token.range.start.character - lastToken.range.end.character; token = new core_1.Token(core_1.ApexTokenTypes.ANNOTATION.CONTENT, lastToken.text + StrUtils.getWhitespaces(whitespaces) + token.text, lastToken.range.start.line, lastToken.range.start.character); tokens.pop(); lastToken = tokens[tokens.length - 1]; } else { token.type = core_1.ApexTokenTypes.PUNCTUATION.QUOTTES_END; if (quottesIndex.length > 0) { var index = quottesIndex.pop(); if (index !== undefined) { token.pairToken = index; tokens[index].pairToken = tokens.length; token.parentToken = tokens[index].parentToken; } } } onText = false; } else if (!onAnnotation && !onText && !onCommentBlock && !onCommentLine && token.type === core_1.ApexTokenTypes.COMMENT.BLOCK_START) { onCommentBlock = true; token.parentToken = tokens.length - 1; commentBlockIndex.push(tokens.length); } else if (onCommentBlock && token.type === core_1.ApexTokenTypes.COMMENT.BLOCK_END) { onCommentBlock = false; if (commentBlockIndex.length > 0) { var index = commentBlockIndex.pop(); if (index !== undefined) { token.pairToken = index; tokens[index].pairToken = tokens.length; token.parentToken = tokens[index].parentToken; } } } else if (!onAnnotation && !onText && !onCommentBlock && !onCommentLine && (token.type === core_1.ApexTokenTypes.COMMENT.LINE || token.type === core_1.ApexTokenTypes.COMMENT.LINE_DOC)) { token.parentToken = tokens.length - 1; onCommentLine = true; } else if (onText) { if (onAnnotation && lastToken) { token.type = core_1.ApexTokenTypes.ANNOTATION.CONTENT; var whitespaces = (lastToken.range.start.line !== token.range.start.line) ? 0 : token.range.start.character - lastToken.range.end.character; token = new core_1.Token(core_1.ApexTokenTypes.ANNOTATION.CONTENT, lastToken.text + StrUtils.getWhitespaces(whitespaces) + token.text, lastToken.range.start.line, lastToken.range.start.character); tokens.pop(); lastToken = tokens[tokens.length - 1]; } else { token.type = core_1.ApexTokenTypes.LITERAL.STRING; if (quottesIndex.length > 0) { token.parentToken = quottesIndex[quottesIndex.length - 1]; } } } else if (onCommentBlock || onCommentLine) { if (onCommentBlock && token.text === '/' && lastToken && lastToken.text === '/**') { tokens[tokens.length - 1].text = '/*'; token.text = '*/'; token.type = core_1.ApexTokenTypes.COMMENT.BLOCK_END; onCommentBlock = false; } else { token.type = core_1.ApexTokenTypes.COMMENT.CONTENT; if (commentBlockIndex.length > 0) { token.parentToken = commentBlockIndex[commentBlockIndex.length - 1]; } } } else if (lastToken && (isOperator(lastToken) || isBracket(lastToken)) && token.type === core_1.ApexTokenTypes.OPERATOR.ARITHMETIC.ADD) { token.type = core_1.ApexTokenTypes.OPERATOR.ARITHMETIC.POSITIVE; } else if (lastToken && (isOperator(lastToken) || isBracket(lastToken)) && token.type === core_1.ApexTokenTypes.OPERATOR.ARITHMETIC.SUBSTRACT) { token.type = core_1.ApexTokenTypes.OPERATOR.ARITHMETIC.NEGATIVE; } else if (onAnnotation && token.type !== core_1.ApexTokenTypes.OPERATOR.PRIORITY.PARENTHESIS_CLOSE) { token.type = core_1.ApexTokenTypes.ANNOTATION.CONTENT; } else if (token.type === core_1.ApexTokenTypes.OPERATOR.LOGICAL.LESS_THAN) { aBracketsIndex.push(tokens.length); } else if (token.type === core_1.ApexTokenTypes.OPERATOR.LOGICAL.GREATER_THAN) { if (aBracketsIndex.length > 0) { var index = aBracketsIndex.pop(); if (index !== undefined && tokens[index] && tokens[index].type === core_1.ApexTokenTypes.OPERATOR.LOGICAL.LESS_THAN) { tokens[index].type = core_1.ApexTokenTypes.BRACKET.PARAMETRIZED_TYPE_OPEN; if (tokens[index + 1] && tokens[index + 1].type === core_1.ApexTokenTypes.ENTITY.VARIABLE) { tokens[index + 1].type = core_1.ApexTokenTypes.DATATYPE.CUSTOM_CLASS; } if (tokens[tokens.length - 1] && tokens[tokens.length - 1].type === core_1.ApexTokenTypes.ENTITY.VARIABLE) { tokens[tokens.length - 1].type = core_1.ApexTokenTypes.DATATYPE.CUSTOM_CLASS; } token.type = core_1.ApexTokenTypes.BRACKET.PARAMETRIZED_TYPE_CLOSE; } if (index !== undefined) { token.pairToken = index; tokens[index].pairToken = tokens.length; } } } else if (lastToken && lastToken.type === core_1.ApexTokenTypes.BRACKET.CASTING_CLOSE && token.textToLower === ';') { var pairIndex = (_a = tokens[tokens.length - 1]) === null || _a === void 0 ? void 0 : _a.pairToken; if (pairIndex) { tokens[tokens.length - 1].type = core_1.ApexTokenTypes.BRACKET.PARENTHESIS_PARAM_OPEN; tokens[pairIndex].type = core_1.ApexTokenTypes.BRACKET.PARENTHESIS_PARAM_CLOSE; } } else if (token.type === core_1.ApexTokenTypes.BRACKET.CURLY_OPEN && lastToken) { if ((lastToken.type === core_1.ApexTokenTypes.BRACKET.PARAMETRIZED_TYPE_CLOSE || lastToken.type === core_1.ApexTokenTypes.BRACKET.SQUARE_CLOSE) && bracketIndex.length > 0 && classDeclarationIndex.length === 0) { token.type = core_1.ApexTokenTypes.BRACKET.INIT_VALUES_OPEN; } else if (lastToken.type === core_1.ApexTokenTypes.KEYWORD.MODIFIER.STATIC) { tokens[tokens.length - 1].type = core_1.ApexTokenTypes.KEYWORD.DECLARATION.STATIC_CONSTRUCTOR; } else if (lastToken.textToLower === 'get') { tokens[tokens.length - 1].type = core_1.ApexTokenTypes.KEYWORD.DECLARATION.PROPERTY_GETTER; } else if (lastToken.textToLower === 'set') { tokens[tokens.length - 1].type = core_1.ApexTokenTypes.KEYWORD.DECLARATION.PROPERTY_SETTER; } else if (lastToken.type === core_1.ApexTokenTypes.DECLARATION.ENTITY.VARIABLE) { tokens[tokens.length - 1].type = core_1.ApexTokenTypes.DECLARATION.ENTITY.PROPERTY; } else if (lastToken.type === core_1.ApexTokenTypes.BRACKET.CURLY_OPEN || lastToken.type === core_1.ApexTokenTypes.BRACKET.CURLY_CLOSE || lastToken.type === core_1.ApexTokenTypes.PUNCTUATION.SEMICOLON) { token.type = core_1.ApexTokenTypes.BRACKET.INITIALIZER_OPEN; } else if (lastToken.type === core_1.ApexTokenTypes.COMMENT.CONTENT || lastToken.type === core_1.ApexTokenTypes.COMMENT.LINE || lastToken.type === core_1.ApexTokenTypes.COMMENT.LINE_DOC || lastToken.type === core_1.ApexTokenTypes.COMMENT.BLOCK_END) { var auxToken = lastToken; var finish = false; while (!finish) { if (auxToken.parentToken !== undefined && auxToken.parentToken !== -1) { auxToken = tokens[auxToken.parentToken]; } else { finish = true; } if (auxToken.type === core_1.ApexTokenTypes.BRACKET.CURLY_OPEN || auxToken.type === core_1.ApexTokenTypes.BRACKET.CURLY_CLOSE || auxToken.type === core_1.ApexTokenTypes.PUNCTUATION.SEMICOLON) { finish = true; token.type = core_1.ApexTokenTypes.BRACKET.INITIALIZER_OPEN; } else if (auxToken.type !== core_1.ApexTokenTypes.COMMENT.CONTENT && auxToken.type !== core_1.ApexTokenTypes.COMMENT.LINE && auxToken.type !== core_1.ApexTokenTypes.COMMENT.LINE_DOC && auxToken.type !== core_1.ApexTokenTypes.COMMENT.BLOCK_END) { finish = true; } } } if (lastToken.parentToken !== undefined) { token.parentToken = lastToken.parentToken; } else { token.parentToken = tokens.length - 1; } if (lastToken.type === core_1.ApexTokenTypes.BRACKET.PARENTHESIS_GUARD_CLOSE || lastToken.type === core_1.ApexTokenTypes.KEYWORD.FLOW_CONTROL.ELSE || lastToken.type === core_1.ApexTokenTypes.KEYWORD.FLOW_CONTROL.TRY || lastToken.type === core_1.ApexTokenTypes.KEYWORD.FLOW_CONTROL.FINALLY || lastToken.type === core_1.ApexTokenTypes.KEYWORD.FLOW_CONTROL.DO) { if (lastToken.type === core_1.ApexTokenTypes.BRACKET.PARENTHESIS_GUARD_CLOSE && lastToken.parentToken !== undefined) { token.parentToken = lastToken.parentToken; } else { token.parentToken = tokens.length - 1; } } if (classDeclarationIndex.length > 0) { token.parentToken = classDeclarationIndex.pop(); } bracketIndex.push(tokens.length); } else if (token.type === core_1.ApexTokenTypes.BRACKET.CURLY_CLOSE) { if (bracketIndex.length > 0) { var index = bracketIndex.pop(); if (index !== undefined) { if (tokens[index] && tokens[index].type === core_1.ApexTokenTypes.BRACKET.INIT_VALUES_OPEN) { token.type = core_1.ApexTokenTypes.BRACKET.INIT_VALUES_CLOSE; } else if (tokens[index] && tokens[index].type === core_1.ApexTokenTypes.BRACKET.INITIALIZER_OPEN) { token.type = core_1.ApexTokenTypes.BRACKET.INITIALIZER_CLOSE; } if (tokens[index].parentToken) { token.parentToken = tokens[index].parentToken; } else { token.parentToken = index; } token.pairToken = index; tokens[index].pairToken = tokens.length; } } if (enumDeclarationIndex.length > 0) { enumDeclarationIndex.pop(); } } else if (token.type === core_1.ApexTokenTypes.OPERATOR.ASSIGN.ASSIGN && onQuery) { token.type = core_1.ApexTokenTypes.OPERATOR.LOGICAL.EQUALITY; } else if (token.type === core_1.ApexTokenTypes.BRACKET.SQUARE_OPEN) { sqBracketIndex.push(tokens.length); sqBracketIndent++; } else if (token.type === core_1.ApexTokenTypes.BRACKET.SQUARE_CLOSE) { sqBracketIndent--; if (sqBracketIndent === 0) { if (onQuery) { onQuery = false; token.type = core_1.ApexTokenTypes.BRACKET.QUERY_END; } else if (twoLastToken && lastToken && twoLastToken.type === core_1.ApexTokenTypes.ENTITY.VARIABLE && lastToken.type === core_1.ApexTokenTypes.BRACKET.SQUARE_OPEN) { tokens[tokens.length - 2].type = core_1.ApexTokenTypes.DATATYPE.CUSTOM_CLASS; } } if (sqBracketIndex.length > 0) { var index = sqBracketIndex.pop(); if (index !== undefined) { token.pairToken = index; tokens[index].pairToken = tokens.length; } } } else if (token.type === core_1.ApexTokenTypes.PUNCTUATION.SEMICOLON) { if (lastToken && lastToken.textToLower === 'get') { tokens[tokens.length - 1].type = core_1.ApexTokenTypes.KEYWORD.DECLARATION.PROPERTY_GETTER; } else if (lastToken && lastToken.textToLower === 'set') { tokens[tokens.length - 1].type = core_1.ApexTokenTypes.KEYWORD.DECLARATION.PROPERTY_SETTER; } } else if (isObjectAccessor(token)) { if (lastToken && lastToken.type === core_1.ApexTokenTypes.KEYWORD.DECLARATION.TRIGGER) { tokens[tokens.length - 1].type = core_1.ApexTokenTypes.DATATYPE.SUPPORT_CLASS; } if (lastToken && lastToken.type === core_1.ApexTokenTypes.KEYWORD.DECLARATION.CLASS) { tokens[tokens.length - 1].type = core_1.ApexTokenTypes.DATATYPE.SUPPORT_CLASS; } } else if (onSObjectInstance && token.type === core_1.ApexTokenTypes.OPERATOR.ASSIGN.ASSIGN && twoLastToken && (twoLastToken.type === core_1.ApexTokenTypes.BRACKET.PARENTHESIS_SOBJECT_OPEN || twoLastToken.type === core_1.ApexTokenTypes.PUNCTUATION.COMMA)) { tokens[tokens.length - 1].type = core_1.ApexTokenTypes.ENTITY.SOBJECT_FIELD; } else if (token.type === core_1.ApexTokenTypes.OPERATOR.ASSIGN.ASSIGN && twoLastToken && twoLastToken.type === core_1.ApexTokenTypes.BRACKET.PARENTHESIS_PARAM_OPEN) { onSObjectInstance = true; tokens[tokens.length - 2].type = core_1.ApexTokenTypes.BRACKET.PARENTHESIS_SOBJECT_OPEN; tokens[tokens.length - 1].type = core_1.ApexTokenTypes.ENTITY.SOBJECT_FIELD; } else if (token.type === core_1.ApexTokenTypes.IDENTIFIER) { if (token.textToLower !== 'constructor' && reservedKeywords[token.textToLower] && reservedKeywords[token.textToLower] !== core_1.ApexTokenTypes.KEYWORD.FOR_FUTURE) { if (!onQuery || (onQuery && lastToken && lastToken.type !== core_1.ApexTokenTypes.QUERY.VALUE_BIND)) { token.type = reservedKeywords[token.textToLower]; if (lastToken && isDatatypeToken(lastToken) && token.type !== core_1.ApexTokenTypes.KEYWORD.DECLARATION.IMPLEMENTS) { token.type = core_1.ApexTokenTypes.DECLARATION.ENTITY.VARIABLE; } } if (lastToken && isObjectAccessor(lastToken) && token.type === core_1.ApexTokenTypes.KEYWORD.DECLARATION.CLASS) { token.type = core_1.ApexTokenTypes.DATATYPE.SUPPORT_CLASS; } if (token.type === core_1.ApexTokenTypes.KEYWORD.FLOW_CONTROL.IF && lastToken && lastToken.type === core_1.ApexTokenTypes.KEYWORD.FLOW_CONTROL.ELSE) { token = new core_1.Token(core_1.ApexTokenTypes.KEYWORD.FLOW_CONTROL.ELSE_IF, lastToken.text + ' ' + token.text, lastToken.range.start.line, lastToken.range.start.character); tokens.pop(); lastToken = tokens[tokens.length - 1]; } } if (!onQuery && !onAnnotation && lastToken && lastToken.type === core_1.ApexTokenTypes.PUNCTUATION.AT && annotations[token.textToLower]) { token = new core_1.Token(core_1.ApexTokenTypes.ANNOTATION.ENTITY, lastToken.text + token.text, lastToken.range.start.line, lastToken.range.start.character); tokens.pop(); lastToken = tokens[tokens.length - 1]; } else if (!onQuery && (token.type === core_1.ApexTokenTypes.QUERY.CLAUSE.SELECT || token.type === core_1.ApexTokenTypes.QUERY.CLAUSE.FIND) && lastToken && lastToken.type === core_1.ApexTokenTypes.BRACKET.SQUARE_OPEN && sqBracketIndent === 1) { onQuery = true; tokens[tokens.length - 1].type = core_1.ApexTokenTypes.BRACKET.QUERY_START; } else if (onQuery && token.type === core_1.ApexTokenTypes.QUERY.CLAUSE.SELECT && lastToken && lastToken.type === core_1.ApexTokenTypes.OPERATOR.PRIORITY.PARENTHESIS_OPEN) { tokens[tokens.length - 1].type = core_1.ApexTokenTypes.BRACKET.INNER_QUERY_START; } else if (onQuery && token.textToLower !== 'constructor' && soqlFunctions[token.textToLower] && lastToken && lastToken.type !== core_1.ApexTokenTypes.QUERY.VALUE_BIND && !isObjectAccessor(lastToken)) { token.type = soqlFunctions[token.textToLower]; } else if (onQuery && token.textToLower !== 'constructor' && soqlOperators[token.textToLower] && lastToken && lastToken.type !== core_1.ApexTokenTypes.QUERY.VALUE_BIND && !isObjectAccessor(lastToken)) { token.type = soqlOperators[token.textToLower]; } else if (onQuery && token.textToLower !== 'constructor' && queryClauses[token.textToLower] && lastToken && lastToken.type !== core_1.ApexTokenTypes.QUERY.VALUE_BIND && !isObjectAccessor(lastToken)) { token.type = queryClauses[token.textToLower]; } else if (onQuery && token.textToLower === 'scope' && lastToken && lastToken.textToLower === 'using') { token = new core_1.Token(queryClauses['using scope'], lastToken.text + ' ' + token.text, lastToken.range.start.line, lastToken.range.start.character); tokens.pop(); lastToken = tokens[tokens.length - 1]; } else if (onQuery && token.textToLower === 'by' && lastToken && lastToken.textToLower === 'order') { token = new core_1.Token(queryClauses['order by'], lastToken.text + ' ' + token.text, lastToken.range.start.line, lastToken.range.start.character); tokens.pop(); lastToken = tokens[tokens.length - 1]; } else if (onQuery && token.textToLower === 'by' && lastToken && lastToken.textToLower === 'group') { token = new core_1.Token(queryClauses['group by'], lastToken.text + ' ' + token.text, lastToken.range.start.line, lastToken.range.start.character); tokens.pop(); lastToken = tokens[tokens.length - 1]; } else if (onQuery && token.textToLower === 'cube' && lastToken && lastToken.type === core_1.ApexTokenTypes.QUERY.CLAUSE.GROUP_BY) { token = new core_1.Token(soqlFunctions['group by cube'], lastToken.text + ' ' + token.text, lastToken.range.start.line, lastToken.range.start.character); tokens.pop(); lastToken = tokens[tokens.length - 1]; } else if (onQuery && token.textToLower === 'rollup' && lastToken && lastToken.type === core_1.ApexTokenTypes.QUERY.CLAUSE.GROUP_BY) { token = new core_1.Token(soqlFunctions['group by rollup'], lastToken.text + ' ' + token.text, lastToken.range.start.line, lastToken.range.start.character); tokens.pop(); lastToken = tokens[tokens.length - 1]; } else if (onQuery && token.textToLower === 'category' && lastToken && lastToken.textToLower === 'data') { token = new core_1.Token(soqlFunctions['data category'], lastToken.text + ' ' + token.text, lastToken.range.start.line, lastToken.range.start.character); tokens.pop(); lastToken = tokens[tokens.length - 1]; } else if (onQuery && token.textToLower === 'update' && lastToken && lastToken.textToLower === 'tracking') { token = new core_1.Token(soqlFunctions['update tracking'], lastToken.text + ' ' + token.text, lastToken.range.start.line, lastToken.range.start.character); tokens.pop(); lastToken = tokens[tokens.length - 1]; } else if (onQuery && token.textToLower === 'update' && lastToken && lastToken.textToLower === 'tracking') { token = new core_1.Token(soqlFunctions['update viewstat'], lastToken.text + ' ' + token.text, lastToken.range.start.line, lastToken.range.start.character); tokens.pop(); lastToken = tokens[tokens.length - 1]; } else if (onQuery && token.textToLower === 'listview' && lastToken && lastToken.textToLower === 'using') { token = new core_1.Token(soqlFunctions['using listview'], lastToken.text + ' ' + token.text, lastToken.range.start.line, lastToken.range.start.character); tokens.pop(); lastToken = tokens[tokens.length - 1]; } else if (token.textToLower === 'sharing' && lastToken && (lastToken.textToLower === 'with' || lastToken.textToLower === 'without' || lastToken.textToLower === 'inherited')) { token = new core_1.Token(core_1.ApexTokenTypes.KEYWORD.MODIFIER.SHARING, lastToken.text + ' ' + token.text, lastToken.range.start.line, lastToken.range.start.character); tokens.pop(); lastToken = tokens[tokens.length - 1]; } else if (lastToken && lastToken.type === core_1.ApexTokenTypes.LITERAL.DATE_PARAMETRIZED_START_PARAM) { token.type = core_1.ApexTokenTypes.LITERAL.DATE_PARAMETRIZED_PARAM_VARIABLE; } else if (lastTo