aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--lib/std/zig/parser_test.zig25
-rw-r--r--lib/std/zig/render.zig126
2 files changed, 76 insertions, 75 deletions
diff --git a/lib/std/zig/parser_test.zig b/lib/std/zig/parser_test.zig
index b6bd2844a4..e4a9583887 100644
--- a/lib/std/zig/parser_test.zig
+++ b/lib/std/zig/parser_test.zig
@@ -3184,6 +3184,31 @@ test "zig fmt: for" {
);
}
+test "zig fmt: for if" {
+ try testCanonical(
+ \\test "for if" {
+ \\ for (a) |x| if (x) f(x);
+ \\
+ \\ for (a) |x| if (x)
+ \\ f(x);
+ \\
+ \\ for (a) |x| if (x) {
+ \\ f(x);
+ \\ };
+ \\
+ \\ for (a) |x|
+ \\ if (x)
+ \\ f(x);
+ \\
+ \\ for (a) |x|
+ \\ if (x) {
+ \\ f(x);
+ \\ };
+ \\}
+ \\
+ );
+}
+
test "zig fmt: if" {
try testCanonical(
\\test "if" {
diff --git a/lib/std/zig/render.zig b/lib/std/zig/render.zig
index 30e83e9a7c..23e9e03085 100644
--- a/lib/std/zig/render.zig
+++ b/lib/std/zig/render.zig
@@ -1025,31 +1025,11 @@ fn renderWhile(gpa: *Allocator, ais: *Ais, tree: ast.Tree, while_node: ast.full.
const then_tag = node_tags[while_node.ast.then_expr];
if (nodeIsBlock(then_tag) and !nodeIsIf(then_tag)) {
if (while_node.payload_token) |payload_token| {
- try renderToken(ais, tree, payload_token - 2, .space); // rparen
- try renderToken(ais, tree, payload_token - 1, .none); // |
- const ident = blk: {
- if (token_tags[payload_token] == .asterisk) {
- try renderToken(ais, tree, payload_token, .none); // *
- break :blk payload_token + 1;
- } else {
- break :blk payload_token;
- }
- };
- try renderToken(ais, tree, ident, .none); // identifier
- const pipe = blk: {
- if (token_tags[ident + 1] == .comma) {
- try renderToken(ais, tree, ident + 1, .space); // ,
- try renderToken(ais, tree, ident + 2, .none); // index
- break :blk ident + 3;
- } else {
- break :blk ident + 1;
- }
- };
const brace_space = if (while_node.ast.cont_expr == 0 and ais.isLineOverIndented())
Space.newline
else
Space.space;
- try renderToken(ais, tree, pipe, brace_space); // |
+ try renderWhilePayload(gpa, ais, tree, payload_token, brace_space);
} else {
const rparen = tree.lastToken(while_node.ast.cond_expr) + 1;
const brace_space = if (while_node.ast.cont_expr == 0 and ais.isLineOverIndented())
@@ -1082,38 +1062,23 @@ fn renderWhile(gpa: *Allocator, ais: *Ais, tree: ast.Tree, while_node: ast.full.
}
const rparen = tree.lastToken(while_node.ast.cond_expr) + 1;
+ const first_then_token = tree.firstToken(while_node.ast.then_expr);
const last_then_token = tree.lastToken(while_node.ast.then_expr);
const src_has_newline = !tree.tokensOnSameLine(rparen, last_then_token);
if (src_has_newline) {
+ const newline_before_then_token = !tree.tokensOnSameLine(rparen, first_then_token);
+ const space_before_then_token: Space = if (newline_before_then_token) .newline else .space;
+ const indent_expression = !nodeIsIf(then_tag) or newline_before_then_token;
+
if (while_node.payload_token) |payload_token| {
- try renderToken(ais, tree, payload_token - 2, .space); // rparen
- try renderToken(ais, tree, payload_token - 1, .none); // |
- const ident = blk: {
- if (token_tags[payload_token] == .asterisk) {
- try renderToken(ais, tree, payload_token, .none); // *
- break :blk payload_token + 1;
- } else {
- break :blk payload_token;
- }
- };
- try renderToken(ais, tree, ident, .none); // identifier
- const pipe = blk: {
- if (token_tags[ident + 1] == .comma) {
- try renderToken(ais, tree, ident + 1, .space); // ,
- try renderToken(ais, tree, ident + 2, .none); // index
- break :blk ident + 3;
- } else {
- break :blk ident + 1;
- }
- };
- const after_space: Space = if (while_node.ast.cont_expr != 0) .space else .newline;
- try renderToken(ais, tree, pipe, after_space); // |
+ const after_space: Space = if (while_node.ast.cont_expr != 0) .space else space_before_then_token;
+ try renderWhilePayload(gpa, ais, tree, payload_token, after_space);
} else {
- ais.pushIndent();
- const after_space: Space = if (while_node.ast.cont_expr != 0) .space else .newline;
+ if (indent_expression) ais.pushIndent();
+ const after_space: Space = if (while_node.ast.cont_expr != 0) .space else space_before_then_token;
try renderToken(ais, tree, rparen, after_space); // rparen
- ais.popIndent();
+ if (indent_expression) ais.popIndent();
}
if (while_node.ast.cont_expr != 0) {
const cont_rparen = tree.lastToken(while_node.ast.cont_expr) + 1;
@@ -1121,12 +1086,12 @@ fn renderWhile(gpa: *Allocator, ais: *Ais, tree: ast.Tree, while_node: ast.full.
try renderToken(ais, tree, cont_lparen - 1, .space); // :
try renderToken(ais, tree, cont_lparen, .none); // lparen
try renderExpression(gpa, ais, tree, while_node.ast.cont_expr, .none);
- try renderToken(ais, tree, cont_rparen, .newline); // rparen
+ try renderToken(ais, tree, cont_rparen, space_before_then_token); // rparen
}
if (while_node.ast.else_expr != 0) {
- ais.pushIndent();
- try renderExpression(gpa, ais, tree, while_node.ast.then_expr, Space.newline);
- ais.popIndent();
+ if (indent_expression) ais.pushIndent();
+ try renderExpression(gpa, ais, tree, while_node.ast.then_expr, .newline);
+ if (indent_expression) ais.popIndent();
const else_is_block = nodeIsBlock(node_tags[while_node.ast.else_expr]);
if (else_is_block) {
try renderToken(ais, tree, while_node.else_token, .space); // else
@@ -1145,12 +1110,18 @@ fn renderWhile(gpa: *Allocator, ais: *Ais, tree: ast.Tree, while_node: ast.full.
} else {
try renderToken(ais, tree, while_node.else_token, .newline); // else
}
- try renderExpressionIndented(gpa, ais, tree, while_node.ast.else_expr, space);
- return;
+ if (indent_expression) {
+ return renderExpressionIndented(gpa, ais, tree, while_node.ast.else_expr, space);
+ } else {
+ return renderExpression(gpa, ais, tree, while_node.ast.else_expr, space);
+ }
}
} else {
- try renderExpressionIndented(gpa, ais, tree, while_node.ast.then_expr, space);
- return;
+ if (indent_expression) {
+ return renderExpressionIndented(gpa, ais, tree, while_node.ast.then_expr, space);
+ } else {
+ return renderExpression(gpa, ais, tree, while_node.ast.then_expr, space);
+ }
}
}
@@ -1158,27 +1129,7 @@ fn renderWhile(gpa: *Allocator, ais: *Ais, tree: ast.Tree, while_node: ast.full.
if (while_node.payload_token) |payload_token| {
assert(payload_token - 2 == rparen);
- try renderToken(ais, tree, payload_token - 2, .space); // )
- try renderToken(ais, tree, payload_token - 1, .none); // |
- const ident = blk: {
- if (token_tags[payload_token] == .asterisk) {
- try renderToken(ais, tree, payload_token, .none); // *
- break :blk payload_token + 1;
- } else {
- break :blk payload_token;
- }
- };
- try renderToken(ais, tree, ident, .none); // identifier
- const pipe = blk: {
- if (token_tags[ident + 1] == .comma) {
- try renderToken(ais, tree, ident + 1, .space); // ,
- try renderToken(ais, tree, ident + 2, .none); // index
- break :blk ident + 3;
- } else {
- break :blk ident + 1;
- }
- };
- try renderToken(ais, tree, pipe, .space); // |
+ try renderWhilePayload(gpa, ais, tree, payload_token, .space);
} else {
try renderToken(ais, tree, rparen, .space); // )
}
@@ -1208,6 +1159,31 @@ fn renderWhile(gpa: *Allocator, ais: *Ais, tree: ast.Tree, while_node: ast.full.
}
}
+fn renderWhilePayload(gpa: *Allocator, ais: *Ais, tree: ast.Tree, payload_token: ast.TokenIndex, space: Space) Error!void {
+ const token_tags = tree.tokens.items(.tag);
+ try renderToken(ais, tree, payload_token - 2, .space); // rparen
+ try renderToken(ais, tree, payload_token - 1, .none); // |
+ const ident = blk: {
+ if (token_tags[payload_token] == .asterisk) {
+ try renderToken(ais, tree, payload_token, .none); // *
+ break :blk payload_token + 1;
+ } else {
+ break :blk payload_token;
+ }
+ };
+ try renderToken(ais, tree, ident, .none); // identifier
+ const pipe = blk: {
+ if (token_tags[ident + 1] == .comma) {
+ try renderToken(ais, tree, ident + 1, .space); // ,
+ try renderToken(ais, tree, ident + 2, .none); // index
+ break :blk ident + 3;
+ } else {
+ break :blk ident + 1;
+ }
+ };
+ try renderToken(ais, tree, pipe, space); // |
+}
+
fn renderContainerField(
gpa: *Allocator,
ais: *Ais,