authorgravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2019-12-08 12:24:45-05:00
committergravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2019-12-08 12:26:20-05:00
log64d700bfa6cea1d9a440a7431ec8d64964cdd6c1
tree0dfbe27beb71eabdce5add8e423f5ad5d50f8b09
parentfe8d65556dc49bb0da7ee621597c3b24f0e879f6
signaturelock-open Commit is signed but in an unrecognized format.

zig fmt: support comptime fields


4 files changed, 28 insertions(+), 5 deletions(-)

lib/std/zig/ast.zig+3-2
......@@ -754,8 +754,9 @@ pub const Node = struct {
754754 };
755755
756756 pub const ContainerField = struct {
757 base: Node,
757 base: Node = Node{ .id = .ContainerField },
758758 doc_comments: ?*DocComment,
759 comptime_token: ?TokenIndex,
759760 name_token: TokenIndex,
760761 type_expr: ?*Node,
761762 value_expr: ?*Node,
......@@ -778,7 +779,7 @@ pub const Node = struct {
778779 }
779780
780781 pub fn firstToken(self: *const ContainerField) TokenIndex {
781 return self.name_token;
782 return self.comptime_token orelse self.name_token;
782783 }
783784
784785 pub fn lastToken(self: *const ContainerField) TokenIndex {
lib/std/zig/parse.zig+12-3
......@@ -206,6 +206,11 @@ fn parseTestDecl(arena: *Allocator, it: *TokenIterator, tree: *Tree) !?*Node {
206206/// TopLevelComptime <- KEYWORD_comptime BlockExpr
207207fn parseTopLevelComptime(arena: *Allocator, it: *TokenIterator, tree: *Tree) !?*Node {
208208 const tok = eatToken(it, .Keyword_comptime) orelse return null;
209 const lbrace = eatToken(it, .LBrace) orelse {
210 putBackToken(it, tok);
211 return null;
212 };
213 putBackToken(it, lbrace);
209214 const block_node = try expectNode(arena, it, tree, parseBlockExpr, AstError{
210215 .ExpectedLabelOrLBrace = AstError.ExpectedLabelOrLBrace{ .token = it.index },
211216 });
......@@ -403,9 +408,13 @@ fn parseVarDecl(arena: *Allocator, it: *TokenIterator, tree: *Tree) !?*Node {
403408 return &node.base;
404409}
405410
406/// ContainerField <- IDENTIFIER (COLON TypeExpr ByteAlign?)? (EQUAL Expr)?
411/// ContainerField <- KEYWORD_comptime? IDENTIFIER (COLON TypeExpr ByteAlign?)? (EQUAL Expr)?
407412fn parseContainerField(arena: *Allocator, it: *TokenIterator, tree: *Tree) !?*Node {
408 const name_token = eatToken(it, .Identifier) orelse return null;
413 const comptime_token = eatToken(it, .Keyword_comptime);
414 const name_token = eatToken(it, .Identifier) orelse {
415 if (comptime_token) |t| putBackToken(it, t);
416 return null;
417 };
409418
410419 var align_expr: ?*Node = null;
411420 var type_expr: ?*Node = null;
......@@ -431,8 +440,8 @@ fn parseContainerField(arena: *Allocator, it: *TokenIterator, tree: *Tree) !?*No
431440
432441 const node = try arena.create(Node.ContainerField);
433442 node.* = Node.ContainerField{
434 .base = Node{ .id = .ContainerField },
435443 .doc_comments = null,
444 .comptime_token = comptime_token,
436445 .name_token = name_token,
437446 .type_expr = type_expr,
438447 .value_expr = value_expr,
lib/std/zig/parser_test.zig+10
......@@ -1,3 +1,13 @@
1test "zig fmt: comptime struct field" {
2 try testCanonical(
3 \\const Foo = struct {
4 \\ a: i32,
5 \\ comptime b: i32 = 1234,
6 \\};
7 \\
8 );
9}
10
111test "zig fmt: c pointer type" {
212 try testCanonical(
313 \\pub extern fn repro() [*c]const u8;
lib/std/zig/render.zig+3
......@@ -251,6 +251,9 @@ fn renderTopLevelDecl(allocator: *mem.Allocator, stream: var, tree: *ast.Tree, i
251251 const field = @fieldParentPtr(ast.Node.ContainerField, "base", decl);
252252
253253 try renderDocComments(tree, stream, field, indent, start_col);
254 if (field.comptime_token) |t| {
255 try renderToken(tree, stream, t, indent, start_col, Space.Space); // comptime
256 }
254257
255258 if (field.type_expr == null and field.value_expr == null) {
256259 return renderToken(tree, stream, field.name_token, indent, start_col, Space.Comma); // name,