@neo-one/smart-contract-compiler
Version:
NEO•ONE TypeScript smart contract compiler.
61 lines (59 loc) • 2.64 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.add = void 0;
const tslib_1 = require("tslib");
const ts_utils_1 = require("@neo-one/ts-utils");
const typescript_1 = tslib_1.__importDefault(require("typescript"));
const constants_1 = require("../../constants");
const BuiltinCall_1 = require("../BuiltinCall");
class CreateEventNotifier extends BuiltinCall_1.BuiltinCall {
emitCall(sb, node, options) {
if (!options.pushValue) {
return;
}
const args = ts_utils_1.tsUtils.argumented.getArguments(node);
if (args.length < 1) {
return;
}
const arg = args[0];
if (!typescript_1.default.isStringLiteral(arg)) {
return;
}
const eventName = ts_utils_1.tsUtils.literal.getLiteralValue(arg);
const type = sb.context.analysis.getType(node);
const result = sb.context.analysis.extractSignatureForType(node, type, { error: true });
if (result === undefined) {
return;
}
const { paramDecls, paramTypes } = result;
sb.emitHelper(node, options, sb.helpers.createFunctionArray({
body: (innerOptionsIn) => {
const innerOptions = sb.pushValueOptions(innerOptionsIn);
sb.emitHelper(node, innerOptions, sb.helpers.parameters({
params: paramDecls,
asArgsArr: true,
map: (param, innerInnerOptions, isRestElement) => {
let tpe = paramTypes.get(param);
if (type !== undefined && isRestElement) {
tpe = ts_utils_1.tsUtils.type_.getArrayType(type);
}
sb.emitHelper(node, innerInnerOptions, sb.helpers.unwrapValRecursive({ type: tpe }));
},
}));
sb.emitOp(node, 'UNPACK');
sb.emitPushString(node, eventName);
sb.emitOp(node, 'SWAP');
sb.emitOp(node, 'INC');
sb.emitOp(node, 'PACK');
sb.emitSysCall(node, 'Neo.Runtime.Notify');
sb.emitHelper(node, innerOptions, sb.helpers.wrapUndefined);
sb.emitHelper(node, innerOptions, sb.helpers.return);
},
}));
sb.emitHelper(node, options, sb.helpers.createFunctionObject({ property: constants_1.InternalObjectProperty.Call }));
}
}
exports.add = (builtins) => {
builtins.addContractValue('createEventNotifier', new CreateEventNotifier());
};
//# sourceMappingURL=createEventNotifier.js.map