| author | |
| committer | |
| log | 64d700bfa6cea1d9a440a7431ec8d64964cdd6c1 |
| tree | 0dfbe27beb71eabdce5add8e423f5ad5d50f8b09 |
| parent | fe8d65556dc49bb0da7ee621597c3b24f0e879f6 |
| signature |
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 | }; |
| 755 | 755 | ||
| 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 | } |
| 779 | 780 | ||
| 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 | } |
| 783 | 784 | ||
| 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 BlockExpr | 206 | /// TopLevelComptime <- KEYWORD_comptime BlockExpr |
| 207 | fn parseTopLevelComptime(arena: *Allocator, it: *TokenIterator, tree: *Tree) !?*Node { | 207 | fn 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 | } |
| 405 | 410 | ||
| 406 | /// ContainerField <- IDENTIFIER (COLON TypeExpr ByteAlign?)? (EQUAL Expr)? | 411 | /// ContainerField <- KEYWORD_comptime? IDENTIFIER (COLON TypeExpr ByteAlign?)? (EQUAL Expr)? |
| 407 | fn parseContainerField(arena: *Allocator, it: *TokenIterator, tree: *Tree) !?*Node { | 412 | fn 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 | }; | ||
| 409 | 418 | ||
| 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 |
| 431 | 440 | ||
| 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 @@ |
| 1 | test "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 | |||
| 1 | test "zig fmt: c pointer type" { | 11 | test "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); |
| 252 | 252 | ||
| 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 | } | ||
| 254 | 257 | ||
| 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, |