authorgravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2018-04-30 20:25:54-04:00
committergravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2018-04-30 20:25:54-04:00
log7c822869feac7713063da320c12a960f3ae58298
tree5f22a156388f344623e278b5f8dcd1fe2bcb4636
parent61a726c290a4e569ae28da59c94ba6a40df59a20

zig fmt: only some docs have doc comments


3 files changed, 125 insertions(+), 89 deletions(-)

std/zig/ast.zig+42-1
......@@ -6,7 +6,6 @@ const mem = std.mem;
66
77pub const Node = struct {
88 id: Id,
9 doc_comments: ?&DocComment,
109 same_line_comment: ?&Token,
1110
1211 pub const Id = enum {
......@@ -70,6 +69,7 @@ pub const Node = struct {
7069 StructField,
7170 UnionTag,
7271 EnumTag,
72 ErrorTag,
7373 AsmInput,
7474 AsmOutput,
7575 AsyncAttribute,
......@@ -77,6 +77,13 @@ pub const Node = struct {
7777 FieldInitializer,
7878 };
7979
80 pub fn cast(base: &Node, comptime T: type) ?&T {
81 if (base.id == comptime typeToId(T)) {
82 return @fieldParentPtr(T, "base", base);
83 }
84 return null;
85 }
86
8087 pub fn iterate(base: &Node, index: usize) ?&Node {
8188 comptime var i = 0;
8289 inline while (i < @memberCount(Id)) : (i += 1) {
......@@ -122,6 +129,7 @@ pub const Node = struct {
122129
123130 pub const Root = struct {
124131 base: Node,
132 doc_comments: ?&DocComment,
125133 decls: ArrayList(&Node),
126134 eof_token: Token,
127135
......@@ -143,6 +151,7 @@ pub const Node = struct {
143151
144152 pub const VarDecl = struct {
145153 base: Node,
154 doc_comments: ?&DocComment,
146155 visib_token: ?Token,
147156 name_token: Token,
148157 eq_token: Token,
......@@ -191,6 +200,7 @@ pub const Node = struct {
191200
192201 pub const Use = struct {
193202 base: Node,
203 doc_comments: ?&DocComment,
194204 visib_token: ?Token,
195205 expr: &Node,
196206 semicolon_token: Token,
......@@ -294,6 +304,7 @@ pub const Node = struct {
294304
295305 pub const StructField = struct {
296306 base: Node,
307 doc_comments: ?&DocComment,
297308 visib_token: ?Token,
298309 name_token: Token,
299310 type_expr: &Node,
......@@ -319,6 +330,7 @@ pub const Node = struct {
319330
320331 pub const UnionTag = struct {
321332 base: Node,
333 doc_comments: ?&DocComment,
322334 name_token: Token,
323335 type_expr: ?&Node,
324336 value_expr: ?&Node,
......@@ -357,6 +369,7 @@ pub const Node = struct {
357369
358370 pub const EnumTag = struct {
359371 base: Node,
372 doc_comments: ?&DocComment,
360373 name_token: Token,
361374 value: ?&Node,
362375
......@@ -384,6 +397,31 @@ pub const Node = struct {
384397 }
385398 };
386399
400 pub const ErrorTag = struct {
401 base: Node,
402 doc_comments: ?&DocComment,
403 name_token: Token,
404
405 pub fn iterate(self: &ErrorTag, index: usize) ?&Node {
406 var i = index;
407
408 if (self.doc_comments) |comments| {
409 if (i < 1) return &comments.base;
410 i -= 1;
411 }
412
413 return null;
414 }
415
416 pub fn firstToken(self: &ErrorTag) Token {
417 return self.name_token;
418 }
419
420 pub fn lastToken(self: &ErrorTag) Token {
421 return self.name_token;
422 }
423 };
424
387425 pub const Identifier = struct {
388426 base: Node,
389427 token: Token,
......@@ -433,6 +471,7 @@ pub const Node = struct {
433471
434472 pub const FnProto = struct {
435473 base: Node,
474 doc_comments: ?&DocComment,
436475 visib_token: ?Token,
437476 fn_token: Token,
438477 name_token: ?Token,
......@@ -626,6 +665,7 @@ pub const Node = struct {
626665
627666 pub const Comptime = struct {
628667 base: Node,
668 doc_comments: ?&DocComment,
629669 comptime_token: Token,
630670 expr: &Node,
631671
......@@ -1794,6 +1834,7 @@ pub const Node = struct {
17941834
17951835 pub const TestDecl = struct {
17961836 base: Node,
1837 doc_comments: ?&DocComment,
17971838 test_token: Token,
17981839 name: &Node,
17991840 body_node: &Node,
std/zig/parser.zig+82-71
......@@ -228,7 +228,6 @@ pub const Parser = struct {
228228 Statement: &ast.Node.Block,
229229 ComptimeStatement: ComptimeStatementCtx,
230230 Semicolon: &&ast.Node,
231 AddComments: AddCommentsCtx,
232231 LookForSameLineComment: &&ast.Node,
233232 LookForSameLineCommentDirect: &ast.Node,
234233
......@@ -243,8 +242,8 @@ pub const Parser = struct {
243242 FieldInitListCommaOrEnd: ListSave(&ast.Node.FieldInitializer),
244243 FieldListCommaOrEnd: &ast.Node.ContainerDecl,
245244 FieldInitValue: OptionalCtx,
246 IdentifierListItemOrEnd: ListSave(&ast.Node),
247 IdentifierListCommaOrEnd: ListSave(&ast.Node),
245 ErrorTagListItemOrEnd: ListSave(&ast.Node),
246 ErrorTagListCommaOrEnd: ListSave(&ast.Node),
248247 SwitchCaseOrEnd: ListSave(&ast.Node),
249248 SwitchCaseCommaOrEnd: ListSave(&ast.Node),
250249 SwitchCaseFirstItem: &ArrayList(&ast.Node),
......@@ -301,6 +300,7 @@ pub const Parser = struct {
301300 ErrorTypeOrSetDecl: ErrorTypeOrSetDeclCtx,
302301 StringLiteral: OptionalCtx,
303302 Identifier: OptionalCtx,
303 ErrorTag: &&ast.Node,
304304
305305
306306 IfToken: @TagType(Token.Id),
......@@ -325,6 +325,7 @@ pub const Parser = struct {
325325 ast.Node.Root {
326326 .base = undefined,
327327 .decls = ArrayList(&ast.Node).init(arena),
328 .doc_comments = null,
328329 // initialized when we get the eof token
329330 .eof_token = undefined,
330331 }
......@@ -354,7 +355,7 @@ pub const Parser = struct {
354355 try root_node.decls.append(&line_comment.base);
355356 }
356357
357 const comments = try self.eatComments(arena);
358 const comments = try self.eatDocComments(arena);
358359 const token = self.getNextToken();
359360 switch (token.id) {
360361 Token.Id.Keyword_test => {
......@@ -363,7 +364,6 @@ pub const Parser = struct {
363364 const block = try arena.construct(ast.Node.Block {
364365 .base = ast.Node {
365366 .id = ast.Node.Id.Block,
366 .doc_comments = null,
367367 .same_line_comment = null,
368368 },
369369 .label = null,
......@@ -374,9 +374,9 @@ pub const Parser = struct {
374374 const test_node = try arena.construct(ast.Node.TestDecl {
375375 .base = ast.Node {
376376 .id = ast.Node.Id.TestDecl,
377 .doc_comments = comments,
378377 .same_line_comment = null,
379378 },
379 .doc_comments = comments,
380380 .test_token = token,
381381 .name = undefined,
382382 .body_node = &block.base,
......@@ -394,7 +394,11 @@ pub const Parser = struct {
394394 },
395395 Token.Id.Eof => {
396396 root_node.eof_token = token;
397 return Tree {.root_node = root_node, .arena_allocator = arena_allocator};
397 root_node.doc_comments = comments;
398 return Tree {
399 .root_node = root_node,
400 .arena_allocator = arena_allocator,
401 };
398402 },
399403 Token.Id.Keyword_pub => {
400404 stack.append(State.TopLevel) catch unreachable;
......@@ -424,6 +428,7 @@ pub const Parser = struct {
424428 .base = undefined,
425429 .comptime_token = token,
426430 .expr = &block.base,
431 .doc_comments = comments,
427432 }
428433 );
429434 stack.append(State.TopLevel) catch unreachable;
......@@ -520,6 +525,7 @@ pub const Parser = struct {
520525 .visib_token = ctx.visib_token,
521526 .expr = undefined,
522527 .semicolon_token = undefined,
528 .doc_comments = ctx.comments,
523529 }
524530 );
525531 stack.append(State {
......@@ -556,9 +562,9 @@ pub const Parser = struct {
556562 const fn_proto = try arena.construct(ast.Node.FnProto {
557563 .base = ast.Node {
558564 .id = ast.Node.Id.FnProto,
559 .doc_comments = ctx.comments,
560565 .same_line_comment = null,
561566 },
567 .doc_comments = ctx.comments,
562568 .visib_token = ctx.visib_token,
563569 .name_token = null,
564570 .fn_token = undefined,
......@@ -625,9 +631,9 @@ pub const Parser = struct {
625631 const node = try arena.construct(ast.Node.StructField {
626632 .base = ast.Node {
627633 .id = ast.Node.Id.StructField,
628 .doc_comments = null,
629634 .same_line_comment = null,
630635 },
636 .doc_comments = ctx.comments,
631637 .visib_token = ctx.visib_token,
632638 .name_token = identifier,
633639 .type_expr = undefined,
......@@ -734,7 +740,7 @@ pub const Parser = struct {
734740 try container_decl.fields_and_decls.append(&line_comment.base);
735741 }
736742
737 const comments = try self.eatComments(arena);
743 const comments = try self.eatDocComments(arena);
738744 const token = self.getNextToken();
739745 switch (token.id) {
740746 Token.Id.Identifier => {
......@@ -743,9 +749,9 @@ pub const Parser = struct {
743749 const node = try arena.construct(ast.Node.StructField {
744750 .base = ast.Node {
745751 .id = ast.Node.Id.StructField,
746 .doc_comments = comments,
747752 .same_line_comment = null,
748753 },
754 .doc_comments = comments,
749755 .visib_token = null,
750756 .name_token = token,
751757 .type_expr = undefined,
......@@ -765,6 +771,7 @@ pub const Parser = struct {
765771 .name_token = token,
766772 .type_expr = null,
767773 .value_expr = null,
774 .doc_comments = comments,
768775 }
769776 );
770777
......@@ -780,6 +787,7 @@ pub const Parser = struct {
780787 .base = undefined,
781788 .name_token = token,
782789 .value = null,
790 .doc_comments = comments,
783791 }
784792 );
785793
......@@ -831,6 +839,9 @@ pub const Parser = struct {
831839 continue;
832840 },
833841 Token.Id.RBrace => {
842 if (comments != null) {
843 return self.parseError(token, "doc comments must be attached to a node");
844 }
834845 container_decl.rbrace_token = token;
835846 continue;
836847 },
......@@ -856,9 +867,9 @@ pub const Parser = struct {
856867 const var_decl = try arena.construct(ast.Node.VarDecl {
857868 .base = ast.Node {
858869 .id = ast.Node.Id.VarDecl,
859 .doc_comments = ctx.comments,
860870 .same_line_comment = null,
861871 },
872 .doc_comments = ctx.comments,
862873 .visib_token = ctx.visib_token,
863874 .mut_token = ctx.mut_token,
864875 .comptime_token = ctx.comptime_token,
......@@ -1119,7 +1130,6 @@ pub const Parser = struct {
11191130 const node = try arena.construct(ast.Node.Suspend {
11201131 .base = ast.Node {
11211132 .id = ast.Node.Id.Suspend,
1122 .doc_comments = null,
11231133 .same_line_comment = null,
11241134 },
11251135 .label = ctx.label,
......@@ -1283,7 +1293,6 @@ pub const Parser = struct {
12831293 }
12841294 },
12851295 State.Statement => |block| {
1286 const comments = try self.eatComments(arena);
12871296 const token = self.getNextToken();
12881297 switch (token.id) {
12891298 Token.Id.Keyword_comptime => {
......@@ -1298,7 +1307,7 @@ pub const Parser = struct {
12981307 Token.Id.Keyword_var, Token.Id.Keyword_const => {
12991308 stack.append(State {
13001309 .VarDecl = VarDeclCtx {
1301 .comments = comments,
1310 .comments = null,
13021311 .visib_token = null,
13031312 .comptime_token = null,
13041313 .extern_export_token = null,
......@@ -1313,7 +1322,6 @@ pub const Parser = struct {
13131322 const node = try arena.construct(ast.Node.Defer {
13141323 .base = ast.Node {
13151324 .id = ast.Node.Id.Defer,
1316 .doc_comments = comments,
13171325 .same_line_comment = null,
13181326 },
13191327 .defer_token = token,
......@@ -1349,23 +1357,18 @@ pub const Parser = struct {
13491357 const statement = try block.statements.addOne();
13501358 stack.append(State { .LookForSameLineComment = statement }) catch unreachable;
13511359 try stack.append(State { .Semicolon = statement });
1352 try stack.append(State { .AddComments = AddCommentsCtx {
1353 .node_ptr = statement,
1354 .comments = comments,
1355 }});
13561360 try stack.append(State { .AssignmentExpressionBegin = OptionalCtx{ .Required = statement } });
13571361 continue;
13581362 }
13591363 }
13601364 },
13611365 State.ComptimeStatement => |ctx| {
1362 const comments = try self.eatComments(arena);
13631366 const token = self.getNextToken();
13641367 switch (token.id) {
13651368 Token.Id.Keyword_var, Token.Id.Keyword_const => {
13661369 stack.append(State {
13671370 .VarDecl = VarDeclCtx {
1368 .comments = comments,
1371 .comments = null,
13691372 .visib_token = null,
13701373 .comptime_token = ctx.comptime_token,
13711374 .extern_export_token = null,
......@@ -1395,12 +1398,6 @@ pub const Parser = struct {
13951398 continue;
13961399 },
13971400
1398 State.AddComments => |add_comments_ctx| {
1399 const node = *add_comments_ctx.node_ptr;
1400 node.doc_comments = add_comments_ctx.comments;
1401 continue;
1402 },
1403
14041401 State.LookForSameLineComment => |node_ptr| {
14051402 try self.lookForSameLineComment(arena, *node_ptr);
14061403 continue;
......@@ -1521,7 +1518,6 @@ pub const Parser = struct {
15211518 const node = try arena.construct(ast.Node.FieldInitializer {
15221519 .base = ast.Node {
15231520 .id = ast.Node.Id.FieldInitializer,
1524 .doc_comments = null,
15251521 .same_line_comment = null,
15261522 },
15271523 .period_token = undefined,
......@@ -1566,7 +1562,7 @@ pub const Parser = struct {
15661562 try stack.append(State { .ContainerDecl = container_decl });
15671563 continue;
15681564 },
1569 State.IdentifierListItemOrEnd => |list_state| {
1565 State.ErrorTagListItemOrEnd => |list_state| {
15701566 while (try self.eatLineComment(arena)) |line_comment| {
15711567 try list_state.list.append(&line_comment.base);
15721568 }
......@@ -1576,23 +1572,18 @@ pub const Parser = struct {
15761572 continue;
15771573 }
15781574
1579 const comments = try self.eatComments(arena);
15801575 const node_ptr = try list_state.list.addOne();
15811576
1582 try stack.append(State { .AddComments = AddCommentsCtx {
1583 .node_ptr = node_ptr,
1584 .comments = comments,
1585 }});
1586 try stack.append(State { .IdentifierListCommaOrEnd = list_state });
1587 try stack.append(State { .Identifier = OptionalCtx { .Required = node_ptr } });
1577 try stack.append(State { .ErrorTagListCommaOrEnd = list_state });
1578 try stack.append(State { .ErrorTag = node_ptr });
15881579 continue;
15891580 },
1590 State.IdentifierListCommaOrEnd => |list_state| {
1581 State.ErrorTagListCommaOrEnd => |list_state| {
15911582 if (try self.expectCommaOrEnd(Token.Id.RBrace)) |end| {
15921583 *list_state.ptr = end;
15931584 continue;
15941585 } else {
1595 stack.append(State { .IdentifierListItemOrEnd = list_state }) catch unreachable;
1586 stack.append(State { .ErrorTagListItemOrEnd = list_state }) catch unreachable;
15961587 continue;
15971588 }
15981589 },
......@@ -1606,11 +1597,10 @@ pub const Parser = struct {
16061597 continue;
16071598 }
16081599
1609 const comments = try self.eatComments(arena);
1600 const comments = try self.eatDocComments(arena);
16101601 const node = try arena.construct(ast.Node.SwitchCase {
16111602 .base = ast.Node {
16121603 .id = ast.Node.Id.SwitchCase,
1613 .doc_comments = comments,
16141604 .same_line_comment = null,
16151605 },
16161606 .items = ArrayList(&ast.Node).init(arena),
......@@ -1723,9 +1713,9 @@ pub const Parser = struct {
17231713 const fn_proto = try arena.construct(ast.Node.FnProto {
17241714 .base = ast.Node {
17251715 .id = ast.Node.Id.FnProto,
1726 .doc_comments = ctx.comments,
17271716 .same_line_comment = null,
17281717 },
1718 .doc_comments = ctx.comments,
17291719 .visib_token = null,
17301720 .name_token = null,
17311721 .fn_token = fn_token,
......@@ -2593,7 +2583,6 @@ pub const Parser = struct {
25932583 const node = try arena.construct(ast.Node.PromiseType {
25942584 .base = ast.Node {
25952585 .id = ast.Node.Id.PromiseType,
2596 .doc_comments = null,
25972586 .same_line_comment = null,
25982587 },
25992588 .promise_token = token,
......@@ -2719,9 +2708,9 @@ pub const Parser = struct {
27192708 const fn_proto = try arena.construct(ast.Node.FnProto {
27202709 .base = ast.Node {
27212710 .id = ast.Node.Id.FnProto,
2722 .doc_comments = null,
27232711 .same_line_comment = null,
27242712 },
2713 .doc_comments = null,
27252714 .visib_token = null,
27262715 .name_token = null,
27272716 .fn_token = token,
......@@ -2743,9 +2732,9 @@ pub const Parser = struct {
27432732 const fn_proto = try arena.construct(ast.Node.FnProto {
27442733 .base = ast.Node {
27452734 .id = ast.Node.Id.FnProto,
2746 .doc_comments = null,
27472735 .same_line_comment = null,
27482736 },
2737 .doc_comments = null,
27492738 .visib_token = null,
27502739 .name_token = null,
27512740 .fn_token = undefined,
......@@ -2836,7 +2825,6 @@ pub const Parser = struct {
28362825 const node = try arena.construct(ast.Node.ErrorSetDecl {
28372826 .base = ast.Node {
28382827 .id = ast.Node.Id.ErrorSetDecl,
2839 .doc_comments = null,
28402828 .same_line_comment = null,
28412829 },
28422830 .error_token = ctx.error_token,
......@@ -2846,7 +2834,7 @@ pub const Parser = struct {
28462834 ctx.opt_ctx.store(&node.base);
28472835
28482836 stack.append(State {
2849 .IdentifierListItemOrEnd = ListSave(&ast.Node) {
2837 .ErrorTagListItemOrEnd = ListSave(&ast.Node) {
28502838 .list = &node.decls,
28512839 .ptr = &node.rbrace_token,
28522840 }
......@@ -2866,6 +2854,7 @@ pub const Parser = struct {
28662854 }
28672855 );
28682856 },
2857
28692858 State.Identifier => |opt_ctx| {
28702859 if (self.eatToken(Token.Id.Identifier)) |ident_token| {
28712860 _ = try self.createToCtxLiteral(arena, opt_ctx, ast.Node.Identifier, ident_token);
......@@ -2878,6 +2867,25 @@ pub const Parser = struct {
28782867 }
28792868 },
28802869
2870 State.ErrorTag => |node_ptr| {
2871 const comments = try self.eatDocComments(arena);
2872 const ident_token = self.getNextToken();
2873 if (ident_token.id != Token.Id.Identifier) {
2874 return self.parseError(ident_token, "expected {}, found {}",
2875 @tagName(Token.Id.Identifier), @tagName(ident_token.id));
2876 }
2877
2878 const node = try arena.construct(ast.Node.ErrorTag {
2879 .base = ast.Node {
2880 .id = ast.Node.Id.ErrorTag,
2881 .same_line_comment = null,
2882 },
2883 .doc_comments = comments,
2884 .name_token = ident_token,
2885 });
2886 *node_ptr = &node.base;
2887 continue;
2888 },
28812889
28822890 State.ExpectToken => |token_id| {
28832891 _ = try self.expectToken(token_id);
......@@ -2916,7 +2924,7 @@ pub const Parser = struct {
29162924 }
29172925 }
29182926
2919 fn eatComments(self: &Parser, arena: &mem.Allocator) !?&ast.Node.DocComment {
2927 fn eatDocComments(self: &Parser, arena: &mem.Allocator) !?&ast.Node.DocComment {
29202928 var result: ?&ast.Node.DocComment = null;
29212929 while (true) {
29222930 if (self.eatToken(Token.Id.DocComment)) |line_comment| {
......@@ -2927,7 +2935,6 @@ pub const Parser = struct {
29272935 const comment_node = try arena.construct(ast.Node.DocComment {
29282936 .base = ast.Node {
29292937 .id = ast.Node.Id.DocComment,
2930 .doc_comments = null,
29312938 .same_line_comment = null,
29322939 },
29332940 .lines = ArrayList(Token).init(arena),
......@@ -2949,7 +2956,6 @@ pub const Parser = struct {
29492956 return try arena.construct(ast.Node.LineComment {
29502957 .base = ast.Node {
29512958 .id = ast.Node.Id.LineComment,
2952 .doc_comments = null,
29532959 .same_line_comment = null,
29542960 },
29552961 .token = token,
......@@ -3142,7 +3148,6 @@ pub const Parser = struct {
31423148 const node = try arena.construct(ast.Node.Switch {
31433149 .base = ast.Node {
31443150 .id = ast.Node.Id.Switch,
3145 .doc_comments = null,
31463151 .same_line_comment = null,
31473152 },
31483153 .switch_token = *token,
......@@ -3170,6 +3175,7 @@ pub const Parser = struct {
31703175 .base = undefined,
31713176 .comptime_token = *token,
31723177 .expr = undefined,
3178 .doc_comments = null,
31733179 }
31743180 );
31753181 try stack.append(State { .Expression = OptionalCtx { .Required = &node.expr } });
......@@ -3312,7 +3318,6 @@ pub const Parser = struct {
33123318 const id = ast.Node.typeToId(T);
33133319 break :blk ast.Node {
33143320 .id = id,
3315 .doc_comments = null,
33163321 .same_line_comment = null,
33173322 };
33183323 };
......@@ -3451,7 +3456,6 @@ pub const Parser = struct {
34513456 PrintIndent,
34523457 Indent: usize,
34533458 PrintSameLineComment: ?&Token,
3454 PrintComments: &ast.Node,
34553459 };
34563460
34573461 pub fn renderSource(self: &Parser, stream: var, root_node: &ast.Node.Root) !void {
......@@ -3490,7 +3494,7 @@ pub const Parser = struct {
34903494 switch (decl.id) {
34913495 ast.Node.Id.FnProto => {
34923496 const fn_proto = @fieldParentPtr(ast.Node.FnProto, "base", decl);
3493 try self.renderComments(stream, &fn_proto.base, indent);
3497 try self.renderComments(stream, fn_proto, indent);
34943498
34953499 if (fn_proto.body_node) |body_node| {
34963500 stack.append(RenderState { .Expression = body_node}) catch unreachable;
......@@ -3512,12 +3516,12 @@ pub const Parser = struct {
35123516 },
35133517 ast.Node.Id.VarDecl => {
35143518 const var_decl = @fieldParentPtr(ast.Node.VarDecl, "base", decl);
3515 try self.renderComments(stream, &var_decl.base, indent);
3519 try self.renderComments(stream, var_decl, indent);
35163520 try stack.append(RenderState { .VarDecl = var_decl});
35173521 },
35183522 ast.Node.Id.TestDecl => {
35193523 const test_decl = @fieldParentPtr(ast.Node.TestDecl, "base", decl);
3520 try self.renderComments(stream, &test_decl.base, indent);
3524 try self.renderComments(stream, test_decl, indent);
35213525 try stream.print("test ");
35223526 try stack.append(RenderState { .Expression = test_decl.body_node });
35233527 try stack.append(RenderState { .Text = " " });
......@@ -3525,7 +3529,7 @@ pub const Parser = struct {
35253529 },
35263530 ast.Node.Id.StructField => {
35273531 const field = @fieldParentPtr(ast.Node.StructField, "base", decl);
3528 try self.renderComments(stream, &field.base, indent);
3532 try self.renderComments(stream, field, indent);
35293533 if (field.visib_token) |visib_token| {
35303534 try stream.print("{} ", self.tokenizer.getTokenSlice(visib_token));
35313535 }
......@@ -3535,7 +3539,7 @@ pub const Parser = struct {
35353539 },
35363540 ast.Node.Id.UnionTag => {
35373541 const tag = @fieldParentPtr(ast.Node.UnionTag, "base", decl);
3538 try self.renderComments(stream, &tag.base, indent);
3542 try self.renderComments(stream, tag, indent);
35393543 try stream.print("{}", self.tokenizer.getTokenSlice(tag.name_token));
35403544
35413545 try stack.append(RenderState { .Text = "," });
......@@ -3552,7 +3556,7 @@ pub const Parser = struct {
35523556 },
35533557 ast.Node.Id.EnumTag => {
35543558 const tag = @fieldParentPtr(ast.Node.EnumTag, "base", decl);
3555 try self.renderComments(stream, &tag.base, indent);
3559 try self.renderComments(stream, tag, indent);
35563560 try stream.print("{}", self.tokenizer.getTokenSlice(tag.name_token));
35573561
35583562 try stack.append(RenderState { .Text = "," });
......@@ -3561,6 +3565,11 @@ pub const Parser = struct {
35613565 try stack.append(RenderState { .Expression = value});
35623566 }
35633567 },
3568 ast.Node.Id.ErrorTag => {
3569 const tag = @fieldParentPtr(ast.Node.ErrorTag, "base", decl);
3570 try self.renderComments(stream, tag, indent);
3571 try stream.print("{}", self.tokenizer.getTokenSlice(tag.name_token));
3572 },
35643573 ast.Node.Id.Comptime => {
35653574 if (requireSemiColon(decl)) {
35663575 try stack.append(RenderState { .Text = ";" });
......@@ -4122,11 +4131,20 @@ pub const Parser = struct {
41224131
41234132 if (decls.len == 1) blk: {
41244133 const node = decls[0];
4125 if (node.same_line_comment != null or node.doc_comments != null) break :blk;
4134
4135 // if there are any doc comments or same line comments
4136 // don't try to put it all on one line
4137 if (node.same_line_comment != null) break :blk;
4138 if (node.cast(ast.Node.ErrorTag)) |tag| {
4139 if (tag.doc_comments != null) break :blk;
4140 } else {
4141 break :blk;
4142 }
4143
41264144
41274145 try stream.write("error{");
41284146 try stack.append(RenderState { .Text = "}" });
4129 try stack.append(RenderState { .Expression = node });
4147 try stack.append(RenderState { .TopLevelDecl = node });
41304148 continue;
41314149 }
41324150
......@@ -4144,8 +4162,7 @@ pub const Parser = struct {
41444162 if (node.id != ast.Node.Id.LineComment) {
41454163 try stack.append(RenderState { .Text = "," });
41464164 }
4147 try stack.append(RenderState { .Expression = node });
4148 try stack.append(RenderState { .PrintComments = node });
4165 try stack.append(RenderState { .TopLevelDecl = node });
41494166 try stack.append(RenderState.PrintIndent);
41504167 try stack.append(RenderState {
41514168 .Text = blk: {
......@@ -4304,8 +4321,6 @@ pub const Parser = struct {
43044321 ast.Node.Id.SwitchCase => {
43054322 const switch_case = @fieldParentPtr(ast.Node.SwitchCase, "base", base);
43064323
4307 try self.renderComments(stream, base, indent);
4308
43094324 try stack.append(RenderState { .PrintSameLineComment = base.same_line_comment });
43104325 try stack.append(RenderState { .Text = "," });
43114326 try stack.append(RenderState { .Expression = switch_case.expr });
......@@ -4617,6 +4632,7 @@ pub const Parser = struct {
46174632 ast.Node.Id.StructField,
46184633 ast.Node.Id.UnionTag,
46194634 ast.Node.Id.EnumTag,
4635 ast.Node.Id.ErrorTag,
46204636 ast.Node.Id.Root,
46214637 ast.Node.Id.VarDecl,
46224638 ast.Node.Id.Use,
......@@ -4624,7 +4640,6 @@ pub const Parser = struct {
46244640 ast.Node.Id.ParamDecl => unreachable,
46254641 },
46264642 RenderState.Statement => |base| {
4627 try self.renderComments(stream, base, indent);
46284643 try stack.append(RenderState { .PrintSameLineComment = base.same_line_comment } );
46294644 switch (base.id) {
46304645 ast.Node.Id.VarDecl => {
......@@ -4645,15 +4660,11 @@ pub const Parser = struct {
46454660 const comment_token = maybe_comment ?? break :blk;
46464661 try stream.print(" {}", self.tokenizer.getTokenSlice(comment_token));
46474662 },
4648
4649 RenderState.PrintComments => |node| blk: {
4650 try self.renderComments(stream, node, indent);
4651 },
46524663 }
46534664 }
46544665 }
46554666
4656 fn renderComments(self: &Parser, stream: var, node: &ast.Node, indent: usize) !void {
4667 fn renderComments(self: &Parser, stream: var, node: var, indent: usize) !void {
46574668 const comment = node.doc_comments ?? return;
46584669 for (comment.lines.toSliceConst()) |line_token| {
46594670 try stream.print("{}\n", self.tokenizer.getTokenSlice(line_token));
std/zig/parser_test.zig+1-17
......@@ -181,7 +181,7 @@ test "zig fmt: comments before global variables" {
181181 );
182182}
183183
184test "zig fmt: comments before statements" {
184test "zig fmt: comments in statements" {
185185 try testCanonical(
186186 \\test "std" {
187187 \\ // statement comment
......@@ -211,22 +211,6 @@ test "zig fmt: comments before test decl" {
211211 );
212212}
213213
214test "zig fmt: comments before variable declarations" {
215 try testCanonical(
216 \\const std = @import("std");
217 \\
218 \\pub fn main() !void {
219 \\ /// If this program is run without stdout attached, exit with an error.
220 \\ /// another comment
221 \\ var stdout_file = try std.io.getStdOut;
222 \\ // If this program is run without stdout attached, exit with an error.
223 \\ // another comment
224 \\ var stdout_file = try std.io.getStdOut;
225 \\}
226 \\
227 );
228}
229
230214test "zig fmt: preserve spacing" {
231215 try testCanonical(
232216 \\const std = @import("std");