UNPKG

@neo-one/smart-contract-compiler

Version:

NEO•ONE TypeScript smart contract compiler.

76 lines (74 loc) 12.2 kB
"use strict"; 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=