@neo-one/smart-contract-compiler
Version:
NEO•ONE TypeScript smart contract compiler.
116 lines (114 loc) • 5.26 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.HandleNormalHelper = void 0;
const tslib_1 = require("tslib");
const ts_utils_1 = require("@neo-one/ts-utils");
const utils_1 = require("@neo-one/utils");
const typescript_1 = tslib_1.__importDefault(require("typescript"));
const Helper_1 = require("../Helper");
const utils_2 = require("./utils");
class HandleNormalHelper extends Helper_1.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 (typescript_1.default.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: ts_utils_1.tsUtils.parametered.getParameters(decl),
mapParam: utils_2.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: ts_utils_1.tsUtils.parametered.getParameters(decl),
mapParam: utils_2.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_1.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);
}
}
exports.HandleNormalHelper = HandleNormalHelper;
//# sourceMappingURL=HandleNormalHelper.js.map