maestro-cli-roku
Version:
command line tools for maestro-roku projects
104 lines (103 loc) • 5.36 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
var FileType_1 = require("../fileProcessing/FileType");
var ProcessorSettings_1 = require("../fileProcessing/ProcessorSettings");
var Feedback_1 = require("../utils/Feedback");
var NameSpace_1 = require("./NameSpace");
/*
Crude typescript namespace processor - only accepts one namespace per file, and only works with simple namespaces
*/
var NamespaceProcessor = /** @class */ (function () {
function NamespaceProcessor(projectProcessor) {
this.startNamespaceRegex = new RegExp("^(?: *|\t*)(namespace) *([a-zA-Z0-9_\\.]*)", "gim");
this.endNamespaceRegex = new RegExp("^(?: *|\t*)(end Namespace)", "gim");
this.settings = new ProcessorSettings_1.ProcessorSettings();
this.config = projectProcessor.config;
this.fileMap = projectProcessor.fileMap;
this.projectProcessor = projectProcessor;
}
NamespaceProcessor.prototype.processNamespacesForFile = function (file) {
if (!file || file.fileType !== FileType_1.FileType.UncompiledBrighterscript) {
throw new Error('was given a non-bs file');
}
file.namespace = this.getNamespaceFromFile(file);
};
NamespaceProcessor.prototype.removeNamepsaceDefinitions = function (file) {
//remove namespace directives so file compiles
var updatedContents = file.getFileContents().replace(this.startNamespaceRegex, '');
updatedContents = updatedContents.replace(this.endNamespaceRegex, '');
if (file.namespace) {
//Global search and replace all function and sub definitions with the correct namespaced version
var classPrefix_1 = file.brsClass ? file.brsClass.className + '_' : '';
var regex = new RegExp('^( |\\t)*((public|private)+( |\\t)+)*(function|sub)( |\\t)+([a-zA-Z_\\-0-9]+)', 'gim');
updatedContents = updatedContents.replace(regex, function (m1, m2, m3, m4, m5, m6, m7, m8) {
if (classPrefix_1 === '') {
if (file.namespace.membersByName.has(m8)) {
Feedback_1.feedbackError(file, "Member " + m8 + " is already declared in namespace " + file.namespace.name);
}
else {
file.namespace.membersByName.add(m8);
}
}
return (m2 || '') + (m5 || '') + (m6 || '') + (m7 || '') + file.namespace.name + '_' + classPrefix_1 + m8;
});
file.setFileContents(updatedContents);
}
};
NamespaceProcessor.prototype.processNamespaceUsage = function (file) {
//remove namespace directives so file compiles
var fileContent = file.getFileContents();
var namespaces = this.projectProcessor.fileMap.allNamespaces;
if (namespaces.size > 0) {
//Global search and replace all function and sub definitions with the correct namespaced version
//TODO indenting on this is off
var regex = new RegExp('([\\|\\(|^ |^\\"|^\'|^\\)|\\/])*([a-zA-Z0-9_\.]*)\\.([a-zA-Z0-9_]*)(\\"|\\/|\\\\*)', 'gim');
fileContent = fileContent.replace(regex, function (m1, m2, m3, m4, m5) {
//m3 is a tracker for character that indicates we were not a namespace usage (probably a path, or something in a quote)
var ns = m3.replace(/\./g, '_').toLowerCase();
if (!m5 && (!m2 || (m2 !== "\\" && m2 !== "/")) && namespaces.has(ns)) {
var namespace = namespaces.get(ns);
if (!namespace.membersByName.has(m4)) {
Feedback_1.feedbackVerbose(file, "Method " + m4 + " not found in namespace " + m3);
}
return " " + (m2 || '') + ns + "_" + m4;
}
else {
return m1;
}
});
file.setFileContents(fileContent);
}
};
NamespaceProcessor.prototype.getNamespaceFromFile = function (file) {
var namespace = null;
if (file && (file.fileType === FileType_1.FileType.UncompiledBrighterscript)) {
var namespaceCount = 0;
var matches = void 0;
this.startNamespaceRegex.lastIndex = 0;
while (matches = this.startNamespaceRegex.exec(file.getFileContents())) {
namespaceCount++;
if (namespaceCount > 1) {
Feedback_1.feedbackError(file, "More than one namespace defined for file " + file.fullPath);
}
else if (matches.length > 2) {
var shortName = matches[2];
if (shortName) {
namespace = new NameSpace_1.Namespace(shortName, file);
}
else {
Feedback_1.feedbackError(file, "Found corrupt namespace declaration");
}
break;
}
}
if (namespace) {
var existingNamespace = this.fileMap.getNamespaceByName(namespace.name);
namespace = existingNamespace || namespace;
}
}
return namespace;
};
return NamespaceProcessor;
}());
exports.NamespaceProcessor = NamespaceProcessor;