raylib building
This commit is contained in:
@@ -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
|
||||
@@ -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;
|
||||
|
||||
Reference in New Issue
Block a user