@neo-one/smart-contract-compiler
Version:
NEO•ONE TypeScript smart contract compiler.
84 lines (82 loc) • 14.8 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
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=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIlByZWZpeFVuYXJ5RXhwcmVzc2lvbkNvbXBpbGVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUFBLGdEQUE0QztBQUM1QywwQ0FBdUM7QUFDdkMsb0VBQTRCO0FBQzVCLGtEQUErQztBQVUvQyxNQUFhLDZCQUE4QixTQUFRLDJCQUFzQztJQUF6Rjs7UUFDa0IsU0FBSSxHQUFHLG9CQUFFLENBQUMsVUFBVSxDQUFDLHFCQUFxQixDQUFDO0lBaUc3RCxDQUFDO0lBL0ZRLFNBQVMsQ0FBQyxFQUFpQixFQUFFLElBQThCLEVBQUUsT0FBcUI7UUFDdkYsTUFBTSxLQUFLLEdBQUcsa0JBQU8sQ0FBQyxVQUFVLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ25ELFFBQVEsS0FBSyxFQUFFO1lBQ2IsS0FBSyxvQkFBRSxDQUFDLFVBQVUsQ0FBQyxhQUFhLENBQUM7WUFDakMsS0FBSyxvQkFBRSxDQUFDLFVBQVUsQ0FBQyxlQUFlO2dCQUNoQyxJQUFJLENBQUMsZUFBZSxDQUFDLEVBQUUsRUFBRSxLQUFLLEVBQUUsSUFBSSxFQUFFLE9BQU8sQ0FBQyxDQUFDO2dCQUMvQyxNQUFNO1lBQ1IsS0FBSyxvQkFBRSxDQUFDLFVBQVUsQ0FBQyxTQUFTLENBQUM7WUFDN0IsS0FBSyxvQkFBRSxDQUFDLFVBQVUsQ0FBQyxVQUFVLENBQUM7WUFDOUIsS0FBSyxvQkFBRSxDQUFDLFVBQVUsQ0FBQyxVQUFVLENBQUM7WUFDOUIsS0FBSyxvQkFBRSxDQUFDLFVBQVUsQ0FBQyxnQkFBZ0I7Z0JBQ2pDLElBQUksQ0FBQyxVQUFVLENBQUMsRUFBRSxFQUFFLEtBQUssRUFBRSxJQUFJLEVBQUUsT0FBTyxDQUFDLENBQUM7Z0JBQzFDLE1BQU07WUFDUjtnQkFFRSxhQUFLLENBQUMsV0FBVyxDQUFDLEtBQUssQ0FBQyxDQUFDO1NBQzVCO0lBQ0gsQ0FBQztJQUVPLGVBQWUsQ0FDckIsRUFBaUIsRUFDakIsS0FBcUIsRUFDckIsSUFBOEIsRUFDOUIsT0FBcUI7UUFF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QyxPQUFPLENBQUMsV0FBVyxDQUFDLENBQUM7Z0JBQ3hELE1BQU07WUFDUjtnQkFFRSxhQUFLLENBQUMsV0FBVyxDQUFDLEtBQUssQ0FBQyxDQUFDO1NBQzVCO1FBRUQsSUFBSSxDQUFDLFNBQVMsQ0FBQyxTQUFTLEVBQUU7WUFDeEIsRUFBRSxDQUFDLE1BQU0sQ0FBQyxJQUFJLEVBQUUsTUFBTSxDQUFDLENBQUM7WUFFeEIsT0FBTztTQUNSO0lBQ0gsQ0FBQztDQUNGO0FBbEdELHNFQWtHQyIsImZpbGUiOiJuZW8tb25lLXNtYXJ0LWNvbnRyYWN0LWNvbXBpbGVyL3NyYy9jb21waWxlL2V4cHJlc3Npb24vUHJlZml4VW5hcnlFeHByZXNzaW9uQ29tcGlsZXIuanMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyB0c1V0aWxzIH0gZnJvbSAnQG5lby1vbmUvdHMtdXRpbHMnO1xuaW1wb3J0IHsgdXRpbHMgfSBmcm9tICdAbmVvLW9uZS91dGlscyc7XG5pbXBvcnQgdHMgZnJvbSAndHlwZXNjcmlwdCc7XG5pbXBvcnQgeyBOb2RlQ29tcGlsZXIgfSBmcm9tICcuLi9Ob2RlQ29tcGlsZXInO1xuaW1wb3J0IHsgU2NyaXB0QnVpbGRlciB9IGZyb20gJy4uL3NiJztcbmltcG9ydCB7IFZpc2l0T3B0aW9ucyB9IGZyb20gJy4uL3R5cGVzJztcblxudHlwZSBBc3NpZ25tZW50TGlrZSA9IHRzLlN5bnRheEtpbmQuUGx1c1BsdXNUb2tlbiB8IHRzLlN5bnRheEtpbmQuTWludXNNaW51c1Rva2VuO1xudHlwZSBWYWx1ZUxpa2UgPVxuICB8IHRzLlN5bnRheEtpbmQuUGx1c1Rva2VuXG4gIHwgdHMuU3ludGF4S2luZC5NaW51c1Rva2VuXG4gIHwgdHMuU3ludGF4S2luZC5UaWxkZVRva2VuXG4gIHwgdHMuU3ludGF4S2luZC5FeGNsYW1hdGlvblRva2VuO1xuZXhwb3J0IGNsYXNzIFByZWZpeFVuYXJ5RXhwcmVzc2lvbkNvbXBpbGVyIGV4dGVuZHMgTm9kZUNvbXBpbGVyPHRzLlByZWZpeFVuYXJ5RXhwcmVzc2lvbj4ge1xuICBwdWJsaWMgcmVhZG9ubHkga2luZCA9IHRzLlN5bnRheEtpbmQuUHJlZml4VW5hcnlFeHByZXNzaW9uO1xuXG4gIHB1YmxpYyB2aXNpdE5vZGUoc2I6IFNjcmlwdEJ1aWxkZXIsIGV4cHI6IHRzLlByZWZpeFVuYXJ5RXhwcmVzc2lvbiwgb3B0aW9uczogVmlzaXRPcHRpb25zKTogdm9pZCB7XG4gICAgY29uc3QgdG9rZW4gPSB0c1V0aWxzLmV4cHJlc3Npb24uZ2V0T3BlcmF0b3IoZXhwcik7XG4gICAgc3dpdGNoICh0b2tlbikge1xuICAgICAgY2FzZSB0cy5TeW50YXhLaW5kLlBsdXNQbHVzVG9rZW46XG4gICAgICBjYXNlIHRzLlN5bnRheEtpbmQuTWludXNNaW51c1Rva2VuOlxuICAgICAgICB0aGlzLnZpc2l0QXNzaWdubWVudChzYiwgdG9rZW4sIGV4cHIsIG9wdGlvbnMpO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgdHMuU3ludGF4S2luZC5QbHVzVG9rZW46XG4gICAgICBjYXNlIHRzLlN5bnRheEtpbmQuTWludXNUb2tlbjpcbiAgICAgIGNhc2UgdHMuU3ludGF4S2luZC5UaWxkZVRva2VuOlxuICAgICAgY2FzZSB0cy5TeW50YXhLaW5kLkV4Y2xhbWF0aW9uVG9rZW46XG4gICAgICAgIHRoaXMudmlzaXRWYWx1ZShzYiwgdG9rZW4sIGV4cHIsIG9wdGlvbnMpO1xuICAgICAgICBicmVhaztcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICovXG4gICAgICAgIHV0aWxzLmFzc2VydE5ldmVyKHRva2VuKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIHZpc2l0QXNzaWdubWVudChcbiAgICBzYjogU2NyaXB0QnVpbGRlcixcbiAgICB0b2tlbjogQXNzaWdubWVudExpa2UsXG4gICAgZXhwcjogdHMuUHJlZml4VW5hcnlFeHByZXNzaW9uLFxuICAgIG9wdGlvbnM6IFZpc2l0T3B0aW9ucyxcbiAgKTogdm9pZCB7XG4gICAgc2IudmlzaXQodHNVdGlscy5leHByZXNzaW9uLmdldE9wZXJhbmQoZXhwciksIHNiLm5vU2V0VmFsdWVPcHRpb25zKHNiLnB1c2hWYWx1ZU9wdGlvbnMob3B0aW9ucykpKTtcblxuICAgIHN3aXRjaCAodG9rZW4pIHtcbiAgICAgIGNhc2UgdHMuU3ludGF4S2luZC5QbHVzUGx1c1Rva2VuOlxuICAgICAgICBzYi5lbWl0SGVscGVyKFxuICAgICAgICAgIGV4cHIsXG4gICAgICAgICAgc2IucHVzaFZhbHVlT3B0aW9ucyhvcHRpb25zKSxcbiAgICAgICAgICBzYi5oZWxwZXJzLnRvTnVtYmVyKHsgdHlwZTogc2IuY29udGV4dC5hbmFseXNpcy5nZXRUeXBlKGV4cHIpIH0pLFxuICAgICAgICApO1xuICAgICAgICBzYi5lbWl0T3AoZXhwciwgJ0lOQycpO1xuICAgICAgICBzYi5lbWl0SGVscGVyKGV4cHIsIHNiLnB1c2hWYWx1ZU9wdGlvbnMob3B0aW9ucyksIHNiLmhlbHBlcnMud3JhcE51bWJlcik7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSB0cy5TeW50YXhLaW5kLk1pbnVzTWludXNUb2tlbjpcbiAgICAgICAgc2IuZW1pdEhlbHBlcihcbiAgICAgICAgICBleHByLFxuICAgICAgICAgIHNiLnB1c2hWYWx1ZU9wdGlvbnMob3B0aW9ucyksXG4gICAgICAgICAgc2IuaGVscGVycy50b051bWJlcih7IHR5cGU6IHNiLmNvbnRleHQuYW5hbHlzaXMuZ2V0VHlwZShleHByKSB9KSxcbiAgICAgICAgKTtcbiAgICAgICAgc2IuZW1pdE9wKGV4cHIsICdERUMnKTtcbiAgICAgICAgc2IuZW1pdEhlbHBlcihleHByLCBzYi5wdXNoVmFsdWVPcHRpb25zKG9wdGlvbnMpLCBzYi5oZWxwZXJzLndyYXBOdW1iZXIpO1xuICAgICAgICBicmVhaztcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICovXG4gICAgICAgIHV0aWxzLmFzc2VydE5ldmVyKHRva2VuKTtcbiAgICB9XG5cbiAgICBzYi52aXNpdCh0c1V0aWxzLmV4cHJlc3Npb24uZ2V0T3BlcmFuZChleHByKSwgc2Iuc2V0VmFsdWVPcHRpb25zKG9wdGlvbnMpKTtcbiAgfVxuXG4gIHByaXZhdGUgdmlzaXRWYWx1ZShcbiAgICBzYjogU2NyaXB0QnVpbGRlcixcbiAgICB0b2tlbjogVmFsdWVMaWtlLFxuICAgIGV4cHI6IHRzLlByZWZpeFVuYXJ5RXhwcmVzc2lvbixcbiAgICBvcHRpb25zSW46IFZpc2l0T3B0aW9ucyxcbiAgKTogdm9pZCB7XG4gICAgY29uc3Qgb3B0aW9ucyA9IHNiLnB1c2hWYWx1ZU9wdGlvbnMob3B0aW9uc0luKTtcbiAgICBjb25zdCBvcGVyYW5kID0gdHNVdGlscy5leHByZXNzaW9uLmdldE9wZXJhbmQoZXhwcik7XG4gICAgc2IudmlzaXQob3BlcmFuZCwgc2Iubm9TZXRWYWx1ZU9wdGlvbnMob3B0aW9ucykpO1xuXG4gICAgc3dpdGNoICh0b2tlbikge1xuICAgICAgY2FzZSB0cy5TeW50YXhLaW5kLlBsdXNUb2tlbjpcbiAgICAgICAgc2IuZW1pdEhlbHBlcihleHByLCBvcHRpb25zLCBzYi5oZWxwZXJzLnRvTnVtYmVyKHsgdHlwZTogc2IuY29udGV4dC5hbmFseXNpcy5nZXRUeXBlKG9wZXJhbmQpIH0pKTtcbiAgICAgICAgc2IuZW1pdEhlbHBlcihleHByLCBvcHRpb25zLCBzYi5oZWxwZXJzLndyYXBOdW1iZXIpO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgdHMuU3ludGF4S2luZC5NaW51c1Rva2VuOlxuICAgICAgICBzYi5lbWl0SGVscGVyKGV4cHIsIG9wdGlvbnMsIHNiLmhlbHBlcnMudG9OdW1iZXIoeyB0eXBlOiBzYi5jb250ZXh0LmFuYWx5c2lzLmdldFR5cGUob3BlcmFuZCkgfSkpO1xuICAgICAgICBzYi5lbWl0T3AoZXhwciwgJ05FR0FURScpO1xuICAgICAgICBzYi5lbWl0SGVscGVyKGV4cHIsIG9wdGlvbnMsIHNiLmhlbHBlcnMud3JhcE51bWJlcik7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSB0cy5TeW50YXhLaW5kLlRpbGRlVG9rZW46XG4gICAgICAgIHNiLmVtaXRIZWxwZXIoZXhwciwgb3B0aW9ucywgc2IuaGVscGVycy50b051bWJlcih7IHR5cGU6IHNiLmNvbnRleHQuYW5hbHlzaXMuZ2V0VHlwZShvcGVyYW5kKSB9KSk7XG4gICAgICAgIHNiLmVtaXRPcChleHByLCAnSU5WRVJUJyk7XG4gICAgICAgIHNiLmVtaXRIZWxwZXIoZXhwciwgb3B0aW9ucywgc2IuaGVscGVycy53cmFwTnVtYmVyKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIHRzLlN5bnRheEtpbmQuRXhjbGFtYXRpb25Ub2tlbjpcbiAgICAgICAgc2IuZW1pdEhlbHBlcihvcGVyYW5kLCBvcHRpb25zLCBzYi5oZWxwZXJzLnRvQm9vbGVhbih7IHR5cGU6IHNiLmNvbnRleHQuYW5hbHlzaXMuZ2V0VHlwZShvcGVyYW5kKSB9KSk7XG4gICAgICAgIHNiLmVtaXRPcChleHByLCAnTk9UJyk7XG4gICAgICAgIHNiLmVtaXRIZWxwZXIob3BlcmFuZCwgb3B0aW9ucywgc2IuaGVscGVycy53cmFwQm9vbGVhbik7XG4gICAgICAgIGJyZWFrO1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgLyogaXN0YW5idWwgaWdub3JlIG5leHQgKi9cbiAgICAgICAgdXRpbHMuYXNzZXJ0TmV2ZXIodG9rZW4pO1xuICAgIH1cblxuICAgIGlmICghb3B0aW9uc0luLnB1c2hWYWx1ZSkge1xuICAgICAgc2IuZW1pdE9wKGV4cHIsICdEUk9QJyk7XG5cbiAgICAgIHJldHVybjtcbiAgICB9XG4gIH1cbn1cbiJdfQ==