UNPKG

@neo-one/smart-contract-compiler

Version:

NEO•ONE TypeScript smart contract compiler.

69 lines (67 loc) 2.99 kB
import { InternalObjectProperty } from '../../constants'; import { Helper } from '../Helper'; export class CreateClassHelper extends 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: 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: 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); }); } } //# sourceMappingURL=CreateClassHelper.js.map