This commit is contained in:
nub31
2026-02-25 21:51:32 +01:00
parent cb4aeb9c01
commit 49734544e6
6 changed files with 50 additions and 150 deletions

View File

@@ -145,24 +145,9 @@ public class Parser
{
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));
ExpectSymbol(Symbol.Colon);
var variantType = ParseType();
variants.Add(new NodeDefinitionEnum.Variant(TokensFrom(variantsStartIndex), variantName, variantType));
}
return new NodeDefinitionEnum(TokensFrom(startIndex), exported, name, variants);
@@ -361,9 +346,7 @@ public class Parser
}
else if (TryExpectKeyword(Keyword.Struct))
{
var module = ExpectIdent();
ExpectSymbol(Symbol.ColonColon);
var name = ExpectIdent();
var type = ParseType();
var initializers = new List<NodeExpressionStructLiteral.Initializer>();
@@ -377,7 +360,7 @@ public class Parser
initializers.Add(new NodeExpressionStructLiteral.Initializer(TokensFrom(initializerStartIndex), fieldName, fieldValue));
}
expr = new NodeExpressionStructLiteral(TokensFrom(startIndex), module, name, initializers);
expr = new NodeExpressionStructLiteral(TokensFrom(startIndex), type, initializers);
}
else if (TryExpectKeyword(Keyword.Enum))
{
@@ -387,19 +370,9 @@ public class Parser
ExpectSymbol(Symbol.ColonColon);
var variantName = ExpectIdent();
var initializers = new List<NodeExpressionEnumLiteral.Initializer>();
var value = ParseExpression();
ExpectSymbol(Symbol.OpenCurly);
while (!TryExpectSymbol(Symbol.CloseCurly))
{
var initializerStartIndex = startIndex;
var fieldName = ExpectIdent();
ExpectSymbol(Symbol.Equal);
var fieldValue = ParseExpression();
initializers.Add(new NodeExpressionEnumLiteral.Initializer(TokensFrom(initializerStartIndex), fieldName, fieldValue));
}
expr = new NodeExpressionEnumLiteral(TokensFrom(startIndex), module, enumName, variantName, initializers);
expr = new NodeExpressionEnumLiteral(TokensFrom(startIndex), module, enumName, variantName, value);
}
else
{
@@ -757,16 +730,10 @@ public class NodeDefinitionEnum(List<Token> tokens, bool exported, TokenIdent na
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 class Variant(List<Token> tokens, TokenIdent name, NodeType type) : 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 NodeType Type { get; } = type;
}
}
@@ -850,10 +817,9 @@ public class NodeExpressionBoolLiteral(List<Token> tokens, TokenBoolLiteral valu
public TokenBoolLiteral Value { get; } = value;
}
public class NodeExpressionStructLiteral(List<Token> tokens, TokenIdent module, TokenIdent name, List<NodeExpressionStructLiteral.Initializer> initializers) : NodeExpression(tokens)
public class NodeExpressionStructLiteral(List<Token> tokens, NodeType? type, List<NodeExpressionStructLiteral.Initializer> initializers) : NodeExpression(tokens)
{
public TokenIdent Module { get; } = module;
public TokenIdent Name { get; } = name;
public NodeType? Type { get; } = type;
public List<Initializer> Initializers { get; } = initializers;
public class Initializer(List<Token> tokens, TokenIdent name, NodeExpression value) : Node(tokens)
@@ -863,18 +829,12 @@ public class NodeExpressionStructLiteral(List<Token> tokens, TokenIdent module,
}
}
public class NodeExpressionEnumLiteral(List<Token> tokens, TokenIdent module, TokenIdent enumName, TokenIdent variantName, List<NodeExpressionEnumLiteral.Initializer> initializers) : NodeExpression(tokens)
public class NodeExpressionEnumLiteral(List<Token> tokens, TokenIdent module, TokenIdent enumName, TokenIdent variantName, NodeExpression value) : NodeExpression(tokens)
{
public TokenIdent Module { get; } = module;
public TokenIdent EnumName { get; } = enumName;
public TokenIdent VariantName { get; } = variantName;
public List<Initializer> Initializers { get; } = initializers;
public class Initializer(List<Token> tokens, TokenIdent name, NodeExpression value) : Node(tokens)
{
public TokenIdent Name { get; } = name;
public NodeExpression Value { get; } = value;
}
public NodeExpression Value { get; } = value;
}
public class NodeExpressionMemberAccess(List<Token> tokens, NodeExpression target, TokenIdent name) : NodeExpression(tokens)