@neo-one/smart-contract-compiler
Version:
NEO•ONE TypeScript smart contract compiler.
49 lines (47 loc) • 1.97 kB
JavaScript
import { tsUtils } from '@neo-one/ts-utils';
import { utils } from '@neo-one/utils';
import ts from 'typescript';
import { NodeCompiler } from '../NodeCompiler';
export class PostfixUnaryExpressionCompiler extends NodeCompiler {
constructor() {
super(...arguments);
this.kind = ts.SyntaxKind.PostfixUnaryExpression;
}
visitNode(sb, expr, options) {
sb.visit(tsUtils.expression.getOperand(expr), sb.noSetValueOptions(sb.pushValueOptions(options)));
const token = tsUtils.expression.getOperator(expr);
switch (token) {
case ts.SyntaxKind.PlusPlusToken:
case ts.SyntaxKind.MinusMinusToken:
this.visitAssignment(sb, token, expr, options);
break;
default:
utils.assertNever(token);
}
}
visitAssignment(sb, token, expr, options) {
if (options.pushValue) {
sb.emitOp(expr, 'DUP');
}
switch (token) {
case ts.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 ts.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.assertNever(token);
}
sb.visit(tsUtils.expression.getOperand(expr), sb.noPushValueOptions(sb.setValueOptions(options)));
}
}
//# sourceMappingURL=PostfixUnaryExpressionCompiler.js.map