authorgravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2018-04-29 16:24:12-04:00
committergravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2018-04-29 16:24:12-04:00
logad4ee47d9fec15945d445f637987d487405e7b22
tree279c2db3bfd4ba646b587f22950be3c7f5fe40cc
parenta0e9f1e0c3ba3d5e240492723ff1aec8f6b2ba50

zig fmt: preserve comments before global variables


1 files changed, 59 insertions(+), 34 deletions(-)

std/zig/parser.zig+59-34
......@@ -55,6 +55,7 @@ pub const Parser = struct {
5555 visib_token: ?Token,
5656 extern_export_inline_token: ?Token,
5757 lib_name: ?&ast.Node,
58 comments: ?&ast.Node.LineComment,
5859 };
5960
6061 const VarDeclCtx = struct {
......@@ -70,6 +71,7 @@ pub const Parser = struct {
7071 const TopLevelExternOrFieldCtx = struct {
7172 visib_token: Token,
7273 container_decl: &ast.Node.ContainerDecl,
74 comments: ?&ast.Node.LineComment,
7375 };
7476
7577 const ExternTypeCtx = struct {
......@@ -393,6 +395,7 @@ pub const Parser = struct {
393395 .visib_token = token,
394396 .extern_export_inline_token = null,
395397 .lib_name = null,
398 .comments = comments,
396399 }
397400 });
398401 continue;
......@@ -433,6 +436,7 @@ pub const Parser = struct {
433436 .visib_token = null,
434437 .extern_export_inline_token = null,
435438 .lib_name = null,
439 .comments = comments,
436440 }
437441 });
438442 continue;
......@@ -449,6 +453,7 @@ pub const Parser = struct {
449453 .visib_token = ctx.visib_token,
450454 .extern_export_inline_token = token,
451455 .lib_name = null,
456 .comments = ctx.comments,
452457 },
453458 }) catch unreachable;
454459 continue;
......@@ -460,6 +465,7 @@ pub const Parser = struct {
460465 .visib_token = ctx.visib_token,
461466 .extern_export_inline_token = token,
462467 .lib_name = null,
468 .comments = ctx.comments,
463469 },
464470 }) catch unreachable;
465471 continue;
......@@ -486,12 +492,12 @@ pub const Parser = struct {
486492 .visib_token = ctx.visib_token,
487493 .extern_export_inline_token = ctx.extern_export_inline_token,
488494 .lib_name = lib_name,
495 .comments = ctx.comments,
489496 },
490497 }) catch unreachable;
491498 continue;
492499 },
493500 State.TopLevelDecl => |ctx| {
494 const comments = try self.eatComments(arena);
495501 const token = self.getNextToken();
496502 switch (token.id) {
497503 Token.Id.Keyword_use => {
......@@ -525,7 +531,7 @@ pub const Parser = struct {
525531
526532 stack.append(State {
527533 .VarDecl = VarDeclCtx {
528 .comments = comments,
534 .comments = ctx.comments,
529535 .visib_token = ctx.visib_token,
530536 .lib_name = ctx.lib_name,
531537 .comptime_token = null,
......@@ -541,7 +547,7 @@ pub const Parser = struct {
541547 const fn_proto = try arena.construct(ast.Node.FnProto {
542548 .base = ast.Node {
543549 .id = ast.Node.Id.FnProto,
544 .comments = comments,
550 .comments = ctx.comments,
545551 },
546552 .visib_token = ctx.visib_token,
547553 .name_token = null,
......@@ -628,6 +634,7 @@ pub const Parser = struct {
628634 .visib_token = ctx.visib_token,
629635 .extern_export_inline_token = null,
630636 .lib_name = null,
637 .comments = ctx.comments,
631638 }
632639 });
633640 continue;
......@@ -746,6 +753,7 @@ pub const Parser = struct {
746753 .TopLevelExternOrField = TopLevelExternOrFieldCtx {
747754 .visib_token = token,
748755 .container_decl = container_decl,
756 .comments = null,
749757 }
750758 });
751759 continue;
......@@ -758,6 +766,7 @@ pub const Parser = struct {
758766 .visib_token = token,
759767 .extern_export_inline_token = null,
760768 .lib_name = null,
769 .comments = null,
761770 }
762771 });
763772 continue;
......@@ -772,6 +781,7 @@ pub const Parser = struct {
772781 .visib_token = token,
773782 .extern_export_inline_token = null,
774783 .lib_name = null,
784 .comments = null,
775785 }
776786 });
777787 continue;
......@@ -789,6 +799,7 @@ pub const Parser = struct {
789799 .visib_token = null,
790800 .extern_export_inline_token = null,
791801 .lib_name = null,
802 .comments = null,
792803 }
793804 });
794805 continue;
......@@ -3318,6 +3329,7 @@ pub const Parser = struct {
33183329 },
33193330 ast.Node.Id.VarDecl => {
33203331 const var_decl = @fieldParentPtr(ast.Node.VarDecl, "base", decl);
3332 try self.renderComments(stream, &var_decl.base, indent);
33213333 try stack.append(RenderState { .VarDecl = var_decl});
33223334 },
33233335 ast.Node.Id.TestDecl => {
......@@ -3827,41 +3839,45 @@ pub const Parser = struct {
38273839 ast.Node.ContainerDecl.Kind.Union => try stream.print("union"),
38283840 }
38293841
3830 try stack.append(RenderState { .Text = "}"});
3831 try stack.append(RenderState.PrintIndent);
3832 try stack.append(RenderState { .Indent = indent });
3833 try stack.append(RenderState { .Text = "\n"});
3834
38353842 const fields_and_decls = container_decl.fields_and_decls.toSliceConst();
3836 var i = fields_and_decls.len;
3837 while (i != 0) {
3838 i -= 1;
3839 const node = fields_and_decls[i];
3840 switch (node.id) {
3841 ast.Node.Id.StructField,
3842 ast.Node.Id.UnionTag,
3843 ast.Node.Id.EnumTag => {
3844 try stack.append(RenderState { .Text = "," });
3845 },
3846 else => { }
3847 }
3848 try stack.append(RenderState { .TopLevelDecl = node});
3843 if (fields_and_decls.len == 0) {
3844 try stack.append(RenderState { .Text = "{}"});
3845 } else {
3846 try stack.append(RenderState { .Text = "}"});
38493847 try stack.append(RenderState.PrintIndent);
3850 try stack.append(RenderState {
3851 .Text = blk: {
3852 if (i != 0) {
3853 const prev_node = fields_and_decls[i - 1];
3854 const loc = self.tokenizer.getTokenLocation(prev_node.lastToken().end, node.firstToken());
3855 if (loc.line >= 2) {
3856 break :blk "\n\n";
3848 try stack.append(RenderState { .Indent = indent });
3849 try stack.append(RenderState { .Text = "\n"});
3850
3851 var i = fields_and_decls.len;
3852 while (i != 0) {
3853 i -= 1;
3854 const node = fields_and_decls[i];
3855 switch (node.id) {
3856 ast.Node.Id.StructField,
3857 ast.Node.Id.UnionTag,
3858 ast.Node.Id.EnumTag => {
3859 try stack.append(RenderState { .Text = "," });
3860 },
3861 else => { }
3862 }
3863 try stack.append(RenderState { .TopLevelDecl = node});
3864 try stack.append(RenderState.PrintIndent);
3865 try stack.append(RenderState {
3866 .Text = blk: {
3867 if (i != 0) {
3868 const prev_node = fields_and_decls[i - 1];
3869 const loc = self.tokenizer.getTokenLocation(prev_node.lastToken().end, node.firstToken());
3870 if (loc.line >= 2) {
3871 break :blk "\n\n";
3872 }
38573873 }
3858 }
3859 break :blk "\n";
3860 },
3861 });
3874 break :blk "\n";
3875 },
3876 });
3877 }
3878 try stack.append(RenderState { .Indent = indent + indent_delta});
3879 try stack.append(RenderState { .Text = "{"});
38623880 }
3863 try stack.append(RenderState { .Indent = indent + indent_delta});
3864 try stack.append(RenderState { .Text = "{"});
38653881
38663882 switch (container_decl.init_arg_expr) {
38673883 ast.Node.ContainerDecl.InitArg.None => try stack.append(RenderState { .Text = " "}),
......@@ -4455,6 +4471,15 @@ fn testCanonical(source: []const u8) !void {
44554471 }
44564472}
44574473
4474test "zig fmt: preserve comments before global variables" {
4475 try testCanonical(
4476 \\/// Foo copies keys and values before they go into the map, and
4477 \\/// frees them when they get removed.
4478 \\pub const Foo = struct {};
4479 \\
4480 );
4481}
4482
44584483test "zig fmt: preserve comments before statements" {
44594484 try testCanonical(
44604485 \\test "std" {