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