authorgravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2018-05-17 00:15:52-04:00
committergravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2018-05-17 00:16:32-04:00
log9ea0e4ca6803cd10cfbffbdf80033a90f0e544d5
treef3e6721feabebe987fc667a4e998a0e0405b899e
parent967bad43a053bf7d9d54dd352fcd8416c767785e

zig fmt: same line comments after tokens in expression


2 files changed, 67 insertions(+), 17 deletions(-)

std/zig/parser_test.zig+43
...@@ -1,3 +1,46 @@...@@ -1,3 +1,46 @@
1test "zig fmt: same line comments in expression" {
2 try testCanonical(
3 \\test "aoeu" {
4 \\ const x = ( // a
5 \\ 0 // b
6 \\ ); // c
7 \\}
8 \\
9 );
10}
11
12//test "zig fmt: line comment between if block and else keyword" {
13// try testTransform(
14// test "aoeu" {
15// // cexp(finite|nan +- i inf|nan) = nan + i nan
16// if ((hx & 0x7fffffff) != 0x7f800000) {
17// return Complex(f32).new(y - y, y - y);
18// }
19// // cexp(-inf +- i inf|nan) = 0 + i0
20// else if (hx & 0x80000000 != 0) {
21// return Complex(f32).new(0, 0);
22// }
23// // cexp(+inf +- i inf|nan) = inf + i nan
24// else {
25// return Complex(f32).new(x, y - y);
26// }
27// }
28// ,
29// test "aoeu" {
30// // cexp(finite|nan +- i inf|nan) = nan + i nan
31// if ((hx & 0x7fffffff) != 0x7f800000) {
32// return Complex(f32).new(y - y, y - y);
33// } // cexp(-inf +- i inf|nan) = 0 + i0
34// else if (hx & 0x80000000 != 0) {
35// return Complex(f32).new(0, 0);
36// } // cexp(+inf +- i inf|nan) = inf + i nan
37// else {
38// return Complex(f32).new(x, y - y);
39// }
40// }
41// );
42//}
43
1test "zig fmt: add comma on last switch prong" {44test "zig fmt: add comma on last switch prong" {
2 try testTransform(45 try testTransform(
3 \\test "aoeu" {46 \\test "aoeu" {
std/zig/render.zig+24-17
...@@ -81,7 +81,7 @@ fn renderTopLevelDecl(allocator: &mem.Allocator, stream: var, tree: &ast.Tree, i...@@ -81,7 +81,7 @@ fn renderTopLevelDecl(allocator: &mem.Allocator, stream: var, tree: &ast.Tree, i
81 }81 }
82 try stream.print("{}: ", tree.tokenSlice(field.name_token));82 try stream.print("{}: ", tree.tokenSlice(field.name_token));
83 try renderExpression(allocator, stream, tree, indent, field.type_expr);83 try renderExpression(allocator, stream, tree, indent, field.type_expr);
84 try renderToken(tree, stream, field.lastToken() + 1, indent, true);84 try renderToken(tree, stream, field.lastToken() + 1, indent, true, true);
85 },85 },
86 ast.Node.Id.UnionTag => {86 ast.Node.Id.UnionTag => {
87 const tag = @fieldParentPtr(ast.Node.UnionTag, "base", decl);87 const tag = @fieldParentPtr(ast.Node.UnionTag, "base", decl);
...@@ -513,9 +513,9 @@ fn renderExpression(allocator: &mem.Allocator, stream: var, tree: &ast.Tree, ind...@@ -513,9 +513,9 @@ fn renderExpression(allocator: &mem.Allocator, stream: var, tree: &ast.Tree, ind
513 ast.Node.Id.GroupedExpression => {513 ast.Node.Id.GroupedExpression => {
514 const grouped_expr = @fieldParentPtr(ast.Node.GroupedExpression, "base", base);514 const grouped_expr = @fieldParentPtr(ast.Node.GroupedExpression, "base", base);
515515
516 try stream.write("(");516 try renderToken(tree, stream, grouped_expr.lparen, indent, false, false);
517 try renderExpression(allocator, stream, tree, indent, grouped_expr.expr);517 try renderExpression(allocator, stream, tree, indent, grouped_expr.expr);
518 try stream.write(")");518 try renderToken(tree, stream, grouped_expr.rparen, indent, false, false);
519 },519 },
520520
521 ast.Node.Id.FieldInitializer => {521 ast.Node.Id.FieldInitializer => {
...@@ -527,7 +527,7 @@ fn renderExpression(allocator: &mem.Allocator, stream: var, tree: &ast.Tree, ind...@@ -527,7 +527,7 @@ fn renderExpression(allocator: &mem.Allocator, stream: var, tree: &ast.Tree, ind
527527
528 ast.Node.Id.IntegerLiteral => {528 ast.Node.Id.IntegerLiteral => {
529 const integer_literal = @fieldParentPtr(ast.Node.IntegerLiteral, "base", base);529 const integer_literal = @fieldParentPtr(ast.Node.IntegerLiteral, "base", base);
530 try stream.print("{}", tree.tokenSlice(integer_literal.token));530 try renderToken(tree, stream, integer_literal.token, indent, false, false);
531 },531 },
532 ast.Node.Id.FloatLiteral => {532 ast.Node.Id.FloatLiteral => {
533 const float_literal = @fieldParentPtr(ast.Node.FloatLiteral, "base", base);533 const float_literal = @fieldParentPtr(ast.Node.FloatLiteral, "base", base);
...@@ -535,7 +535,7 @@ fn renderExpression(allocator: &mem.Allocator, stream: var, tree: &ast.Tree, ind...@@ -535,7 +535,7 @@ fn renderExpression(allocator: &mem.Allocator, stream: var, tree: &ast.Tree, ind
535 },535 },
536 ast.Node.Id.StringLiteral => {536 ast.Node.Id.StringLiteral => {
537 const string_literal = @fieldParentPtr(ast.Node.StringLiteral, "base", base);537 const string_literal = @fieldParentPtr(ast.Node.StringLiteral, "base", base);
538 try stream.print("{}", tree.tokenSlice(string_literal.token));538 try renderToken(tree, stream, string_literal.token, indent, false, false);
539 },539 },
540 ast.Node.Id.CharLiteral => {540 ast.Node.Id.CharLiteral => {
541 const char_literal = @fieldParentPtr(ast.Node.CharLiteral, "base", base);541 const char_literal = @fieldParentPtr(ast.Node.CharLiteral, "base", base);
...@@ -840,9 +840,9 @@ fn renderExpression(allocator: &mem.Allocator, stream: var, tree: &ast.Tree, ind...@@ -840,9 +840,9 @@ fn renderExpression(allocator: &mem.Allocator, stream: var, tree: &ast.Tree, ind
840 },840 },
841 Token.Id.LineComment => {841 Token.Id.LineComment => {
842 try stream.write(", ");842 try stream.write(", ");
843 try renderToken(tree, stream, index, indent, true);843 try renderToken(tree, stream, index, indent, true, true);
844 },844 },
845 else => try renderToken(tree, stream, index, indent, true),845 else => try renderToken(tree, stream, index, indent, true, true),
846 }846 }
847 }847 }
848 },848 },
...@@ -971,7 +971,7 @@ fn renderExpression(allocator: &mem.Allocator, stream: var, tree: &ast.Tree, ind...@@ -971,7 +971,7 @@ fn renderExpression(allocator: &mem.Allocator, stream: var, tree: &ast.Tree, ind
971 try stream.print("{} (", tree.tokenSlice(if_node.if_token));971 try stream.print("{} (", tree.tokenSlice(if_node.if_token));
972972
973 try renderExpression(allocator, stream, tree, indent, if_node.condition);973 try renderExpression(allocator, stream, tree, indent, if_node.condition);
974 try renderToken(tree, stream, if_node.condition.lastToken() + 1, indent, false);974 try renderToken(tree, stream, if_node.condition.lastToken() + 1, indent, false, true);
975975
976 if (if_node.payload) |payload| {976 if (if_node.payload) |payload| {
977 try renderExpression(allocator, stream, tree, indent, payload);977 try renderExpression(allocator, stream, tree, indent, payload);
...@@ -1126,11 +1126,11 @@ fn renderExpression(allocator: &mem.Allocator, stream: var, tree: &ast.Tree, ind...@@ -1126,11 +1126,11 @@ fn renderExpression(allocator: &mem.Allocator, stream: var, tree: &ast.Tree, ind
11261126
1127fn renderVarDecl(allocator: &mem.Allocator, stream: var, tree: &ast.Tree, indent: usize, var_decl: &ast.Node.VarDecl) (@typeOf(stream).Child.Error || Error)!void {1127fn renderVarDecl(allocator: &mem.Allocator, stream: var, tree: &ast.Tree, indent: usize, var_decl: &ast.Node.VarDecl) (@typeOf(stream).Child.Error || Error)!void {
1128 if (var_decl.visib_token) |visib_token| {1128 if (var_decl.visib_token) |visib_token| {
1129 try stream.print("{} ", tree.tokenSlice(visib_token));1129 try renderToken(tree, stream, visib_token, indent, false, true);
1130 }1130 }
11311131
1132 if (var_decl.extern_export_token) |extern_export_token| {1132 if (var_decl.extern_export_token) |extern_export_token| {
1133 try stream.print("{} ", tree.tokenSlice(extern_export_token));1133 try renderToken(tree, stream, extern_export_token, indent, false, true);
11341134
1135 if (var_decl.lib_name) |lib_name| {1135 if (var_decl.lib_name) |lib_name| {
1136 try renderExpression(allocator, stream, tree, indent, lib_name);1136 try renderExpression(allocator, stream, tree, indent, lib_name);
...@@ -1139,10 +1139,11 @@ fn renderVarDecl(allocator: &mem.Allocator, stream: var, tree: &ast.Tree, indent...@@ -1139,10 +1139,11 @@ fn renderVarDecl(allocator: &mem.Allocator, stream: var, tree: &ast.Tree, indent
1139 }1139 }
11401140
1141 if (var_decl.comptime_token) |comptime_token| {1141 if (var_decl.comptime_token) |comptime_token| {
1142 try stream.print("{} ", tree.tokenSlice(comptime_token));1142 try renderToken(tree, stream, comptime_token, indent, false, true);
1143 }1143 }
11441144
1145 try stream.print("{} {}", tree.tokenSlice(var_decl.mut_token), tree.tokenSlice(var_decl.name_token));1145 try renderToken(tree, stream, var_decl.mut_token, indent, false, true);
1146 try renderToken(tree, stream, var_decl.name_token, indent, false, false);
11461147
1147 if (var_decl.type_node) |type_node| {1148 if (var_decl.type_node) |type_node| {
1148 try stream.write(": ");1149 try stream.write(": ");
...@@ -1161,14 +1162,14 @@ fn renderVarDecl(allocator: &mem.Allocator, stream: var, tree: &ast.Tree, indent...@@ -1161,14 +1162,14 @@ fn renderVarDecl(allocator: &mem.Allocator, stream: var, tree: &ast.Tree, indent
1161 try renderExpression(allocator, stream, tree, indent, init_node);1162 try renderExpression(allocator, stream, tree, indent, init_node);
1162 }1163 }
11631164
1164 try renderToken(tree, stream, var_decl.semicolon_token, indent, true);1165 try renderToken(tree, stream, var_decl.semicolon_token, indent, true, false);
1165}1166}
11661167
1167fn maybeRenderSemicolon(stream: var, tree: &ast.Tree, indent: usize, base: &ast.Node) (@typeOf(stream).Child.Error || Error)!void {1168fn maybeRenderSemicolon(stream: var, tree: &ast.Tree, indent: usize, base: &ast.Node) (@typeOf(stream).Child.Error || Error)!void {
1168 if (base.requireSemiColon()) {1169 if (base.requireSemiColon()) {
1169 const semicolon_index = base.lastToken() + 1;1170 const semicolon_index = base.lastToken() + 1;
1170 assert(tree.tokens.at(semicolon_index).id == Token.Id.Semicolon);1171 assert(tree.tokens.at(semicolon_index).id == Token.Id.Semicolon);
1171 try renderToken(tree, stream, semicolon_index, indent, true);1172 try renderToken(tree, stream, semicolon_index, indent, true, true);
1172 }1173 }
1173}1174}
11741175
...@@ -1203,7 +1204,7 @@ fn renderStatement(allocator: &mem.Allocator, stream: var, tree: &ast.Tree, inde...@@ -1203,7 +1204,7 @@ fn renderStatement(allocator: &mem.Allocator, stream: var, tree: &ast.Tree, inde
1203 }1204 }
1204}1205}
12051206
1206fn renderToken(tree: &ast.Tree, stream: var, token_index: ast.TokenIndex, indent: usize, line_break: bool) (@typeOf(stream).Child.Error || Error)!void {1207fn renderToken(tree: &ast.Tree, stream: var, token_index: ast.TokenIndex, indent: usize, line_break: bool, space: bool) (@typeOf(stream).Child.Error || Error)!void {
1207 const token = tree.tokens.at(token_index);1208 const token = tree.tokens.at(token_index);
1208 try stream.write(tree.tokenSlicePtr(token));1209 try stream.write(tree.tokenSlicePtr(token));
12091210
...@@ -1214,13 +1215,19 @@ fn renderToken(tree: &ast.Tree, stream: var, token_index: ast.TokenIndex, indent...@@ -1214,13 +1215,19 @@ fn renderToken(tree: &ast.Tree, stream: var, token_index: ast.TokenIndex, indent
1214 try stream.print(" {}", tree.tokenSlicePtr(next_token));1215 try stream.print(" {}", tree.tokenSlicePtr(next_token));
1215 if (!line_break) {1216 if (!line_break) {
1216 try stream.write("\n");1217 try stream.write("\n");
1217 try stream.writeByteNTimes(' ', indent + indent_delta);1218
1219 const after_comment_token = tree.tokens.at(token_index + 2);
1220 const next_line_indent = switch (after_comment_token.id) {
1221 Token.Id.RParen, Token.Id.RBrace, Token.Id.RBracket => indent,
1222 else => indent + indent_delta,
1223 };
1224 try stream.writeByteNTimes(' ', next_line_indent);
1218 return;1225 return;
1219 }1226 }
1220 }1227 }
1221 }1228 }
12221229
1223 if (!line_break) {1230 if (!line_break and space) {
1224 try stream.writeByte(' ');1231 try stream.writeByte(' ');
1225 }1232 }
1226}1233}