zig fmt: support anon struct and anon list init syntax
This commit is contained in:
@@ -1026,16 +1026,16 @@ fn parseWhileExpr(arena: *Allocator, it: *TokenIterator, tree: *Tree) !?*Node {
|
||||
/// CurlySuffixExpr <- TypeExpr InitList?
|
||||
fn parseCurlySuffixExpr(arena: *Allocator, it: *TokenIterator, tree: *Tree) !?*Node {
|
||||
const type_expr = (try parseTypeExpr(arena, it, tree)) orelse return null;
|
||||
const init_list = (try parseInitList(arena, it, tree)) orelse return type_expr;
|
||||
init_list.cast(Node.SuffixOp).?.lhs = type_expr;
|
||||
return init_list;
|
||||
const suffix_op = (try parseInitList(arena, it, tree)) orelse return type_expr;
|
||||
suffix_op.lhs.node = type_expr;
|
||||
return &suffix_op.base;
|
||||
}
|
||||
|
||||
/// InitList
|
||||
/// <- LBRACE FieldInit (COMMA FieldInit)* COMMA? RBRACE
|
||||
/// / LBRACE Expr (COMMA Expr)* COMMA? RBRACE
|
||||
/// / LBRACE RBRACE
|
||||
fn parseInitList(arena: *Allocator, it: *TokenIterator, tree: *Tree) !?*Node {
|
||||
fn parseInitList(arena: *Allocator, it: *TokenIterator, tree: *Tree) !?*Node.SuffixOp {
|
||||
const lbrace = eatToken(it, .LBrace) orelse return null;
|
||||
var init_list = Node.SuffixOp.Op.InitList.init(arena);
|
||||
|
||||
@@ -1064,11 +1064,11 @@ fn parseInitList(arena: *Allocator, it: *TokenIterator, tree: *Tree) !?*Node {
|
||||
const node = try arena.create(Node.SuffixOp);
|
||||
node.* = Node.SuffixOp{
|
||||
.base = Node{ .id = .SuffixOp },
|
||||
.lhs = undefined, // set by caller
|
||||
.lhs = .{.node = undefined}, // set by caller
|
||||
.op = op,
|
||||
.rtoken = try expectToken(it, tree, .RBrace),
|
||||
};
|
||||
return &node.base;
|
||||
return node;
|
||||
}
|
||||
|
||||
/// TypeExpr <- PrefixTypeOp* ErrorUnionExpr
|
||||
@@ -1117,7 +1117,7 @@ fn parseSuffixExpr(arena: *Allocator, it: *TokenIterator, tree: *Tree) !?*Node {
|
||||
|
||||
while (try parseSuffixOp(arena, it, tree)) |node| {
|
||||
switch (node.id) {
|
||||
.SuffixOp => node.cast(Node.SuffixOp).?.lhs = res,
|
||||
.SuffixOp => node.cast(Node.SuffixOp).?.lhs = .{.node = res},
|
||||
.InfixOp => node.cast(Node.InfixOp).?.lhs = res,
|
||||
else => unreachable,
|
||||
}
|
||||
@@ -1133,7 +1133,7 @@ fn parseSuffixExpr(arena: *Allocator, it: *TokenIterator, tree: *Tree) !?*Node {
|
||||
const node = try arena.create(Node.SuffixOp);
|
||||
node.* = Node.SuffixOp{
|
||||
.base = Node{ .id = .SuffixOp },
|
||||
.lhs = res,
|
||||
.lhs = .{.node = res},
|
||||
.op = Node.SuffixOp.Op{
|
||||
.Call = Node.SuffixOp.Op.Call{
|
||||
.params = params.list,
|
||||
@@ -1150,7 +1150,7 @@ fn parseSuffixExpr(arena: *Allocator, it: *TokenIterator, tree: *Tree) !?*Node {
|
||||
while (true) {
|
||||
if (try parseSuffixOp(arena, it, tree)) |node| {
|
||||
switch (node.id) {
|
||||
.SuffixOp => node.cast(Node.SuffixOp).?.lhs = res,
|
||||
.SuffixOp => node.cast(Node.SuffixOp).?.lhs = .{.node = res},
|
||||
.InfixOp => node.cast(Node.InfixOp).?.lhs = res,
|
||||
else => unreachable,
|
||||
}
|
||||
@@ -1161,7 +1161,7 @@ fn parseSuffixExpr(arena: *Allocator, it: *TokenIterator, tree: *Tree) !?*Node {
|
||||
const call = try arena.create(Node.SuffixOp);
|
||||
call.* = Node.SuffixOp{
|
||||
.base = Node{ .id = .SuffixOp },
|
||||
.lhs = res,
|
||||
.lhs = .{.node = res},
|
||||
.op = Node.SuffixOp.Op{
|
||||
.Call = Node.SuffixOp.Op.Call{
|
||||
.params = params.list,
|
||||
@@ -1215,7 +1215,7 @@ fn parsePrimaryTypeExpr(arena: *Allocator, it: *TokenIterator, tree: *Tree) !?*N
|
||||
return &node.base;
|
||||
}
|
||||
if (try parseContainerDecl(arena, it, tree)) |node| return node;
|
||||
if (try parseEnumLiteral(arena, it, tree)) |node| return node;
|
||||
if (try parseAnonLiteral(arena, it, tree)) |node| return node;
|
||||
if (try parseErrorSetDecl(arena, it, tree)) |node| return node;
|
||||
if (try parseFloatLiteral(arena, it, tree)) |node| return node;
|
||||
if (try parseFnProto(arena, it, tree)) |node| return node;
|
||||
@@ -1494,16 +1494,28 @@ fn parseAsmExpr(arena: *Allocator, it: *TokenIterator, tree: *Tree) !?*Node {
|
||||
}
|
||||
|
||||
/// DOT IDENTIFIER
|
||||
fn parseEnumLiteral(arena: *Allocator, it: *TokenIterator, tree: *Tree) !?*Node {
|
||||
fn parseAnonLiteral(arena: *Allocator, it: *TokenIterator, tree: *Tree) !?*Node {
|
||||
const dot = eatToken(it, .Period) orelse return null;
|
||||
const name = try expectToken(it, tree, .Identifier);
|
||||
const node = try arena.create(Node.EnumLiteral);
|
||||
node.* = Node.EnumLiteral{
|
||||
.base = Node{ .id = .EnumLiteral },
|
||||
.dot = dot,
|
||||
.name = name,
|
||||
};
|
||||
return &node.base;
|
||||
|
||||
// anon enum literal
|
||||
if (eatToken(it, .Identifier)) |name| {
|
||||
const node = try arena.create(Node.EnumLiteral);
|
||||
node.* = Node.EnumLiteral{
|
||||
.base = Node{ .id = .EnumLiteral },
|
||||
.dot = dot,
|
||||
.name = name,
|
||||
};
|
||||
return &node.base;
|
||||
}
|
||||
|
||||
// anon container literal
|
||||
if (try parseInitList(arena, it, tree)) |node| {
|
||||
node.lhs = .{.dot = dot};
|
||||
return &node.base;
|
||||
}
|
||||
|
||||
putBackToken(it, dot);
|
||||
return null;
|
||||
}
|
||||
|
||||
/// AsmOutput <- COLON AsmOutputList AsmInput?
|
||||
|
||||
Reference in New Issue
Block a user