@neo-one/smart-contract-compiler
Version:
NEO•ONE TypeScript smart contract compiler.
83 lines (81 loc) • 3.35 kB
JavaScript
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.ObjectKeys = void 0;
const ts_utils_1 = require("@neo-one/ts-utils");
const constants_1 = require("../../constants");
const BuiltinMemberCall_1 = require("../BuiltinMemberCall");
class ObjectKeys extends BuiltinMemberCall_1.BuiltinMemberCall {
emitCall(sb, _func, node, optionsIn) {
if (ts_utils_1.tsUtils.argumented.getArguments(node).length < 1) {
return;
}
const options = sb.pushValueOptions(optionsIn);
const arg = ts_utils_1.tsUtils.argumented.getArguments(node)[0];
const processArray = (innerOptions) => {
sb.emitHelper(node, innerOptions, sb.helpers.unwrapArray);
sb.emitOp(node, 'ARRAYSIZE');
sb.emitHelper(node, innerOptions, sb.helpers.arrRange({
map: (innerInnerOptions) => {
sb.emitHelper(node, innerInnerOptions, sb.helpers.wrapNumber);
sb.emitHelper(node, innerInnerOptions, sb.helpers.toString({ type: undefined, knownType: constants_1.Types.Number }));
sb.emitHelper(node, innerInnerOptions, sb.helpers.wrapString);
},
}));
sb.emitHelper(node, innerOptions, sb.helpers.wrapArray);
};
const emptyArray = (innerOptions) => {
sb.emitOp(node, 'DROP');
sb.emitHelper(node, innerOptions, sb.helpers.createArray);
};
const throwTypeError = (innerOptions) => {
sb.emitOp(node, 'DROP');
sb.emitHelper(node, innerOptions, sb.helpers.throwTypeError);
};
const processObject = (innerOptions) => {
sb.emitHelper(node, innerOptions, sb.helpers.getPropertyObjectKeys);
sb.emitHelper(node, innerOptions, sb.helpers.arrMap({
map: (innerInnerOptions) => {
sb.emitHelper(node, innerInnerOptions, sb.helpers.wrapString);
},
}));
sb.emitHelper(node, innerOptions, sb.helpers.wrapArray);
};
sb.visit(arg, options);
sb.emitHelper(node, options, sb.helpers.forBuiltinType({
type: sb.context.analysis.getType(arg),
array: processArray,
arrayStorage: emptyArray,
boolean: emptyArray,
buffer: emptyArray,
null: throwTypeError,
number: emptyArray,
object: processObject,
string: emptyArray,
symbol: emptyArray,
undefined: throwTypeError,
map: emptyArray,
mapStorage: emptyArray,
set: emptyArray,
setStorage: emptyArray,
error: emptyArray,
forwardValue: emptyArray,
iteratorResult: emptyArray,
iterable: emptyArray,
iterableIterator: emptyArray,
transaction: emptyArray,
output: emptyArray,
attribute: emptyArray,
input: emptyArray,
account: emptyArray,
asset: emptyArray,
contract: emptyArray,
header: emptyArray,
block: emptyArray,
}));
if (!optionsIn.pushValue) {
sb.emitOp(node, 'DROP');
}
}
}
exports.ObjectKeys = ObjectKeys;
//# sourceMappingURL=keys.js.map