Anonymous struct initializer syntax

This commit is contained in:
nub31
2025-09-09 16:53:06 +02:00
parent 5c3551fd8c
commit ce999e4c1b
2 changed files with 11 additions and 3 deletions

View File

@@ -15,8 +15,8 @@ struct Human
func main(args: []cstring): i64
{
let x: Human = struct {
name = struct {
let x: Human = {
name = {
first = "bob"
last = "the builder"
}

View File

@@ -455,6 +455,7 @@ public sealed class Parser
Symbol.Minus => new UnaryExpressionSyntax(GetTokens(startIndex), UnaryOperatorSyntax.Negate, ParsePrimaryExpression()),
Symbol.Bang => new UnaryExpressionSyntax(GetTokens(startIndex), UnaryOperatorSyntax.Invert, ParsePrimaryExpression()),
Symbol.OpenBracket => ParseArrayInitializer(startIndex),
Symbol.OpenBrace => new StructInitializerSyntax(GetTokens(startIndex), Optional<TypeSyntax>.Empty(), ParseStructInitializerBody()),
Symbol.Struct => ParseStructInitializer(startIndex),
_ => throw new ParseException(Diagnostic
.Error($"Unexpected symbol '{symbolToken.Symbol}' in expression")
@@ -570,6 +571,13 @@ public sealed class Parser
ExpectSymbol(Symbol.OpenBrace);
}
var initializers = ParseStructInitializerBody();
return new StructInitializerSyntax(GetTokens(startIndex), type, initializers);
}
private Dictionary<string, ExpressionSyntax> ParseStructInitializerBody()
{
Dictionary<string, ExpressionSyntax> initializers = [];
while (!TryExpectSymbol(Symbol.CloseBrace))
{
@@ -579,7 +587,7 @@ public sealed class Parser
initializers.Add(name, value);
}
return new StructInitializerSyntax(GetTokens(startIndex), type, initializers);
return initializers;
}
private BlockSyntax ParseBlock()