UNPKG

@neo-one/smart-contract-compiler

Version:

NEO•ONE TypeScript smart contract compiler.

111 lines (109 loc) 4.96 kB
import { tsUtils } from '@neo-one/ts-utils'; import { utils } from '@neo-one/utils'; import ts from 'typescript'; import { Helper } from '../Helper'; import { createWrapParam } from './utils'; export class HandleNormalHelper extends Helper { constructor({ propInfo, getter }) { super(); this.propInfo = propInfo; this.getter = getter; } static getKey(options) { return `${options.getter}:${options.propInfo.name}`; } emit(sb, node, optionsIn) { const options = sb.pushValueOptions(optionsIn); const propInfo = this.propInfo; const handle = () => { if (propInfo.type === 'function') { const { decl, returnType } = propInfo; if (ts.isPropertyDeclaration(decl)) { sb.context.reportUnsupported(decl); return; } sb.emitPushInt(decl, 1); sb.emitHelper(decl, options, sb.helpers.getArgument); if (propInfo.claim) { sb.emitOp(decl, 'DUP'); sb.emitSysCall(decl, 'System.ExecutionEngine.GetScriptContainer'); sb.emitOp(decl, 'APPEND'); } sb.withScope(decl, options, (innerOptions) => { sb.emitHelper(decl, innerOptions, sb.helpers.parameters({ params: tsUtils.parametered.getParameters(decl), mapParam: createWrapParam(sb), })); sb.emitHelper(decl, innerOptions, sb.helpers.invokeSmartContractMethod({ method: decl })); sb.emitHelper(decl, innerOptions, sb.helpers.unwrapValRecursive({ type: returnType })); }); return; } if (propInfo.type === 'property') { const { decl } = propInfo; sb.emitPushString(decl, propInfo.name); sb.emitHelper(decl, options, sb.helpers.getCommonStorage); sb.emitHelper(decl, options, sb.helpers.unwrapValRecursive({ type: sb.context.analysis.getType(decl) })); return; } if (propInfo.type === 'accessor') { const { propertyType } = propInfo; if (this.getter) { const { getter } = propInfo; if (getter !== undefined) { const { decl } = getter; sb.withScope(decl, options, (innerOptions) => { sb.emitHelper(decl, innerOptions, sb.helpers.invokeSmartContractMethod({ method: decl })); sb.emitHelper(decl, innerOptions, sb.helpers.unwrapValRecursive({ type: propertyType })); }); } } else { const { setter } = propInfo; if (setter !== undefined) { const { decl } = setter; sb.emitPushInt(decl, 1); sb.emitHelper(decl, options, sb.helpers.getArgument); sb.withScope(decl, options, (innerOptions) => { sb.emitHelper(decl, innerOptions, sb.helpers.parameters({ params: tsUtils.parametered.getParameters(decl), mapParam: createWrapParam(sb), })); sb.emitHelper(decl, sb.noPushValueOptions(innerOptions), sb.helpers.invokeSmartContractMethod({ method: decl })); sb.emitPushBuffer(decl, Buffer.alloc(0, 0)); }); } } return; } if (propInfo.type === 'refundAssets') { sb.emitHelper(node, options, sb.helpers.refundAssets); return; } if (propInfo.type === 'completeSend') { sb.emitHelper(node, options, sb.helpers.completeSend); return; } if (propInfo.type === 'deploy') { throw new Error('Something went wrong!'); } if (propInfo.type === 'upgrade') { sb.emitHelper(node, options, sb.helpers.upgrade({ approveUpgrade: propInfo.approveUpgrade })); return; } utils.assertNever(propInfo); }; let jump = this.mutableJump; if (jump === undefined) { this.mutableJump = sb.jumpTable.add(sb, node, () => { handle(); sb.emitHelper(node, options, sb.helpers.return); }); jump = this.mutableJump; } sb.emitPushInt(node, jump); sb.emitCall(node); sb.emitHelper(node, optionsIn, sb.helpers.handleCompletion); } } //# sourceMappingURL=HandleNormalHelper.js.map