From ae7e1236a4e340cecb132a8bf4214f29cc42bf97 Mon Sep 17 00:00:00 2001 From: i582 <51853996+i582@users.noreply.github.com> Date: Wed, 6 Aug 2025 18:53:43 +0400 Subject: [PATCH] fix(tolk/type-inference): fix type inference for some operators --- server/src/languages/tolk/type-inference.ts | 27 +++++++++++++++++---- 1 file changed, 22 insertions(+), 5 deletions(-) diff --git a/server/src/languages/tolk/type-inference.ts b/server/src/languages/tolk/type-inference.ts index 4f0e8cd6..130099bc 100644 --- a/server/src/languages/tolk/type-inference.ts +++ b/server/src/languages/tolk/type-inference.ts @@ -1587,6 +1587,7 @@ class InferenceWalker { case ">": case "<=": case ">=": + case "<=>": case "!=": case "==": { const isInverted = operator === "!=" @@ -1647,6 +1648,24 @@ class InferenceWalker { return new ExprFlow(outFlow, trueFlow, falseFlow) } + case "&": + case "|": { + flow = this.inferExpression(left, flow, false).outFlow + if (!right) { + return ExprFlow.create(flow, usedAsCondition) + } + + flow = this.inferExpression(right, flow, false).outFlow + + const leftType = this.ctx.getType(left) + if (leftType instanceof BoolTy) { + this.ctx.setType(node, BoolTy.BOOL) + break + } + + this.ctx.setType(node, IntTy.INT) + break + } default: { flow = this.inferExpression(left, flow, false).outFlow if (!right) { @@ -2219,11 +2238,9 @@ class InferenceWalker { let resultType: Ty switch (operator) { case "!": { - let exprType = this.ctx.getType(argument) ?? BoolTy.BOOL - if (exprType instanceof BoolTy) { - exprType = exprType.negate() - } - this.ctx.setType(node, exprType) + const exprType = this.ctx.getType(argument) ?? BoolTy.BOOL + const actualExprType = exprType instanceof BoolTy ? exprType.negate() : BoolTy.BOOL + this.ctx.setType(node, actualExprType) return new ExprFlow(afterArg.outFlow, afterArg.falseFlow, afterArg.trueFlow) } case "-":