@neo-one/smart-contract-compiler
Version:
NEO•ONE TypeScript smart contract compiler.
73 lines (71 loc) • 3.17 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.CreateClassHelper = void 0;
const constants_1 = require("../../constants");
const Helper_1 = require("../Helper");
class CreateClassHelper extends Helper_1.Helper {
constructor(options) {
super();
this.ctor = options.ctor;
this.prototypeMethods = options.prototypeMethods === undefined ? {} : options.prototypeMethods;
this.prototypeSymbolMethods = options.prototypeSymbolMethods === undefined ? {} : options.prototypeSymbolMethods;
this.classMethods = options.classMethods === undefined ? {} : options.classMethods;
this.classSymbolMethods = options.classSymbolMethods === undefined ? {} : options.classSymbolMethods;
}
emit(sb, node, optionsIn) {
const options = sb.pushValueOptions(optionsIn);
const createMethod = (body) => {
sb.emitHelper(node, options, sb.helpers.createFunctionArray({
body: (innerOptions) => {
body(sb.pushValueOptions(innerOptions));
sb.emitHelper(node, innerOptions, sb.helpers.return);
},
}));
sb.emitHelper(node, options, sb.helpers.createFunctionObject({
property: constants_1.InternalObjectProperty.Call,
}));
};
const createPropertyMethod = (name, body) => {
sb.emitOp(node, 'DUP');
sb.emitPushString(node, name);
createMethod(body);
sb.emitHelper(node, options, sb.helpers.setDataPropertyObjectProperty);
};
const wrapSymbolMethod = (name, body) => {
sb.emitOp(node, 'DUP');
sb.emitPushString(node, name);
createMethod(body);
sb.emitHelper(node, options, sb.helpers.setDataSymbolObjectProperty);
};
sb.emitHelper(node, options, sb.helpers.createObject);
Object.entries(this.prototypeMethods).forEach(([name, body]) => {
createPropertyMethod(name, body);
});
Object.entries(this.prototypeSymbolMethods).forEach(([name, body]) => {
wrapSymbolMethod(name, body);
});
sb.emitHelper(node, options, sb.helpers.createConstructArray({
withScope: false,
body: (innerOptions) => {
if (this.ctor !== undefined) {
this.ctor(innerOptions);
}
},
}));
sb.emitHelper(node, options, sb.helpers.createFunctionObject({
property: constants_1.InternalObjectProperty.Construct,
}));
sb.emitOp(node, 'TUCK');
sb.emitPushString(node, 'prototype');
sb.emitOp(node, 'ROT');
sb.emitHelper(node, options, sb.helpers.setDataPropertyObjectProperty);
Object.entries(this.classMethods).forEach(([name, body]) => {
createPropertyMethod(name, body);
});
Object.entries(this.classSymbolMethods).forEach(([name, body]) => {
wrapSymbolMethod(name, body);
});
}
}
exports.CreateClassHelper = CreateClassHelper;
//# sourceMappingURL=CreateClassHelper.js.map