roku-log-bsc-plugin
Version:
Visual studio plugin for roku logger
135 lines • 8.31 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.RokuLogPlugin = void 0;
const brighterscript_1 = require("brighterscript");
const brighterscript = require("brighterscript");
const Utils_1 = require("./utils/Utils");
class RokuLogPlugin {
constructor() {
this.name = 'log-plugin';
this.rokuLogConfig = {
strip: true,
guard: false,
insertPkgPath: true,
removeComments: true
};
}
beforeProgramCreate(builder) {
this.rokuLogConfig = Object.assign(Object.assign({}, this.rokuLogConfig), builder.options.rokuLog);
}
beforeProgramTranspile(program, entries) {
for (let filePath in program.files) {
let file = program.files[filePath];
//this isn't necessary in the file api, but keep here for legacy bsc versions
file.needsTranspiled = true;
}
}
beforeFileTranspile(event) {
let visitedLineNumbers = {};
if (brighterscript.isBrsFile(event.file)) {
const parser = event.file.parser;
let logVisitor = brighterscript.createVisitor({
DottedSetStatement: (expressionStatement, parentNode, owner, key) => {
if (!visitedLineNumbers[`${expressionStatement.range.start.line}`]) {
if ((0, brighterscript_1.isNewExpression)(expressionStatement.value)) {
let newExpression = expressionStatement.value;
if (newExpression.className.getName(brighterscript_1.ParseMode.BrighterScript) === 'log.Logger') {
let guardExpression = this.createGuardSetStatement(newExpression);
event.editor.addToArray(owner, key + 1, guardExpression);
}
}
visitedLineNumbers[`${expressionStatement.range.start.line}`] = true;
}
},
ExpressionStatement: (expressionStatement, parentNode, owner, key) => {
if ((0, brighterscript_1.isCallExpression)(expressionStatement.expression)) {
let callExpression = expressionStatement.expression;
if (brighterscript.isDottedGetExpression(callExpression.callee) &&
brighterscript.isDottedGetExpression(callExpression.callee.obj) &&
callExpression.callee.obj.name.text === 'log' &&
brighterscript.isVariableExpression(callExpression.callee.obj.obj) &&
callExpression.callee.obj.obj.name.text === 'm') {
if (!visitedLineNumbers[`${callExpression.range.start.line}`]) {
try {
if (this.rokuLogConfig.strip) {
event.editor.overrideTranspileResult(callExpression, '');
}
else {
if (this.rokuLogConfig.insertPkgPath) {
let funcName = callExpression.callee.name.text;
if (funcName === 'info' || funcName === 'verbose' || funcName === 'error' || funcName === 'warn' || funcName === 'debug' || funcName === 'method') {
const t = brighterscript.createToken(brighterscript.TokenKind.SourceLocationLiteral, '', callExpression.range);
let sourceExpression = new brighterscript.SourceLiteralExpression(t);
if (callExpression.args.length > 0) {
event.editor.addToArray(callExpression.args, 0, sourceExpression);
}
else {
event.editor.addToArray(callExpression.args, callExpression.args.length, sourceExpression);
}
}
visitedLineNumbers[`${callExpression.range.start.line}`] = true;
}
if (this.rokuLogConfig.guard && (0, brighterscript_1.isExpressionStatement)(callExpression.parent)) {
event.editor.setProperty(owner, key, this.createGuardStatement(callExpression));
}
}
}
catch (e) {
console.log(`Error parsing file: ${event.file.pkgPath} ${e.getMessage()}`);
}
}
}
}
}
});
for (let expr of parser.references.functionExpressions) {
expr.body.walk(logVisitor, { walkMode: brighterscript.WalkMode.visitAllRecursive });
}
for (let expr of parser.references.classStatements) {
expr.walk(logVisitor, { walkMode: brighterscript.WalkMode.visitAllRecursive });
}
for (let expr of parser.references.namespaceStatements) {
expr.walk(logVisitor, { walkMode: brighterscript.WalkMode.visitAllRecursive });
}
}
}
createGuardSetStatement(callExpression) {
let nameIdentifier2 = (0, brighterscript_1.createIdentifier)('enabled', callExpression.range);
let nameIdentifier = (0, brighterscript_1.createIdentifier)('log', callExpression.range);
let objIdentifier = (0, brighterscript_1.createIdentifier)('m', callExpression.range);
let obj = new brighterscript_1.VariableExpression(objIdentifier);
let dottedGet = new brighterscript_1.DottedGetExpression(obj, nameIdentifier, brighterscript.createToken(brighterscript.TokenKind.Dot, '.', callExpression.range));
let dottedGet2 = new brighterscript_1.DottedGetExpression(dottedGet, nameIdentifier2, brighterscript.createToken(brighterscript.TokenKind.Dot, '.', callExpression.range));
let setNameIdentifier = (0, brighterscript_1.createIdentifier)('__le', callExpression.range);
let setObjIdentifier = (0, brighterscript_1.createIdentifier)('m', callExpression.range);
let setObj = new brighterscript_1.VariableExpression(setObjIdentifier);
let dottedSet = new brighterscript_1.DottedSetStatement(setObj, setNameIdentifier, dottedGet2);
return dottedSet;
}
createGuardStatement(callExpression) {
let nameIdentifier = (0, brighterscript_1.createIdentifier)('__le', callExpression.range);
let objIdentifier = (0, brighterscript_1.createIdentifier)('m', callExpression.range);
let obj = new brighterscript_1.VariableExpression(objIdentifier);
let dottedGet = new brighterscript_1.DottedGetExpression(obj, nameIdentifier, brighterscript.createToken(brighterscript.TokenKind.Dot, '.', callExpression.range));
let trueExpression = new brighterscript_1.LiteralExpression(brighterscript.createToken(brighterscript.TokenKind.True, 'true', callExpression.range));
let binaryExpression = new brighterscript_1.BinaryExpression(dottedGet, brighterscript.createToken(brighterscript.TokenKind.Equal, '=', callExpression.range), trueExpression);
return (0, Utils_1.createIfStatement)(binaryExpression, [callExpression.parent]);
}
afterFileTranspile(event) {
if (this.rokuLogConfig.removeComments) {
let text = event.code;
if (event.outputPath.endsWith('.xml')) {
text = text.replace(/<!(--.*?--)?>/gim, '');
}
else {
text = text.replace(/^(?: *|\t*)('[^\n]*)/gim, '');
}
event.code = text;
}
}
}
exports.RokuLogPlugin = RokuLogPlugin;
exports.default = () => {
return new RokuLogPlugin();
};
//# sourceMappingURL=plugin.js.map