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
signature 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 {...@@ -754,8 +754,9 @@ pub const Node = struct {
754 };754 };
755755
756 pub const ContainerField = struct {756 pub const ContainerField = struct {
757 base: Node,757 base: Node = Node{ .id = .ContainerField },
758 doc_comments: ?*DocComment,758 doc_comments: ?*DocComment,
759 comptime_token: ?TokenIndex,
759 name_token: TokenIndex,760 name_token: TokenIndex,
760 type_expr: ?*Node,761 type_expr: ?*Node,
761 value_expr: ?*Node,762 value_expr: ?*Node,
...@@ -778,7 +779,7 @@ pub const Node = struct {...@@ -778,7 +779,7 @@ pub const Node = struct {
778 }779 }
779780
780 pub fn firstToken(self: *const ContainerField) TokenIndex {781 pub fn firstToken(self: *const ContainerField) TokenIndex {
781 return self.name_token;782 return self.comptime_token orelse self.name_token;
782 }783 }
783784
784 pub fn lastToken(self: *const ContainerField) TokenIndex {785 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 {...@@ -206,6 +206,11 @@ fn parseTestDecl(arena: *Allocator, it: *TokenIterator, tree: *Tree) !?*Node {
206/// TopLevelComptime <- KEYWORD_comptime BlockExpr206/// TopLevelComptime <- KEYWORD_comptime BlockExpr
207fn parseTopLevelComptime(arena: *Allocator, it: *TokenIterator, tree: *Tree) !?*Node {207fn parseTopLevelComptime(arena: *Allocator, it: *TokenIterator, tree: *Tree) !?*Node {
208 const tok = eatToken(it, .Keyword_comptime) orelse return null;208 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);
209 const block_node = try expectNode(arena, it, tree, parseBlockExpr, AstError{214 const block_node = try expectNode(arena, it, tree, parseBlockExpr, AstError{
210 .ExpectedLabelOrLBrace = AstError.ExpectedLabelOrLBrace{ .token = it.index },215 .ExpectedLabelOrLBrace = AstError.ExpectedLabelOrLBrace{ .token = it.index },
211 });216 });
...@@ -403,9 +408,13 @@ fn parseVarDecl(arena: *Allocator, it: *TokenIterator, tree: *Tree) !?*Node {...@@ -403,9 +408,13 @@ fn parseVarDecl(arena: *Allocator, it: *TokenIterator, tree: *Tree) !?*Node {
403 return &node.base;408 return &node.base;
404}409}
405410
406/// ContainerField <- IDENTIFIER (COLON TypeExpr ByteAlign?)? (EQUAL Expr)?411/// ContainerField <- KEYWORD_comptime? IDENTIFIER (COLON TypeExpr ByteAlign?)? (EQUAL Expr)?
407fn parseContainerField(arena: *Allocator, it: *TokenIterator, tree: *Tree) !?*Node {412fn 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
410 var align_expr: ?*Node = null;419 var align_expr: ?*Node = null;
411 var type_expr: ?*Node = null;420 var type_expr: ?*Node = null;
...@@ -431,8 +440,8 @@ fn parseContainerField(arena: *Allocator, it: *TokenIterator, tree: *Tree) !?*No...@@ -431,8 +440,8 @@ fn parseContainerField(arena: *Allocator, it: *TokenIterator, tree: *Tree) !?*No
431440
432 const node = try arena.create(Node.ContainerField);441 const node = try arena.create(Node.ContainerField);
433 node.* = Node.ContainerField{442 node.* = Node.ContainerField{
434 .base = Node{ .id = .ContainerField },
435 .doc_comments = null,443 .doc_comments = null,
444 .comptime_token = comptime_token,
436 .name_token = name_token,445 .name_token = name_token,
437 .type_expr = type_expr,446 .type_expr = type_expr,
438 .value_expr = value_expr,447 .value_expr = value_expr,
lib/std/zig/parser_test.zig+10
...@@ -1,3 +1,13 @@...@@ -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
1test "zig fmt: c pointer type" {11test "zig fmt: c pointer type" {
2 try testCanonical(12 try testCanonical(
3 \\pub extern fn repro() [*c]const u8;13 \\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...@@ -251,6 +251,9 @@ fn renderTopLevelDecl(allocator: *mem.Allocator, stream: var, tree: *ast.Tree, i
251 const field = @fieldParentPtr(ast.Node.ContainerField, "base", decl);251 const field = @fieldParentPtr(ast.Node.ContainerField, "base", decl);
252252
253 try renderDocComments(tree, stream, field, indent, start_col);253 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
255 if (field.type_expr == null and field.value_expr == null) {258 if (field.type_expr == null and field.value_expr == null) {
256 return renderToken(tree, stream, field.name_token, indent, start_col, Space.Comma); // name,259 return renderToken(tree, stream, field.name_token, indent, start_col, Space.Comma); // name,