Better type mapping

This commit is contained in:
nub31
2025-10-17 13:32:00 +02:00
parent bc1252ea1f
commit 610e259503
7 changed files with 198 additions and 153 deletions

View File

@@ -141,6 +141,19 @@ public class NubArrayType(NubType elementType) : NubType
public override int GetHashCode() => HashCode.Combine(typeof(NubArrayType), ElementType);
}
public class NubConstArrayType(NubType elementType, int size) : NubType
{
public override bool IsValueType => false;
public override bool IsScalar => true;
public NubType ElementType { get; } = elementType;
public int Size { get; } = size;
public override string ToString() => $"[{Size}]{ElementType}";
public override bool Equals(NubType? other) => other is NubConstArrayType array && ElementType.Equals(array.ElementType) && Size == array.Size;
public override int GetHashCode() => HashCode.Combine(typeof(NubConstArrayType), ElementType, Size);
}
public class NubCStringType : NubType
{
public override bool IsValueType => false;

View File

@@ -329,7 +329,7 @@ public sealed class TypeChecker
AddressOfSyntax expression => CheckAddressOf(expression),
ArrayIndexAccessSyntax expression => CheckArrayIndexAccess(expression),
ArrayInitializerSyntax expression => CheckArrayInitializer(expression),
BinaryExpressionSyntax expression => CheckBinaryExpression(expression),
BinaryExpressionSyntax expression => CheckBinaryExpression(expression, expectedType),
UnaryExpressionSyntax expression => CheckUnaryExpression(expression, expectedType),
DereferenceSyntax expression => CheckDereference(expression),
MemberFuncCallSyntax expression => CheckMemberFuncCall(expression),
@@ -427,7 +427,7 @@ public sealed class TypeChecker
return new ArrayInitializerNode(type, capacity, elementType);
}
private BinaryExpressionNode CheckBinaryExpression(BinaryExpressionSyntax expression)
private BinaryExpressionNode CheckBinaryExpression(BinaryExpressionSyntax expression, NubType? expectedType)
{
var op = expression.Operator switch
{
@@ -457,6 +457,7 @@ public sealed class TypeChecker
case BinaryOperatorSyntax.Equal:
case BinaryOperatorSyntax.NotEqual:
{
// note(nub31): Expected type should not be passed down since the resulting type is different than operands
var left = CheckExpression(expression.Left);
if (left.Type is not NubIntType and not NubFloatType and not NubBoolType)
{
@@ -475,6 +476,7 @@ public sealed class TypeChecker
case BinaryOperatorSyntax.LessThan:
case BinaryOperatorSyntax.LessThanOrEqual:
{
// note(nub31): Expected type should not be passed down since the resulting type is different than operands
var left = CheckExpression(expression.Left);
if (left.Type is not NubIntType and not NubFloatType)
{
@@ -491,6 +493,7 @@ public sealed class TypeChecker
case BinaryOperatorSyntax.LogicalAnd:
case BinaryOperatorSyntax.LogicalOr:
{
// note(nub31): Expected type should not be passed down since the resulting type is different than operands
var left = CheckExpression(expression.Left);
if (left.Type is not NubBoolType)
{
@@ -506,7 +509,7 @@ public sealed class TypeChecker
}
case BinaryOperatorSyntax.Plus:
{
var left = CheckExpression(expression.Left);
var left = CheckExpression(expression.Left, expectedType);
if (left.Type is NubIntType or NubFloatType or NubStringType or NubCStringType)
{
var right = CheckExpression(expression.Right, left.Type);
@@ -523,7 +526,7 @@ public sealed class TypeChecker
case BinaryOperatorSyntax.Divide:
case BinaryOperatorSyntax.Modulo:
{
var left = CheckExpression(expression.Left);
var left = CheckExpression(expression.Left, expectedType);
if (left.Type is not NubIntType and not NubFloatType)
{
throw new TypeCheckerException(Diagnostic
@@ -542,7 +545,7 @@ public sealed class TypeChecker
case BinaryOperatorSyntax.BitwiseXor:
case BinaryOperatorSyntax.BitwiseOr:
{
var left = CheckExpression(expression.Left);
var left = CheckExpression(expression.Left, expectedType);
if (left.Type is not NubIntType)
{
throw new TypeCheckerException(Diagnostic
@@ -988,6 +991,7 @@ public sealed class TypeChecker
FloatTypeSyntax f => new NubFloatType(f.Width),
FuncTypeSyntax func => new NubFuncType(func.Parameters.Select(ResolveType).ToList(), ResolveType(func.ReturnType)),
ArrayTypeSyntax arr => new NubArrayType(ResolveType(arr.BaseType)),
ConstArrayTypeSyntax arr => new NubConstArrayType(ResolveType(arr.BaseType), arr.Size),
PointerTypeSyntax ptr => new NubPointerType(ResolveType(ptr.BaseType)),
StringTypeSyntax => new NubStringType(),
CustomTypeSyntax c => ResolveCustomType(c),