UNPKG

maestro-cli-roku

Version:

command line tools for maestro-roku projects

302 lines (301 loc) 13.8 kB
"use strict"; var __read = (this && this.__read) || function (o, n) { var m = typeof Symbol === "function" && o[Symbol.iterator]; if (!m) return o; var i = m.call(o), r, ar = [], e; try { while ((n === void 0 || n-- > 0) && !(r = i.next()).done) ar.push(r.value); } catch (error) { e = { error: error }; } finally { try { if (r && !r.done && (m = i["return"])) m.call(i); } finally { if (e) throw e.error; } } return ar; }; var __spread = (this && this.__spread) || function () { for (var ar = [], i = 0; i < arguments.length; i++) ar = ar.concat(__read(arguments[i])); return ar; }; var __values = (this && this.__values) || function(o) { var s = typeof Symbol === "function" && Symbol.iterator, m = s && o[s], i = 0; if (m) return m.call(o); if (o && typeof o.length === "number") return { next: function () { if (o && i >= o.length) o = void 0; return { value: o && o[i++], done: !o }; } }; throw new TypeError(s ? "Object is not iterable." : "Symbol.iterator is not defined."); }; Object.defineProperty(exports, "__esModule", { value: true }); var Feedback_1 = require("../utils/Feedback"); var BrsClassMember_1 = require("./BrsClassMember"); var ClassType; (function (ClassType) { ClassType[ClassType["Node"] = 0] = "Node"; ClassType[ClassType["AA"] = 1] = "AA"; })(ClassType = exports.ClassType || (exports.ClassType = {})); var BrsClass = /** @class */ (function () { function BrsClass(file, className, extendsName) { this._isAddingDefaultConstructor = false; this._classType = ClassType.AA; this._file = file; this._className = className; this._extendsName = extendsName; this._builderName = "__" + this.className + "_builder"; this._constructorName = "__" + this.className; this._defaultConstructorName = (this.file.namespace ? this.file.namespace.name : '') + "_" + this.className + "_new_"; } Object.defineProperty(BrsClass.prototype, "members", { get: function () { return this._members; }, set: function (value) { this._members = value; if (!this.classConstructor) { this._members.set('new__', new BrsClassMember_1.BrsClassMember(this, 'new_', BrsClassMember_1.MemberVisibility.Private, BrsClassMember_1.MemberType.Constructor, '', '')); this._isAddingDefaultConstructor = true; } }, enumerable: true, configurable: true }); Object.defineProperty(BrsClass.prototype, "vars", { get: function () { return __spread(this._members.values()).filter(function (m) { return m.type === BrsClassMember_1.MemberType.Variable; }); }, enumerable: true, configurable: true }); Object.defineProperty(BrsClass.prototype, "classConstructor", { get: function () { return __spread(this._members.values()).find(function (m) { return m.type === BrsClassMember_1.MemberType.Constructor; }); }, enumerable: true, configurable: true }); Object.defineProperty(BrsClass.prototype, "methods", { get: function () { return __spread(this._members.values()).filter(function (m) { return m.type === BrsClassMember_1.MemberType.Function || m.type === BrsClassMember_1.MemberType.Sub || m.type === BrsClassMember_1.MemberType.Constructor; }); }, enumerable: true, configurable: true }); Object.defineProperty(BrsClass.prototype, "className", { get: function () { return this._className; }, enumerable: true, configurable: true }); Object.defineProperty(BrsClass.prototype, "fullyScopedClassName", { get: function () { return this.file.namespace.name || '' + '_' + this._className; }, enumerable: true, configurable: true }); Object.defineProperty(BrsClass.prototype, "extendsName", { get: function () { return this._extendsName; }, enumerable: true, configurable: true }); Object.defineProperty(BrsClass.prototype, "extendedClass", { get: function () { return this._extendedClass; }, set: function (brsClass) { this._extendedClass = brsClass; }, enumerable: true, configurable: true }); Object.defineProperty(BrsClass.prototype, "file", { get: function () { return this._file; }, enumerable: true, configurable: true }); Object.defineProperty(BrsClass.prototype, "classType", { get: function () { return this._classType; }, set: function (value) { this._classType = value; }, enumerable: true, configurable: true }); BrsClass.prototype.getBuilderFunction = function () { var superBuilderStatement = "instance = " + (this.extendsName ? "__" + this.extendsName + "_builder()" : '{}'); var publicVars = this.vars.filter(function (v) { return v.visibility === BrsClassMember_1.MemberVisibility.Public; }); var privateVars = this.vars.filter(function (v) { return v.visibility === BrsClassMember_1.MemberVisibility.Private; }); var publicMethods = this.methods.filter(function (v) { return v.visibility === BrsClassMember_1.MemberVisibility.Public; }); var privateMethods = this.methods.filter(function (v) { return v.visibility === BrsClassMember_1.MemberVisibility.Private; }); var instanceName = this.className + "_instance"; // ${this.getMemberDefinitions([this.classConstructor])} var text = "\n function " + this._builderName + "()\n " + superBuilderStatement + "\n " + instanceName + " = {\n __className: \"" + this.className + "\"\n " + this.getMemberDefinitions(publicMethods) + "\n " + this.getMemberDefinitions(publicVars) + "\n " + this.getMemberDefinitions(privateVars) + "\n " + this.getMemberDefinitions(privateMethods) + "\n }\n instance.append(" + instanceName + ")\n return instance\n end function\n "; return text; }; BrsClass.prototype.getConstructorFunction = function () { var constructorArgs = this.classConstructor.defaultValue; var constructorName = "__" + this.className; var constructorCall = "instance." + constructorName + "(" + this.getConstructorCallArgs(this.classConstructor.defaultValue) + ")"; var text = "\n function " + this.className + "(" + constructorArgs + ")\n instance = " + this._builderName + "()\n " + constructorCall + "\n return instance\n end function\n "; if (this._isAddingDefaultConstructor) { var superContstructorCall = this.extendsName ? "m.__" + this.extendsName + "()" : ''; text += "\n function " + this._defaultConstructorName + "()\n " + superContstructorCall + "\n end function\n "; } return text; }; BrsClass.prototype.getMemberDefinitions = function (members) { var e_1, _a; var text = '\n'; // console.log('name', this.className); var namespaceName = this.file.namespace ? this.file.namespace.name + '_' : ''; namespaceName += this.file.brsClass.className + '_'; namespaceName = namespaceName.replace(/\./g, '_'); try { for (var members_1 = __values(members), members_1_1 = members_1.next(); !members_1_1.done; members_1_1 = members_1.next()) { var m = members_1_1.value; if (m.type === BrsClassMember_1.MemberType.Variable) { text += "\n " + m.name + ": " + m.defaultValue; } else if (m.type === BrsClassMember_1.MemberType.Constructor) { text += "\n __" + this.className + ": " + namespaceName + m.name; } else if (m.isOverride) { var implementingClass = this.file.brsClass.getImplementingParent(m.name); if (implementingClass) { var implementingNamespaceName = implementingClass.file.namespace ? implementingClass.file.namespace.name + '_' : ''; var methodName = m.name + "_" + implementingClass.className; text += "\n " + methodName + ": " + implementingNamespaceName + implementingClass.className + "_" + m.name; } else { // this error will be reported by ClassProcessor } text += "\n " + m.name + ": " + namespaceName + m.name; } else { text += "\n " + m.name + ": " + namespaceName + m.name; } } } catch (e_1_1) { e_1 = { error: e_1_1 }; } finally { try { if (members_1_1 && !members_1_1.done && (_a = members_1.return)) _a.call(members_1); } finally { if (e_1) throw e_1.error; } } return text; }; BrsClass.prototype.getConstructorCallArgs = function (args) { if (args) { var allArgs = args.split(','); return allArgs.length > 0 ? allArgs .map(function (a) { var parts = a.trim().split(' '); return parts.length > 0 ? parts[0] : ''; }) .join(', ') : ''; } else { return ''; } }; BrsClass.prototype.replaceSuperCalls = function (contents) { var e_2, _a; if (this.extendsName || this.file.instantiators.length > 0) { var linesToModify = this.methods.filter(function (m) { return m.isOverride; }); if (linesToModify.length > 0) { var lines = contents.split('\n'); var _loop_1 = function (member) { // console.log('REPLACE ', this.className, member.name, member.type); // '( |\\t)*(m\\.super)( |\\t)*(\\()+', var fixSuperRegex = new RegExp('( |\\t)*(m\\.super|super|super\\.[a-z|0-9|_]*)( |\\t)*(\\()+', 'gim'); if (member.superCallLineNumber === -1) { if (member.type === BrsClassMember_1.MemberType.Constructor) { if (this_1.extendsName) { Feedback_1.feedbackError(this_1.file, "No super call in overridden constructor " + member.name + ": " + this_1.file.filename); } } else { // feedbackVerbose( // this.file, // `No super call in overridden method ${member.name}: ${this.file.filename}` // ); } return "continue"; } var line = lines[member.superCallLineNumber]; if (member.type !== BrsClassMember_1.MemberType.Constructor) { var implementingClass = this_1.getImplementingParent(member.name); if (implementingClass) { member.superCallMethodName = member.name + "_" + implementingClass.className; } else { Feedback_1.feedbackError(this_1.file, "No parent implements overridden method " + member.name + ": " + this_1.file.filename + ":" + member.superCallLineNumber); } } else { member.superCallMethodName = "__" + this_1.extendsName; } lines[member.superCallLineNumber] = line.replace(fixSuperRegex, function (m, m1, m2, m3) { return (m1 || '') + 'm.' + member.superCallMethodName + (m3 || '') + '('; }); }; var this_1 = this; try { for (var linesToModify_1 = __values(linesToModify), linesToModify_1_1 = linesToModify_1.next(); !linesToModify_1_1.done; linesToModify_1_1 = linesToModify_1.next()) { var member = linesToModify_1_1.value; _loop_1(member); } } catch (e_2_1) { e_2 = { error: e_2_1 }; } finally { try { if (linesToModify_1_1 && !linesToModify_1_1.done && (_a = linesToModify_1.return)) _a.call(linesToModify_1); } finally { if (e_2) throw e_2.error; } } return lines.join('\n'); } } return contents; }; BrsClass.prototype.getMemberByName = function (name) { return this.members.get(name); }; BrsClass.prototype.getImplementingParent = function (name) { var parent = this.extendedClass; while (parent) { if (parent.getMemberByName(name)) { return parent; } parent = parent.extendedClass; } return null; }; return BrsClass; }()); exports.BrsClass = BrsClass;