UNPKG

maestro-roku-bsc-plugin

Version:

Visual studio plugin for maestro brightscript development

273 lines 10.1 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.defaultAnnotations = exports.getAllAnnotations = exports.getAllMethods = exports.getAllFields = exports.getTokenText = exports.createVarExpression = exports.createIfStatement = exports.sanitizeBsJsonString = exports.changeClassMethodBody = exports.addOverriddenMethod = exports.changeFunctionBody = exports.getFunctionBody = exports.makeASTFunction = exports.createRange = exports.getAssociatedFile = exports.getAlternateFileNames = exports.escapeRegExp = exports.pad = exports.addSetItems = exports.getRegexMatchValue = exports.getRegexMatchesValues = exports.spliceString = void 0; const brighterscript_1 = require("brighterscript"); function spliceString(str, index, add) { // We cannot pass negative indexes directly to the 2nd slicing operation. if (index < 0) { index = str.length + index; if (index < 0) { index = 0; } } return (str.slice(0, index) + (add || '') + str.slice(index + (add || '').length)); } exports.spliceString = spliceString; function getRegexMatchesValues(input, regex, groupIndex) { let values = []; let matches; regex.lastIndex = 0; while ((matches = regex.exec(input))) { values.push(matches[groupIndex]); } return values; } exports.getRegexMatchesValues = getRegexMatchesValues; function getRegexMatchValue(input, regex, groupIndex) { let matches; while ((matches = regex.exec(input))) { if (matches.length > groupIndex) { return matches[groupIndex]; } } return null; } exports.getRegexMatchValue = getRegexMatchValue; function addSetItems(setA, setB) { for (const elem of setB) { setA.add(elem); } } exports.addSetItems = addSetItems; function pad(pad, str, padLeft) { if (typeof str === 'undefined') { return pad; } if (padLeft) { return (pad + str).slice(-pad.length); } else { return (str + pad).substring(0, pad.length); } } exports.pad = pad; function escapeRegExp(text) { return text.replace(/[.*+?^${}()|[\]\\]/g, '\\$&'); // $& means the whole matched string } exports.escapeRegExp = escapeRegExp; function getAlternateFileNames(fileName) { if (fileName === null || fileName === void 0 ? void 0 : fileName.toLowerCase().endsWith('.brs')) { return [fileName.substring(0, fileName.length - 4) + '.xml']; } else if (fileName === null || fileName === void 0 ? void 0 : fileName.toLowerCase().endsWith('.bs')) { return [fileName.substring(0, fileName.length - 3) + '.xml']; } else if (fileName === null || fileName === void 0 ? void 0 : fileName.toLowerCase().endsWith('.xml')) { return [ fileName.substring(0, fileName.length - 4) + '.brs', fileName.substring(0, fileName.length - 4) + '.bs' ]; } else { return []; } } exports.getAlternateFileNames = getAlternateFileNames; function getAssociatedFile(file, fileMap) { for (let filePath of getAlternateFileNames(file.srcPath)) { let mFile = fileMap.allFiles[filePath]; if (mFile) { return mFile; } } return undefined; } exports.getAssociatedFile = getAssociatedFile; function createRange(pos) { return brighterscript_1.Range.create(pos.line, pos.character, pos.line, pos.character); } exports.createRange = createRange; function makeASTFunction(source) { let tokens = brighterscript_1.Lexer.scan(source).tokens; let { statements } = brighterscript_1.Parser.parse(tokens, { mode: brighterscript_1.ParseMode.BrighterScript }); if (statements && statements.length > 0) { return statements[0]; } return undefined; } exports.makeASTFunction = makeASTFunction; function getFunctionBody(source) { let funcStatement = makeASTFunction(source); return funcStatement ? funcStatement.func.body.statements : []; } exports.getFunctionBody = getFunctionBody; function changeFunctionBody(statement, source) { let statements = statement.func.body.statements; statements.splice(0, statements.length); let newStatements = getFunctionBody(source); for (let newStatement of newStatements) { statements.push(newStatement); } } exports.changeFunctionBody = changeFunctionBody; function addOverriddenMethod(target, name, source) { let statement = makeASTFunction(` class wrapper override function ${name}() ${source} end function end class `); if ((0, brighterscript_1.isClassStatement)(statement)) { let classStatement = statement; target.body.push(classStatement.methods[0]); return true; } return false; } exports.addOverriddenMethod = addOverriddenMethod; function changeClassMethodBody(target, name, source) { let method = target.methods.find((m) => m.name.text === name); if ((0, brighterscript_1.isClassMethodStatement)(method)) { changeFunctionBody(method, source); return true; } return false; } exports.changeClassMethodBody = changeClassMethodBody; function sanitizeBsJsonString(text) { return `"${text ? text.replace(/"/g, '\'') : ''}"`; } exports.sanitizeBsJsonString = sanitizeBsJsonString; function createIfStatement(condition, statements) { let ifToken = (0, brighterscript_1.createToken)(brighterscript_1.TokenKind.If, 'else if', brighterscript_1.Range.create(1, 1, 1, 999999)); ifToken.text = 'else if'; let thenBranch = new brighterscript_1.Block(statements, brighterscript_1.Range.create(1, 1, 1, 1)); return new brighterscript_1.IfStatement({ if: ifToken, then: (0, brighterscript_1.createToken)(brighterscript_1.TokenKind.Then, '', brighterscript_1.Range.create(1, 1, 1, 999999)) }, condition, thenBranch); } exports.createIfStatement = createIfStatement; function createVarExpression(varName, operator, value) { let variable = (0, brighterscript_1.createVariableExpression)(varName, brighterscript_1.Range.create(1, 1, 1, 999999)); let v = (0, brighterscript_1.createStringLiteral)('"' + value, brighterscript_1.Range.create(1, 1, 1, 999999)); let t = (0, brighterscript_1.createToken)(operator, getTokenText(operator), brighterscript_1.Range.create(1, 1, 1, 999999)); return new brighterscript_1.BinaryExpression(variable, t, v); } exports.createVarExpression = createVarExpression; function getTokenText(operator) { switch (operator) { case brighterscript_1.TokenKind.Equal: return '='; case brighterscript_1.TokenKind.Plus: return '+'; case brighterscript_1.TokenKind.Minus: return '-'; case brighterscript_1.TokenKind.Less: return '<'; case brighterscript_1.TokenKind.Greater: return '>'; default: return '>'; } } exports.getTokenText = getTokenText; function getAllFields(fileMap, classStatement, accessModifier) { var _a, _b; let result = new Map(); while (classStatement) { if (accessModifier === brighterscript_1.TokenKind.Public) { for (let field of classStatement.fields) { if (!field.accessModifier || ((_a = field.accessModifier) === null || _a === void 0 ? void 0 : _a.kind) === accessModifier) { result.set(field.name.text.toLowerCase(), field); } } } else { for (let field of classStatement.fields) { if (!accessModifier || ((_b = field.accessModifier) === null || _b === void 0 ? void 0 : _b.kind) === accessModifier) { result.set(field.name.text.toLowerCase(), field); } } } classStatement = classStatement.parentClassName ? fileMap.allClasses[classStatement.parentClassName.getName(brighterscript_1.ParseMode.BrighterScript).replace(/_/g, '.')] : null; } return result; } exports.getAllFields = getAllFields; function getAllMethods(fileMap, cs, accessModifier) { var _a, _b; let result = {}; while (cs) { if (accessModifier === brighterscript_1.TokenKind.Public) { for (let method of cs.methods) { if (!method.accessModifier || ((_a = method.accessModifier) === null || _a === void 0 ? void 0 : _a.kind) === accessModifier) { result[method.name.text.toLowerCase()] = method; } } } else { for (let method of cs.methods) { if (!accessModifier || ((_b = method.accessModifier) === null || _b === void 0 ? void 0 : _b.kind) === accessModifier) { result[method.name.text.toLowerCase()] = method; } } } cs = cs.parentClassName ? fileMap.allClasses[cs.parentClassName.getName(brighterscript_1.ParseMode.BrighterScript).replace(/_/g, '.')] : null; } return result; } exports.getAllMethods = getAllMethods; function getAllAnnotations(fileMap, cs) { let result = {}; while (cs) { if (cs.annotations) { for (let annotation of cs.annotations) { result[annotation.name.toLowerCase()] = true; } } cs = cs.parentClassName ? fileMap.allClasses[cs.parentClassName.getName(brighterscript_1.ParseMode.BrighterScript).replace(/_/g, '.')] : null; } return result; } exports.getAllAnnotations = getAllAnnotations; exports.defaultAnnotations = new Set([ 'todo', 'fixme', 'deprecated', 'rootOnly', 'node', 'observersWaitInitialize', 'onNotification', 'observeField', 'task', 'inject', 'alwaysnotify', 'debounce', 'observer', 'usesetfield', 'strict', 'nocode', 'lazy', 'injectclass', 'injectLocalM', 'createclass', 'sync', 'None', 'TestSuite', 'Describe', 'It', 'Ignore', 'Solo', 'NodeTest', 'Setup', 'TearDown', 'BeforeEach', 'AfterEach', 'Params', 'IgnoreParams', 'SoloParams', 'Async', 'Tags', 'NoCatch', 'NoEarlyExit' ]); //# sourceMappingURL=Utils.js.map