Better type mapping
This commit is contained in:
@@ -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;
|
||||
|
||||
@@ -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),
|
||||
|
||||
Reference in New Issue
Block a user