unary op bugfix

This commit is contained in:
nub31
2025-09-28 23:13:07 +02:00
parent d6b313a2b3
commit ae4ebed0d7
2 changed files with 25 additions and 12 deletions

View File

@@ -296,7 +296,7 @@ public sealed class TypeChecker
ArrayIndexAccessSyntax expression => CheckArrayIndexAccess(expression), ArrayIndexAccessSyntax expression => CheckArrayIndexAccess(expression),
ArrayInitializerSyntax expression => CheckArrayInitializer(expression), ArrayInitializerSyntax expression => CheckArrayInitializer(expression),
BinaryExpressionSyntax expression => CheckBinaryExpression(expression), BinaryExpressionSyntax expression => CheckBinaryExpression(expression),
UnaryExpressionSyntax expression => CheckUnaryExpression(expression), UnaryExpressionSyntax expression => CheckUnaryExpression(expression, expectedType),
DereferenceSyntax expression => CheckDereference(expression), DereferenceSyntax expression => CheckDereference(expression),
DotFuncCallSyntax expression => CheckDotFuncCall(expression), DotFuncCallSyntax expression => CheckDotFuncCall(expression),
FuncCallSyntax expression => CheckFuncCall(expression), FuncCallSyntax expression => CheckFuncCall(expression),
@@ -525,26 +525,32 @@ public sealed class TypeChecker
} }
} }
private UnaryExpressionNode CheckUnaryExpression(UnaryExpressionSyntax expression) private UnaryExpressionNode CheckUnaryExpression(UnaryExpressionSyntax expression, NubType? expectedType)
{ {
switch (expression.Operator) switch (expression.Operator)
{ {
case UnaryOperatorSyntax.Negate: case UnaryOperatorSyntax.Negate:
{ {
var operand = CheckExpression(expression.Operand); var operand = CheckExpression(expression.Operand, expectedType);
if (operand.Type is not NubIntType { Signed: false } and not NubFloatType) if (operand.Type is not NubIntType { Signed: true } and not NubFloatType)
{ {
throw new TypeCheckerException(Diagnostic.Error("Negation operator must be used with signed integer or float types").At(expression).Build()); throw new TypeCheckerException(Diagnostic
.Error("Negation operator must be used with signed integer or float types")
.At(expression)
.Build());
} }
return new UnaryExpressionNode(operand.Type, UnaryOperator.Negate, operand); return new UnaryExpressionNode(operand.Type, UnaryOperator.Negate, operand);
} }
case UnaryOperatorSyntax.Invert: case UnaryOperatorSyntax.Invert:
{ {
var operand = CheckExpression(expression.Operand); var operand = CheckExpression(expression.Operand, expectedType);
if (operand.Type is not NubBoolType) if (operand.Type is not NubBoolType)
{ {
throw new TypeCheckerException(Diagnostic.Error("Invert operator must be used with booleans").At(expression).Build()); throw new TypeCheckerException(Diagnostic
.Error("Invert operator must be used with booleans")
.At(expression)
.Build());
} }
return new UnaryExpressionNode(operand.Type, UnaryOperator.Invert, operand); return new UnaryExpressionNode(operand.Type, UnaryOperator.Invert, operand);

View File

@@ -28,14 +28,21 @@ extern "main" func main(args: []cstring): i64
} }
raylib::EndDrawing() raylib::EndDrawing()
if x + width >= raylib::GetScreenWidth() || x <= 0 if x <= 0
{ {
direction.x = -direction.x direction.x = 1
} }
else if x + width >= raylib::GetScreenWidth()
if y + height >= raylib::GetScreenHeight() || y <= 0
{ {
direction.y = -direction.y direction.x = -1
}
else if y <= 0
{
direction.y = 1
}
else if y + height >= raylib::GetScreenHeight()
{
direction.y = -1
} }
x = x + @floatToInt(i32, direction.x) x = x + @floatToInt(i32, direction.x)