@neo-one/smart-contract-compiler
Version:
NEO•ONE TypeScript smart contract compiler.
76 lines (74 loc) • 12.2 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
const tslib_1 = require("tslib");
const ts_utils_1 = require("@neo-one/ts-utils");
const typescript_1 = tslib_1.__importDefault(require("typescript"));
const NodeCompiler_1 = require("../NodeCompiler");
class ForInStatementCompiler extends NodeCompiler_1.NodeCompiler {
constructor() {
super(...arguments);
this.kind = typescript_1.default.SyntaxKind.ForInStatement;
}
visitNode(sb, node, optionsIn) {
const options = sb.pushValueOptions(optionsIn);
const initializer = ts_utils_1.tsUtils.statement.getInitializer(node);
if (!typescript_1.default.isVariableDeclarationList(initializer)) {
sb.context.reportUnsupported(initializer);
return;
}
const variables = ts_utils_1.tsUtils.variable.getDeclarations(initializer);
if (variables.length !== 1) {
sb.context.reportUnsupported(initializer);
return;
}
const variable = variables[0];
const expression = ts_utils_1.tsUtils.expression.getExpression(node);
const statement = ts_utils_1.tsUtils.statement.getStatement(node);
const expressionType = sb.context.analysis.getType(expression);
const handleArray = () => {
sb.emitHelper(expression, options, sb.helpers.unwrapArray);
sb.emitHelper(node, options, sb.helpers.arrForEach({
withIndex: true,
each: (innerOptions) => {
sb.emitOp(variable, 'DROP');
sb.emitHelper(variable, options, sb.helpers.wrapNumber);
sb.emitHelper(variable, options, sb.helpers.toString({ type: undefined }));
sb.emitHelper(variable, options, sb.helpers.wrapString);
sb.visit(variable, sb.setValueOptions(innerOptions));
sb.visit(statement, sb.noPushValueOptions(innerOptions));
},
}));
};
const handleObject = () => {
sb.emitHelper(node, options, sb.helpers.getPropertyObjectKeys);
sb.emitHelper(node, options, sb.helpers.arrForEach({
withIndex: false,
each: (innerOptions) => {
sb.emitHelper(variable, sb.pushValueOptions(innerOptions), sb.helpers.wrapString);
sb.visit(variable, sb.setValueOptions(sb.noPushValueOptions(innerOptions)));
sb.visit(statement, sb.noPushValueOptions(innerOptions));
},
}));
};
sb.visit(expression, options);
if (expressionType === undefined ||
(ts_utils_1.tsUtils.type_.hasArrayish(expressionType) && !ts_utils_1.tsUtils.type_.isOnlyArrayish(expressionType))) {
sb.emitHelper(expression, options, sb.helpers.if({
condition: () => {
sb.emitOp(expression, 'DUP');
sb.emitHelper(expression, options, sb.helpers.isArray);
},
whenTrue: handleArray,
whenFalse: handleObject,
}));
}
else if (ts_utils_1.tsUtils.type_.isOnlyArrayish(expressionType)) {
handleArray();
}
else {
handleObject();
}
}
}
exports.ForInStatementCompiler = ForInStatementCompiler;
//# sourceMappingURL=data:application/json;charset=utf8;base64,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QUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsQ0FBQztnQkFDekQsQ0FBQztnQkFDRCxRQUFRLEVBQUUsV0FBVztnQkFDckIsU0FBUyxFQUFFLFlBQVk7YUFDeEIsQ0FBQyxDQUNILENBQUM7U0FDSDthQUFNLElBQUksa0JBQU8sQ0FBQyxLQUFLLENBQUMsY0FBYyxDQUFDLGNBQWMsQ0FBQyxFQUFFO1lBQ3ZELFdBQVcsRUFBRSxDQUFDO1NBQ2Y7YUFBTTtZQUNMLFlBQVksRUFBRSxDQUFDO1NBQ2hCO0lBQ0gsQ0FBQztDQUNGO0FBdEdELHdEQXNHQyIsImZpbGUiOiJuZW8tb25lLXNtYXJ0LWNvbnRyYWN0LWNvbXBpbGVyL3NyYy9jb21waWxlL3N0YXRlbWVudC9Gb3JJblN0YXRlbWVudENvbXBpbGVyLmpzIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgdHNVdGlscyB9IGZyb20gJ0BuZW8tb25lL3RzLXV0aWxzJztcbmltcG9ydCB0cyBmcm9tICd0eXBlc2NyaXB0JztcbmltcG9ydCB7IE5vZGVDb21waWxlciB9IGZyb20gJy4uL05vZGVDb21waWxlcic7XG5pbXBvcnQgeyBTY3JpcHRCdWlsZGVyIH0gZnJvbSAnLi4vc2InO1xuaW1wb3J0IHsgVmlzaXRPcHRpb25zIH0gZnJvbSAnLi4vdHlwZXMnO1xuXG5leHBvcnQgY2xhc3MgRm9ySW5TdGF0ZW1lbnRDb21waWxlciBleHRlbmRzIE5vZGVDb21waWxlcjx0cy5Gb3JJblN0YXRlbWVudD4ge1xuICBwdWJsaWMgcmVhZG9ubHkga2luZCA9IHRzLlN5bnRheEtpbmQuRm9ySW5TdGF0ZW1lbnQ7XG5cbiAgcHVibGljIHZpc2l0Tm9kZShzYjogU2NyaXB0QnVpbGRlciwgbm9kZTogdHMuRm9ySW5TdGF0ZW1lbnQsIG9wdGlvbnNJbjogVmlzaXRPcHRpb25zKTogdm9pZCB7XG4gICAgY29uc3Qgb3B0aW9ucyA9IHNiLnB1c2hWYWx1ZU9wdGlvbnMob3B0aW9uc0luKTtcbiAgICBjb25zdCBpbml0aWFsaXplciA9IHRzVXRpbHMuc3RhdGVtZW50LmdldEluaXRpYWxpemVyKG5vZGUpO1xuICAgIGlmICghdHMuaXNWYXJpYWJsZURlY2xhcmF0aW9uTGlzdChpbml0aWFsaXplcikpIHtcbiAgICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICovXG4gICAgICBzYi5jb250ZXh0LnJlcG9ydFVuc3VwcG9ydGVkKGluaXRpYWxpemVyKTtcblxuICAgICAgLyogaXN0YW5idWwgaWdub3JlIG5leHQgKi9cbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCB2YXJpYWJsZXMgPSB0c1V0aWxzLnZhcmlhYmxlLmdldERlY2xhcmF0aW9ucyhpbml0aWFsaXplcik7XG4gICAgaWYgKHZhcmlhYmxlcy5sZW5ndGggIT09IDEpIHtcbiAgICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICovXG4gICAgICBzYi5jb250ZXh0LnJlcG9ydFVuc3VwcG9ydGVkKGluaXRpYWxpemVyKTtcblxuICAgICAgLyogaXN0YW5idWwgaWdub3JlIG5leHQgKi9cbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCB2YXJpYWJsZSA9IHZhcmlhYmxlc1swXTtcbiAgICBjb25zdCBleHByZXNzaW9uID0gdHNVdGlscy5leHByZXNzaW9uLmdldEV4cHJlc3Npb24obm9kZSk7XG4gICAgY29uc3Qgc3RhdGVtZW50ID0gdHNVdGlscy5zdGF0ZW1lbnQuZ2V0U3RhdGVtZW50KG5vZGUpO1xuICAgIGNvbnN0IGV4cHJlc3Npb25UeXBlID0gc2IuY29udGV4dC5hbmFseXNpcy5nZXRUeXBlKGV4cHJlc3Npb24pO1xuXG4gICAgY29uc3QgaGFuZGxlQXJyYXkgPSAoKSA9PiB7XG4gICAgICAvLyBbYXJyXVxuICAgICAgc2IuZW1pdEhlbHBlcihleHByZXNzaW9uLCBvcHRpb25zLCBzYi5oZWxwZXJzLnVud3JhcEFycmF5KTtcbiAgICAgIC8vIFtdXG4gICAgICBzYi5lbWl0SGVscGVyKFxuICAgICAgICBub2RlLFxuICAgICAgICBvcHRpb25zLFxuICAgICAgICBzYi5oZWxwZXJzLmFyckZvckVhY2goe1xuICAgICAgICAgIHdpdGhJbmRleDogdHJ1ZSxcbiAgICAgICAgICBlYWNoOiAoaW5uZXJPcHRpb25zKSA9PiB7XG4gICAgICAgICAgICAvLyBbaWR4XVxuICAgICAgICAgICAgc2IuZW1pdE9wKHZhcmlhYmxlLCAnRFJPUCcpO1xuICAgICAgICAgICAgLy8gW3ZhbF1cbiAgICAgICAgICAgIHNiLmVtaXRIZWxwZXIodmFyaWFibGUsIG9wdGlvbnMsIHNiLmhlbHBlcnMud3JhcE51bWJlcik7XG4gICAgICAgICAgICAvLyBbdmFsXVxuICAgICAgICAgICAgc2IuZW1pdEhlbHBlcih2YXJpYWJsZSwgb3B0aW9ucywgc2IuaGVscGVycy50b1N0cmluZyh7IHR5cGU6IHVuZGVmaW5lZCB9KSk7XG4gICAgICAgICAgICAvLyBbdmFsXVxuICAgICAgICAgICAgc2IuZW1pdEhlbHBlcih2YXJpYWJsZSwgb3B0aW9ucywgc2IuaGVscGVycy53cmFwU3RyaW5nKTtcbiAgICAgICAgICAgIC8vIFtdXG4gICAgICAgICAgICBzYi52aXNpdCh2YXJpYWJsZSwgc2Iuc2V0VmFsdWVPcHRpb25zKGlubmVyT3B0aW9ucykpO1xuICAgICAgICAgICAgLy8gW11cbiAgICAgICAgICAgIHNiLnZpc2l0KHN0YXRlbWVudCwgc2Iubm9QdXNoVmFsdWVPcHRpb25zKGlubmVyT3B0aW9ucykpO1xuICAgICAgICAgIH0sXG4gICAgICAgIH0pLFxuICAgICAgKTtcbiAgICB9O1xuXG4gICAgY29uc3QgaGFuZGxlT2JqZWN0ID0gKCkgPT4ge1xuICAgICAgLy8gW2Fycl1cbiAgICAgIHNiLmVtaXRIZWxwZXIobm9kZSwgb3B0aW9ucywgc2IuaGVscGVycy5nZXRQcm9wZXJ0eU9iamVjdEtleXMpO1xuICAgICAgLy8gW11cbiAgICAgIHNiLmVtaXRIZWxwZXIoXG4gICAgICAgIG5vZGUsXG4gICAgICAgIG9wdGlvbnMsXG4gICAgICAgIHNiLmhlbHBlcnMuYXJyRm9yRWFjaCh7XG4gICAgICAgICAgd2l0aEluZGV4OiBmYWxzZSxcbiAgICAgICAgICBlYWNoOiAoaW5uZXJPcHRpb25zKSA9PiB7XG4gICAgICAgICAgICAvLyBbc3RyaW5nVmFsXVxuICAgICAgICAgICAgc2IuZW1pdEhlbHBlcih2YXJpYWJsZSwgc2IucHVzaFZhbHVlT3B0aW9ucyhpbm5lck9wdGlvbnMpLCBzYi5oZWxwZXJzLndyYXBTdHJpbmcpO1xuICAgICAgICAgICAgLy8gW11cbiAgICAgICAgICAgIHNiLnZpc2l0KHZhcmlhYmxlLCBzYi5zZXRWYWx1ZU9wdGlvbnMoc2Iubm9QdXNoVmFsdWVPcHRpb25zKGlubmVyT3B0aW9ucykpKTtcbiAgICAgICAgICAgIC8vIFtdXG4gICAgICAgICAgICBzYi52aXNpdChzdGF0ZW1lbnQsIHNiLm5vUHVzaFZhbHVlT3B0aW9ucyhpbm5lck9wdGlvbnMpKTtcbiAgICAgICAgICB9LFxuICAgICAgICB9KSxcbiAgICAgICk7XG4gICAgfTtcblxuICAgIC8vIFtvYmplY3RWYWxdXG4gICAgc2IudmlzaXQoZXhwcmVzc2lvbiwgb3B0aW9ucyk7XG4gICAgaWYgKFxuICAgICAgZXhwcmVzc2lvblR5cGUgPT09IHVuZGVmaW5lZCB8fFxuICAgICAgKHRzVXRpbHMudHlwZV8uaGFzQXJyYXlpc2goZXhwcmVzc2lvblR5cGUpICYmICF0c1V0aWxzLnR5cGVfLmlzT25seUFycmF5aXNoKGV4cHJlc3Npb25UeXBlKSlcbiAgICApIHtcbiAgICAgIHNiLmVtaXRIZWxwZXIoXG4gICAgICAgIGV4cHJlc3Npb24sXG4gICAgICAgIG9wdGlvbnMsXG4gICAgICAgIHNiLmhlbHBlcnMuaWYoe1xuICAgICAgICAgIGNvbmRpdGlvbjogKCkgPT4ge1xuICAgICAgICAgICAgLy8gW29iamVjdFZhbCwgb2JqZWN0VmFsXVxuICAgICAgICAgICAgc2IuZW1pdE9wKGV4cHJlc3Npb24sICdEVVAnKTtcbiAgICAgICAgICAgIC8vIFtib29sZWFuXVxuICAgICAgICAgICAgc2IuZW1pdEhlbHBlcihleHByZXNzaW9uLCBvcHRpb25zLCBzYi5oZWxwZXJzLmlzQXJyYXkpO1xuICAgICAgICAgIH0sXG4gICAgICAgICAgd2hlblRydWU6IGhhbmRsZUFycmF5LFxuICAgICAgICAgIHdoZW5GYWxzZTogaGFuZGxlT2JqZWN0LFxuICAgICAgICB9KSxcbiAgICAgICk7XG4gICAgfSBlbHNlIGlmICh0c1V0aWxzLnR5cGVfLmlzT25seUFycmF5aXNoKGV4cHJlc3Npb25UeXBlKSkge1xuICAgICAgaGFuZGxlQXJyYXkoKTtcbiAgICB9IGVsc2Uge1xuICAgICAgaGFuZGxlT2JqZWN0KCk7XG4gICAgfVxuICB9XG59XG4iXX0=