UNPKG

maestro-roku-bsc-plugin

Version:

Visual studio plugin for maestro brightscript development

214 lines 8.57 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); 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.pathAbsolute)) { 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; let result = new Map(); while (classStatement) { for (let field of classStatement.fields) { if (!accessModifier || ((_a = field.accessModifier) === null || _a === void 0 ? void 0 : _a.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, vis) { var _a; let result = {}; while (cs) { for (let method of cs.methods) { if (!vis || ((_a = method.accessModifier) === null || _a === void 0 ? void 0 : _a.kind) === vis) { 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; //# sourceMappingURL=Utils.js.map