@neo-one/smart-contract-compiler
Version:
NEO•ONE TypeScript smart contract compiler.
99 lines (97 loc) • 15.7 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
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;
}
emit(sb, node, optionsIn) {
const options = sb.pushValueOptions(optionsIn);
const propInfo = this.propInfo;
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);
}
}
exports.HandleNormalHelper = HandleNormalHelper;
//# sourceMappingURL=data:application/json;charset=utf8;base64,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O1lBQzlCLE1BQU0sSUFBSSxLQUFLLENBQUMsdUJBQXVCLENBQUMsQ0FBQztTQUMxQztRQUVELElBQUksUUFBUSxDQUFDLElBQUksS0FBSyxTQUFTLEVBQUU7WUFDL0IsRUFBRSxDQUFDLFVBQVUsQ0FBQyxJQUFJLEVBQUUsT0FBTyxFQUFFLEVBQUUsQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLEVBQUUsY0FBYyxFQUFFLFFBQVEsQ0FBQyxjQUFjLEVBQUUsQ0FBQyxDQUFDLENBQUM7WUFFOUYsT0FBTztTQUNSO1FBRUQsYUFBSyxDQUFDLFdBQVcsQ0FBQyxRQUFRLENBQUMsQ0FBQztJQUM5QixDQUFDO0NBQ0Y7QUFsSUQsZ0RBa0lDIiwiZmlsZSI6Im5lby1vbmUtc21hcnQtY29udHJhY3QtY29tcGlsZXIvc3JjL2NvbXBpbGUvaGVscGVyL2NvbnRyYWN0L0hhbmRsZU5vcm1hbEhlbHBlci5qcyIsInNvdXJjZXNDb250ZW50IjpbIi8vIHRzbGludDpkaXNhYmxlIHByZWZlci1zd2l0Y2hcbmltcG9ydCB7IHRzVXRpbHMgfSBmcm9tICdAbmVvLW9uZS90cy11dGlscyc7XG5pbXBvcnQgeyB1dGlscyB9IGZyb20gJ0BuZW8tb25lL3V0aWxzJztcbmltcG9ydCB0cyBmcm9tICd0eXBlc2NyaXB0JztcbmltcG9ydCB7IFByb3BJbmZvIH0gZnJvbSAnLi4vLi4vLi4vY29udHJhY3QnO1xuaW1wb3J0IHsgU2NyaXB0QnVpbGRlciB9IGZyb20gJy4uLy4uL3NiJztcbmltcG9ydCB7IFZpc2l0T3B0aW9ucyB9IGZyb20gJy4uLy4uL3R5cGVzJztcbmltcG9ydCB7IEhlbHBlciB9IGZyb20gJy4uL0hlbHBlcic7XG5pbXBvcnQgeyBjcmVhdGVXcmFwUGFyYW0gfSBmcm9tICcuL3V0aWxzJztcblxuZXhwb3J0IGludGVyZmFjZSBIYW5kbGVOb3JtYWxIZWxwZXJPcHRpb25zIHtcbiAgcmVhZG9ubHkgcHJvcEluZm86IFByb3BJbmZvO1xuICByZWFkb25seSBnZXR0ZXI/OiBib29sZWFuO1xufVxuXG4vLyBJbnB1dDogW11cbi8vIE91dHB1dDogW3ZhbHVlXVxuZXhwb3J0IGNsYXNzIEhhbmRsZU5vcm1hbEhlbHBlciBleHRlbmRzIEhlbHBlciB7XG4gIHByaXZhdGUgcmVhZG9ubHkgcHJvcEluZm86IFByb3BJbmZvO1xuICBwcml2YXRlIHJlYWRvbmx5IGdldHRlcj86IGJvb2xlYW47XG5cbiAgcHVibGljIGNvbnN0cnVjdG9yKHsgcHJvcEluZm8sIGdldHRlciB9OiBIYW5kbGVOb3JtYWxIZWxwZXJPcHRpb25zKSB7XG4gICAgc3VwZXIoKTtcbiAgICB0aGlzLnByb3BJbmZvID0gcHJvcEluZm87XG4gICAgdGhpcy5nZXR0ZXIgPSBnZXR0ZXI7XG4gIH1cblxuICBwdWJsaWMgZW1pdChzYjogU2NyaXB0QnVpbGRlciwgbm9kZTogdHMuTm9kZSwgb3B0aW9uc0luOiBWaXNpdE9wdGlvbnMpOiB2b2lkIHtcbiAgICBjb25zdCBvcHRpb25zID0gc2IucHVzaFZhbHVlT3B0aW9ucyhvcHRpb25zSW4pO1xuXG4gICAgY29uc3QgcHJvcEluZm8gPSB0aGlzLnByb3BJbmZvO1xuXG4gICAgaWYgKHByb3BJbmZvLnR5cGUgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIGNvbnN0IHsgZGVjbCwgcmV0dXJuVHlwZSB9ID0gcHJvcEluZm87XG4gICAgICBpZiAodHMuaXNQcm9wZXJ0eURlY2xhcmF0aW9uKGRlY2wpKSB7XG4gICAgICAgIHNiLmNvbnRleHQucmVwb3J0VW5zdXBwb3J0ZWQoZGVjbCk7XG5cbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICAvLyBbbnVtYmVyXVxuICAgICAgc2IuZW1pdFB1c2hJbnQoZGVjbCwgMSk7XG4gICAgICAvLyBbYXJnXVxuICAgICAgc2IuZW1pdEhlbHBlcihkZWNsLCBvcHRpb25zLCBzYi5oZWxwZXJzLmdldEFyZ3VtZW50KTtcbiAgICAgIGlmIChwcm9wSW5mby5jbGFpbSkge1xuICAgICAgICAvLyBbYXJnLCBhcmddXG4gICAgICAgIHNiLmVtaXRPcChkZWNsLCAnRFVQJyk7XG4gICAgICAgIC8vIFt0cmFuc2FjdGlvbiwgYXJnLCBhcmddXG4gICAgICAgIHNiLmVtaXRTeXNDYWxsKGRlY2wsICdTeXN0ZW0uRXhlY3V0aW9uRW5naW5lLkdldFNjcmlwdENvbnRhaW5lcicpO1xuICAgICAgICAvLyBbYXJnXVxuICAgICAgICBzYi5lbWl0T3AoZGVjbCwgJ0FQUEVORCcpO1xuICAgICAgfVxuICAgICAgc2Iud2l0aFNjb3BlKGRlY2wsIG9wdGlvbnMsIChpbm5lck9wdGlvbnMpID0+IHtcbiAgICAgICAgc2IuZW1pdEhlbHBlcihcbiAgICAgICAgICBkZWNsLFxuICAgICAgICAgIGlubmVyT3B0aW9ucyxcbiAgICAgICAgICBzYi5oZWxwZXJzLnBhcmFtZXRlcnMoe1xuICAgICAgICAgICAgcGFyYW1zOiB0c1V0aWxzLnBhcmFtZXRlcmVkLmdldFBhcmFtZXRlcnMoZGVjbCksXG4gICAgICAgICAgICBtYXBQYXJhbTogY3JlYXRlV3JhcFBhcmFtKHNiKSxcbiAgICAgICAgICB9KSxcbiAgICAgICAgKTtcbiAgICAgICAgc2IuZW1pdEhlbHBlcihkZWNsLCBpbm5lck9wdGlvbnMsIHNiLmhlbHBlcnMuaW52b2tlU21hcnRDb250cmFjdE1ldGhvZCh7IG1ldGhvZDogZGVjbCB9KSk7XG4gICAgICAgIHNiLmVtaXRIZWxwZXIoZGVjbCwgaW5uZXJPcHRpb25zLCBzYi5oZWxwZXJzLnVud3JhcFZhbFJlY3Vyc2l2ZSh7IHR5cGU6IHJldHVyblR5cGUgfSkpO1xuICAgICAgfSk7XG5cbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAocHJvcEluZm8udHlwZSA9PT0gJ3Byb3BlcnR5Jykge1xuICAgICAgY29uc3QgeyBkZWNsIH0gPSBwcm9wSW5mbztcblxuICAgICAgc2IuZW1pdFB1c2hTdHJpbmcoZGVjbCwgcHJvcEluZm8ubmFtZSk7XG4gICAgICBzYi5lbWl0SGVscGVyKGRlY2wsIG9wdGlvbnMsIHNiLmhlbHBlcnMuZ2V0Q29tbW9uU3RvcmFnZSk7XG4gICAgICBzYi5lbWl0SGVscGVyKGRlY2wsIG9wdGlvbnMsIHNiLmhlbHBlcnMudW53cmFwVmFsUmVjdXJzaXZlKHsgdHlwZTogc2IuY29udGV4dC5hbmFseXNpcy5nZXRUeXBlKGRlY2wpIH0pKTtcblxuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmIChwcm9wSW5mby50eXBlID09PSAnYWNjZXNzb3InKSB7XG4gICAgICBjb25zdCB7IHByb3BlcnR5VHlwZSB9ID0gcHJvcEluZm87XG4gICAgICBpZiAodGhpcy5nZXR0ZXIpIHtcbiAgICAgICAgY29uc3QgeyBnZXR0ZXIgfSA9IHByb3BJbmZvO1xuICAgICAgICBpZiAoZ2V0dGVyICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICBjb25zdCB7IGRlY2wgfSA9IGdldHRlcjtcblxuICAgICAgICAgIHNiLndpdGhTY29wZShkZWNsLCBvcHRpb25zLCAoaW5uZXJPcHRpb25zKSA9PiB7XG4gICAgICAgICAgICBzYi5lbWl0SGVscGVyKGRlY2wsIGlubmVyT3B0aW9ucywgc2IuaGVscGVycy5pbnZva2VTbWFydENvbnRyYWN0TWV0aG9kKHsgbWV0aG9kOiBkZWNsIH0pKTtcbiAgICAgICAgICAgIHNiLmVtaXRIZWxwZXIoZGVjbCwgaW5uZXJPcHRpb25zLCBzYi5oZWxwZXJzLnVud3JhcFZhbFJlY3Vyc2l2ZSh7IHR5cGU6IHByb3BlcnR5VHlwZSB9KSk7XG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnN0IHsgc2V0dGVyIH0gPSBwcm9wSW5mbztcbiAgICAgICAgaWYgKHNldHRlciAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgY29uc3QgeyBkZWNsIH0gPSBzZXR0ZXI7XG5cbiAgICAgICAgICAvLyBbbnVtYmVyXVxuICAgICAgICAgIHNiLmVtaXRQdXNoSW50KGRlY2wsIDEpO1xuICAgICAgICAgIC8vIFthcmddXG4gICAgICAgICAgc2IuZW1pdEhlbHBlcihkZWNsLCBvcHRpb25zLCBzYi5oZWxwZXJzLmdldEFyZ3VtZW50KTtcbiAgICAgICAgICBzYi53aXRoU2NvcGUoZGVjbCwgb3B0aW9ucywgKGlubmVyT3B0aW9ucykgPT4ge1xuICAgICAgICAgICAgc2IuZW1pdEhlbHBlcihcbiAgICAgICAgICAgICAgZGVjbCxcbiAgICAgICAgICAgICAgaW5uZXJPcHRpb25zLFxuICAgICAgICAgICAgICBzYi5oZWxwZXJzLnBhcmFtZXRlcnMoe1xuICAgICAgICAgICAgICAgIHBhcmFtczogdHNVdGlscy5wYXJhbWV0ZXJlZC5nZXRQYXJhbWV0ZXJzKGRlY2wpLFxuICAgICAgICAgICAgICAgIG1hcFBhcmFtOiBjcmVhdGVXcmFwUGFyYW0oc2IpLFxuICAgICAgICAgICAgICB9KSxcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICAvLyBbXVxuICAgICAgICAgICAgc2IuZW1pdEhlbHBlcihcbiAgICAgICAgICAgICAgZGVjbCxcbiAgICAgICAgICAgICAgc2Iubm9QdXNoVmFsdWVPcHRpb25zKGlubmVyT3B0aW9ucyksXG4gICAgICAgICAgICAgIHNiLmhlbHBlcnMuaW52b2tlU21hcnRDb250cmFjdE1ldGhvZCh7IG1ldGhvZDogZGVjbCB9KSxcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICAvLyBbYnVmZmVyXVxuICAgICAgICAgICAgc2IuZW1pdFB1c2hCdWZmZXIoZGVjbCwgQnVmZmVyLmFsbG9jKDAsIDApKTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKHByb3BJbmZvLnR5cGUgPT09ICdyZWZ1bmRBc3NldHMnKSB7XG4gICAgICBzYi5lbWl0SGVscGVyKG5vZGUsIG9wdGlvbnMsIHNiLmhlbHBlcnMucmVmdW5kQXNzZXRzKTtcblxuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmIChwcm9wSW5mby50eXBlID09PSAnY29tcGxldGVTZW5kJykge1xuICAgICAgc2IuZW1pdEhlbHBlcihub2RlLCBvcHRpb25zLCBzYi5oZWxwZXJzLmNvbXBsZXRlU2VuZCk7XG5cbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAocHJvcEluZm8udHlwZSA9PT0gJ2RlcGxveScpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignU29tZXRoaW5nIHdlbnQgd3JvbmchJyk7XG4gICAgfVxuXG4gICAgaWYgKHByb3BJbmZvLnR5cGUgPT09ICd1cGdyYWRlJykge1xuICAgICAgc2IuZW1pdEhlbHBlcihub2RlLCBvcHRpb25zLCBzYi5oZWxwZXJzLnVwZ3JhZGUoeyBhcHByb3ZlVXBncmFkZTogcHJvcEluZm8uYXBwcm92ZVVwZ3JhZGUgfSkpO1xuXG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdXRpbHMuYXNzZXJ0TmV2ZXIocHJvcEluZm8pO1xuICB9XG59XG4iXX0=