maestro-roku-bsc-plugin
Version:
Visual studio plugin for maestro brightscript development
214 lines • 8.57 kB
JavaScript
;
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