rokojori-godot/rokojori-cpp-generator/builds/cpp-creation/MemberFactory.js

98 lines
4.1 KiB
JavaScript

"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.MemberFactory = void 0;
const MemberInitializer_1 = require("./MemberInitializer");
const Method_1 = require("./members/Method");
const Field_1 = require("./members/Field");
const Signal_1 = require("./members/Signal");
class MemberFactory {
static grabMembers(membersData, accessModifier) {
let members = [];
if (!membersData) {
return members;
}
for (let it in membersData) {
if (!membersData.hasOwnProperty(it)) {
continue;
}
let nameDefinition = it;
let memberData = membersData[it];
if (MemberFactory.actionRegex.test(nameDefinition)) {
let name = MemberFactory.actionRegex.exec(nameDefinition)[1];
let upperCaseName = name[0].toUpperCase() + name.substring(1);
let actionName = `on${upperCaseName}`;
let signal = `signal ${name}()`;
members.push(MemberFactory.create(accessModifier, signal, {}));
members.push(MemberFactory.create(accessModifier, actionName, "Node<RJAction>"));
}
else if (MemberFactory.propertyRegex.test(nameDefinition)) {
let result = MemberFactory.propertyRegex.exec(nameDefinition);
let signalName = result[1];
let fieldName = result[2];
signalName = signalName || `${fieldName}Changed`;
let upperCaseName = signalName[0].toUpperCase() + signalName.substring(1);
let actionName = `on${upperCaseName}`;
let signal = `signal ${signalName}()`;
if (!result[1]) {
members.push(MemberFactory.create(accessModifier, signal, {}));
members.push(MemberFactory.create(accessModifier, actionName, "Node<RJAction>"));
}
let field = MemberFactory.create(accessModifier, fieldName, memberData);
field.isProperty = true;
field.propertySignalName = signalName;
field.propertyActionName = actionName;
members.push(field);
}
else {
let classMember = MemberFactory.create(accessModifier, nameDefinition, memberData);
members.push(classMember);
}
}
return members;
}
static create(accessModifier, nameDefinition, body) {
let memberInitializer = new MemberInitializer_1.MemberInitializer();
if (nameDefinition.indexOf("()") != -1) {
memberInitializer.isMethod = true;
memberInitializer.isVirtual = true;
let typeRegex = /\(\)\s*(?:\:\s*(.+)\s*)?$/;
let result = typeRegex.exec(nameDefinition);
if (result[1]) {
memberInitializer.type = result[1];
}
nameDefinition = nameDefinition.replace(typeRegex, "");
}
let names = nameDefinition.split(/\s+/);
memberInitializer.name = names[names.length - 1];
for (let i = 0; i < names.length - 1; i++) {
if ("final" === names[i]) {
memberInitializer.isVirtual = false;
}
if ("static" === names[i]) {
memberInitializer.isStatic = true;
}
if ("signal" === names[i]) {
memberInitializer.isSignal = true;
}
}
let member = null;
if (memberInitializer.isMethod) {
if (memberInitializer.isSignal) {
member = new Signal_1.Signal(memberInitializer);
}
else {
member = new Method_1.Method(memberInitializer);
}
}
else {
member = new Field_1.Field(memberInitializer);
}
member.accessModifier = accessModifier;
member.parseBody(body);
return member;
}
}
exports.MemberFactory = MemberFactory;
MemberFactory.actionRegex = /^\s*action\s+(\w+)\s*$/;
MemberFactory.propertyRegex = /^\s*property(?:\s*\@\s*(\w+))?\s+(\w+)\s*$/;
//# sourceMappingURL=MemberFactory.js.map