UNPKG

maestro-cli-roku

Version:

command line tools for maestro-roku projects

104 lines (103 loc) 5.36 kB
"use strict"; 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;