UNPKG

@neo-one/smart-contract-compiler

Version:

NEO•ONE TypeScript smart contract compiler.

85 lines (83 loc) 4.21 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.PrefixUnaryExpressionCompiler = void 0; 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 NodeCompiler_1 = require("../NodeCompiler"); class PrefixUnaryExpressionCompiler extends NodeCompiler_1.NodeCompiler { constructor() { super(...arguments); this.kind = typescript_1.default.SyntaxKind.PrefixUnaryExpression; } visitNode(sb, expr, options) { const token = ts_utils_1.tsUtils.expression.getOperator(expr); switch (token) { case typescript_1.default.SyntaxKind.PlusPlusToken: case typescript_1.default.SyntaxKind.MinusMinusToken: this.visitAssignment(sb, token, expr, options); break; case typescript_1.default.SyntaxKind.PlusToken: case typescript_1.default.SyntaxKind.MinusToken: case typescript_1.default.SyntaxKind.TildeToken: case typescript_1.default.SyntaxKind.ExclamationToken: this.visitValue(sb, token, expr, options); break; default: utils_1.utils.assertNever(token); } } visitAssignment(sb, token, expr, options) { sb.visit(ts_utils_1.tsUtils.expression.getOperand(expr), sb.noSetValueOptions(sb.pushValueOptions(options))); switch (token) { case typescript_1.default.SyntaxKind.PlusPlusToken: sb.emitHelper(expr, sb.pushValueOptions(options), sb.helpers.toNumber({ type: sb.context.analysis.getType(expr) })); sb.emitOp(expr, 'INC'); sb.emitHelper(expr, sb.pushValueOptions(options), sb.helpers.wrapNumber); break; case typescript_1.default.SyntaxKind.MinusMinusToken: sb.emitHelper(expr, sb.pushValueOptions(options), sb.helpers.toNumber({ type: sb.context.analysis.getType(expr) })); sb.emitOp(expr, 'DEC'); sb.emitHelper(expr, sb.pushValueOptions(options), sb.helpers.wrapNumber); break; default: utils_1.utils.assertNever(token); } sb.visit(ts_utils_1.tsUtils.expression.getOperand(expr), sb.setValueOptions(options)); } visitValue(sb, token, expr, optionsIn) { const options = sb.pushValueOptions(optionsIn); const operand = ts_utils_1.tsUtils.expression.getOperand(expr); sb.visit(operand, sb.noSetValueOptions(options)); switch (token) { case typescript_1.default.SyntaxKind.PlusToken: sb.emitHelper(expr, options, sb.helpers.toNumber({ type: sb.context.analysis.getType(operand) })); sb.emitHelper(expr, options, sb.helpers.wrapNumber); break; case typescript_1.default.SyntaxKind.MinusToken: sb.emitHelper(expr, options, sb.helpers.toNumber({ type: sb.context.analysis.getType(operand) })); sb.emitOp(expr, 'NEGATE'); sb.emitHelper(expr, options, sb.helpers.wrapNumber); break; case typescript_1.default.SyntaxKind.TildeToken: sb.emitHelper(expr, options, sb.helpers.toNumber({ type: sb.context.analysis.getType(operand) })); sb.emitOp(expr, 'INVERT'); sb.emitHelper(expr, options, sb.helpers.wrapNumber); break; case typescript_1.default.SyntaxKind.ExclamationToken: sb.emitHelper(operand, options, sb.helpers.toBoolean({ type: sb.context.analysis.getType(operand) })); sb.emitOp(expr, 'NOT'); sb.emitHelper(operand, options, sb.helpers.wrapBoolean); break; default: utils_1.utils.assertNever(token); } if (!optionsIn.pushValue) { sb.emitOp(expr, 'DROP'); return; } } } exports.PrefixUnaryExpressionCompiler = PrefixUnaryExpressionCompiler; //# sourceMappingURL=PrefixUnaryExpressionCompiler.js.map