union definitions

This commit is contained in:
nub31
2026-02-15 04:23:36 +01:00
parent cbe27c0ae8
commit caa3b378b3
7 changed files with 239 additions and 17 deletions

View File

@@ -129,6 +129,45 @@ public class Parser
return new NodeDefinitionStruct(TokensFrom(startIndex), exported, packed, name, fields);
}
if (TryExpectKeyword(Keyword.Enum))
{
var exported = modifiers.Remove(Keyword.Export);
foreach (var modifier in modifiers)
// todo(nub31): Add to diagnostics instead of throwing
throw new CompileException(Diagnostic.Error("Invalid modifier for struct").At(fileName, modifier.Value).Build());
var name = ExpectIdent();
var variants = new List<NodeDefinitionEnum.Variant>();
ExpectSymbol(Symbol.OpenCurly);
while (!TryExpectSymbol(Symbol.CloseCurly))
{
var variantsStartIndex = index;
var variantName = ExpectIdent();
var variantFields = new List<NodeDefinitionEnum.Variant.Field>();
if (TryExpectSymbol(Symbol.OpenCurly))
{
while (!TryExpectSymbol(Symbol.CloseCurly))
{
var fieldStartIndex = index;
var fieldName = ExpectIdent();
ExpectSymbol(Symbol.Colon);
var fieldType = ParseType();
variantFields.Add(new NodeDefinitionEnum.Variant.Field(TokensFrom(fieldStartIndex), fieldName, fieldType));
}
}
variants.Add(new NodeDefinitionEnum.Variant(TokensFrom(variantsStartIndex), variantName, variantFields));
}
return new NodeDefinitionEnum(TokensFrom(startIndex), exported, name, variants);
}
if (TryExpectKeyword(Keyword.Let))
{
var exported = modifiers.Remove(Keyword.Export);
@@ -645,6 +684,25 @@ public class NodeDefinitionStruct(List<Token> tokens, bool exported, bool packed
}
}
public class NodeDefinitionEnum(List<Token> tokens, bool exported, TokenIdent name, List<NodeDefinitionEnum.Variant> variants) : NodeDefinition(tokens)
{
public bool Exported { get; } = exported;
public TokenIdent Name { get; } = name;
public List<Variant> Variants { get; } = variants;
public class Variant(List<Token> tokens, TokenIdent name, List<Variant.Field> fields) : Node(tokens)
{
public TokenIdent Name { get; } = name;
public List<Field> Fields { get; } = fields;
public class Field(List<Token> tokens, TokenIdent name, NodeType type) : Node(tokens)
{
public TokenIdent Name { get; } = name;
public NodeType Type { get; } = type;
}
}
}
public class NodeDefinitionGlobalVariable(List<Token> tokens, bool exported, TokenIdent name, NodeType type) : NodeDefinition(tokens)
{
public bool Exported { get; } = exported;