UNPKG

@neo-one/smart-contract-compiler

Version:

NEO•ONE TypeScript smart contract compiler.

73 lines (71 loc) 3.17 kB
"use strict"; 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