@neo-one/smart-contract-compiler
Version:
NEO•ONE TypeScript smart contract compiler.
85 lines (83 loc) • 4.21 kB
JavaScript
;
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