raylib building

This commit is contained in:
nub31
2025-11-05 18:40:12 +01:00
parent 17e754fc6e
commit 1dd14c8a77
7 changed files with 195 additions and 201 deletions

View File

@@ -632,4 +632,12 @@ public class ConstArrayInitializerNode(List<Token> tokens, NubType type, List<Ex
}
}
public class EnumTypeIntermediateNode(List<Token> tokens, NubType type) : ExpressionNode(tokens, type)
{
public override IEnumerable<Node> Children()
{
return [];
}
}
#endregion

View File

@@ -837,6 +837,11 @@ public sealed class TypeChecker
return new ModuleFuncIdentifierNode(expression.Tokens, type, expression.ModuleToken, expression.NameToken, function.ExternSymbolToken);
}
if (module.TryResolveEnum(expression.NameToken, out var enumType, out var _))
{
return new EnumTypeIntermediateNode(expression.Tokens, enumType);
}
throw new CompileException(Diagnostic
.Error($"Module {expression.ModuleToken.Value} does not export a member named {expression.NameToken.Value}")
.At(expression, _syntaxTree.Tokens)
@@ -920,6 +925,29 @@ public sealed class TypeChecker
return new StructFieldAccessNode(expression.Tokens, field.Type, target, expression.MemberToken);
}
case NubEnumType enumType:
{
if (!enumType.Members.TryGetValue(expression.MemberToken.Value, out var value))
{
throw new CompileException(Diagnostic
.Error($"Enum {target.Type} does not have a member with the name {expression.MemberToken.Value}")
.At(expression, _syntaxTree.Tokens)
.Build());
}
return (enumType.UnderlyingType.Width, enumType.UnderlyingType.Signed) switch
{
(8, false) => new U8LiteralNode(expression.Tokens, (byte)value),
(16, false) => new U16LiteralNode(expression.Tokens, (ushort)value),
(32, false) => new U32LiteralNode(expression.Tokens, (uint)value),
(64, false) => new U64LiteralNode(expression.Tokens, value),
(8, true) => new I8LiteralNode(expression.Tokens, (sbyte)value),
(16, true) => new I16LiteralNode(expression.Tokens, (short)value),
(32, true) => new I32LiteralNode(expression.Tokens, (int)value),
(64, true) => new I64LiteralNode(expression.Tokens, (long)value),
_ => throw new ArgumentOutOfRangeException()
};
}
default:
{
throw new CompileException(Diagnostic
@@ -1062,7 +1090,7 @@ public sealed class TypeChecker
return structType;
}
var enumType = module.EnumTypes.GetValueOrDefault(customType.NameToken.Value);
var enumType = module.EnumTypes.FirstOrDefault(x => x.Name == customType.NameToken.Value);
if (enumType != null)
{
return enumType;