@neo-one/smart-contract-compiler
Version:
NEO•ONE TypeScript smart contract compiler.
111 lines (109 loc) • 4.96 kB
JavaScript
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