maestro-cli-roku
Version:
command line tools for maestro-roku projects
302 lines (301 loc) • 13.8 kB
JavaScript
"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;