aboutsummaryrefslogtreecommitdiff
path: root/lib/std
diff options
context:
space:
mode:
authorAndrew Kelley <andrew@ziglang.org>2019-12-08 12:27:02 -0500
committerAndrew Kelley <andrew@ziglang.org>2019-12-08 12:27:02 -0500
commitd57370d3ca28db17a183157b0497c0ab25e22c19 (patch)
tree0dfbe27beb71eabdce5add8e423f5ad5d50f8b09 /lib/std
parent19c1b5a33a21bdddfbbca3c65b1c0e6419c4629f (diff)
parent64d700bfa6cea1d9a440a7431ec8d64964cdd6c1 (diff)
downloadzig-d57370d3ca28db17a183157b0497c0ab25e22c19.tar.gz
zig-d57370d3ca28db17a183157b0497c0ab25e22c19.zip
Merge branch 'comptime-fields'
closes #3677
Diffstat (limited to 'lib/std')
-rw-r--r--lib/std/zig/ast.zig5
-rw-r--r--lib/std/zig/parse.zig15
-rw-r--r--lib/std/zig/parser_test.zig10
-rw-r--r--lib/std/zig/render.zig3
4 files changed, 28 insertions, 5 deletions
diff --git a/lib/std/zig/ast.zig b/lib/std/zig/ast.zig
index 63c6168ed9..bedb980463 100644
--- a/lib/std/zig/ast.zig
+++ b/lib/std/zig/ast.zig
@@ -754,8 +754,9 @@ pub const Node = struct {
};
pub const ContainerField = struct {
- base: Node,
+ base: Node = Node{ .id = .ContainerField },
doc_comments: ?*DocComment,
+ comptime_token: ?TokenIndex,
name_token: TokenIndex,
type_expr: ?*Node,
value_expr: ?*Node,
@@ -778,7 +779,7 @@ pub const Node = struct {
}
pub fn firstToken(self: *const ContainerField) TokenIndex {
- return self.name_token;
+ return self.comptime_token orelse self.name_token;
}
pub fn lastToken(self: *const ContainerField) TokenIndex {
diff --git a/lib/std/zig/parse.zig b/lib/std/zig/parse.zig
index 269586f8b1..2e95a4605d 100644
--- a/lib/std/zig/parse.zig
+++ b/lib/std/zig/parse.zig
@@ -206,6 +206,11 @@ fn parseTestDecl(arena: *Allocator, it: *TokenIterator, tree: *Tree) !?*Node {
/// TopLevelComptime <- KEYWORD_comptime BlockExpr
fn parseTopLevelComptime(arena: *Allocator, it: *TokenIterator, tree: *Tree) !?*Node {
const tok = eatToken(it, .Keyword_comptime) orelse return null;
+ const lbrace = eatToken(it, .LBrace) orelse {
+ putBackToken(it, tok);
+ return null;
+ };
+ putBackToken(it, lbrace);
const block_node = try expectNode(arena, it, tree, parseBlockExpr, AstError{
.ExpectedLabelOrLBrace = AstError.ExpectedLabelOrLBrace{ .token = it.index },
});
@@ -403,9 +408,13 @@ fn parseVarDecl(arena: *Allocator, it: *TokenIterator, tree: *Tree) !?*Node {
return &node.base;
}
-/// ContainerField <- IDENTIFIER (COLON TypeExpr ByteAlign?)? (EQUAL Expr)?
+/// ContainerField <- KEYWORD_comptime? IDENTIFIER (COLON TypeExpr ByteAlign?)? (EQUAL Expr)?
fn parseContainerField(arena: *Allocator, it: *TokenIterator, tree: *Tree) !?*Node {
- const name_token = eatToken(it, .Identifier) orelse return null;
+ const comptime_token = eatToken(it, .Keyword_comptime);
+ const name_token = eatToken(it, .Identifier) orelse {
+ if (comptime_token) |t| putBackToken(it, t);
+ return null;
+ };
var align_expr: ?*Node = null;
var type_expr: ?*Node = null;
@@ -431,8 +440,8 @@ fn parseContainerField(arena: *Allocator, it: *TokenIterator, tree: *Tree) !?*No
const node = try arena.create(Node.ContainerField);
node.* = Node.ContainerField{
- .base = Node{ .id = .ContainerField },
.doc_comments = null,
+ .comptime_token = comptime_token,
.name_token = name_token,
.type_expr = type_expr,
.value_expr = value_expr,
diff --git a/lib/std/zig/parser_test.zig b/lib/std/zig/parser_test.zig
index 616cf8a75a..7f3cc3694a 100644
--- a/lib/std/zig/parser_test.zig
+++ b/lib/std/zig/parser_test.zig
@@ -1,3 +1,13 @@
+test "zig fmt: comptime struct field" {
+ try testCanonical(
+ \\const Foo = struct {
+ \\ a: i32,
+ \\ comptime b: i32 = 1234,
+ \\};
+ \\
+ );
+}
+
test "zig fmt: c pointer type" {
try testCanonical(
\\pub extern fn repro() [*c]const u8;
diff --git a/lib/std/zig/render.zig b/lib/std/zig/render.zig
index b01718cdab..8b0ce7ee1a 100644
--- a/lib/std/zig/render.zig
+++ b/lib/std/zig/render.zig
@@ -251,6 +251,9 @@ fn renderTopLevelDecl(allocator: *mem.Allocator, stream: var, tree: *ast.Tree, i
const field = @fieldParentPtr(ast.Node.ContainerField, "base", decl);
try renderDocComments(tree, stream, field, indent, start_col);
+ if (field.comptime_token) |t| {
+ try renderToken(tree, stream, t, indent, start_col, Space.Space); // comptime
+ }
if (field.type_expr == null and field.value_expr == null) {
return renderToken(tree, stream, field.name_token, indent, start_col, Space.Comma); // name,