authorgravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2019-11-25 13:49:16-05:00
committergravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2019-11-25 13:53:06-05:00
log8a4c2d3b07751507830416e29d6f7d6a023cd483
tree54f891e2ceca611266cfdf2677f4370e394274de
parenta061ef42c15082b52ba027ac84f0c24b4d1b4a99
signaturelock-open Commit is signed but in an unrecognized format.

zig fmt fixes for sentinel-terminated pointers

closes #3771

4 files changed, 62 insertions(+), 18 deletions(-)

lib/std/zig/ast.zig+1-1
...@@ -2204,7 +2204,7 @@ pub const Node = struct {...@@ -2204,7 +2204,7 @@ pub const Node = struct {
2204 };2204 };
22052205
2206 pub const VarType = struct {2206 pub const VarType = struct {
2207 base: Node,2207 base: Node = Node{ .id = .VarType },
2208 token: TokenIndex,2208 token: TokenIndex,
22092209
2210 pub fn iterate(self: *VarType, index: usize) ?*Node {2210 pub fn iterate(self: *VarType, index: usize) ?*Node {
lib/std/zig/parse.zig+26-16
...@@ -410,10 +410,16 @@ fn parseContainerField(arena: *Allocator, it: *TokenIterator, tree: *Tree) !?*No...@@ -410,10 +410,16 @@ fn parseContainerField(arena: *Allocator, it: *TokenIterator, tree: *Tree) !?*No
410 var align_expr: ?*Node = null;410 var align_expr: ?*Node = null;
411 var type_expr: ?*Node = null;411 var type_expr: ?*Node = null;
412 if (eatToken(it, .Colon)) |_| {412 if (eatToken(it, .Colon)) |_| {
413 type_expr = try expectNode(arena, it, tree, parseTypeExpr, AstError{413 if (eatToken(it, .Keyword_var)) |var_tok| {
414 .ExpectedTypeExpr = AstError.ExpectedTypeExpr{ .token = it.index },414 const node = try arena.create(ast.Node.VarType);
415 });415 node.* = .{ .token = var_tok };
416 align_expr = try parseByteAlign(arena, it, tree);416 type_expr = &node.base;
417 } else {
418 type_expr = try expectNode(arena, it, tree, parseTypeExpr, AstError{
419 .ExpectedTypeExpr = AstError.ExpectedTypeExpr{ .token = it.index },
420 });
421 align_expr = try parseByteAlign(arena, it, tree);
422 }
417 }423 }
418424
419 const value_expr = if (eatToken(it, .Equal)) |_|425 const value_expr = if (eatToken(it, .Equal)) |_|
...@@ -576,7 +582,8 @@ fn parseIfStatement(arena: *Allocator, it: *TokenIterator, tree: *Tree) !?*Node...@@ -576,7 +582,8 @@ fn parseIfStatement(arena: *Allocator, it: *TokenIterator, tree: *Tree) !?*Node
576582
577/// LabeledStatement <- BlockLabel? (Block / LoopStatement)583/// LabeledStatement <- BlockLabel? (Block / LoopStatement)
578fn parseLabeledStatement(arena: *Allocator, it: *TokenIterator, tree: *Tree) !?*Node {584fn parseLabeledStatement(arena: *Allocator, it: *TokenIterator, tree: *Tree) !?*Node {
579 const label_token = parseBlockLabel(arena, it, tree);585 var colon: TokenIndex = undefined;
586 const label_token = parseBlockLabel(arena, it, tree, &colon);
580587
581 if (try parseBlock(arena, it, tree)) |node| {588 if (try parseBlock(arena, it, tree)) |node| {
582 node.cast(Node.Block).?.label = label_token;589 node.cast(Node.Block).?.label = label_token;
...@@ -757,7 +764,8 @@ fn parseBlockExprStatement(arena: *Allocator, it: *TokenIterator, tree: *Tree) !...@@ -757,7 +764,8 @@ fn parseBlockExprStatement(arena: *Allocator, it: *TokenIterator, tree: *Tree) !
757764
758/// BlockExpr <- BlockLabel? Block765/// BlockExpr <- BlockLabel? Block
759fn parseBlockExpr(arena: *Allocator, it: *TokenIterator, tree: *Tree) Error!?*Node {766fn parseBlockExpr(arena: *Allocator, it: *TokenIterator, tree: *Tree) Error!?*Node {
760 const label_token = parseBlockLabel(arena, it, tree);767 var colon: TokenIndex = undefined;
768 const label_token = parseBlockLabel(arena, it, tree, &colon);
761 const block_node = (try parseBlock(arena, it, tree)) orelse {769 const block_node = (try parseBlock(arena, it, tree)) orelse {
762 if (label_token) |label| {770 if (label_token) |label| {
763 putBackToken(it, label + 1); // ":"771 putBackToken(it, label + 1); // ":"
...@@ -913,7 +921,8 @@ fn parsePrimaryExpr(arena: *Allocator, it: *TokenIterator, tree: *Tree) !?*Node...@@ -913,7 +921,8 @@ fn parsePrimaryExpr(arena: *Allocator, it: *TokenIterator, tree: *Tree) !?*Node
913 return &node.base;921 return &node.base;
914 }922 }
915923
916 const label = parseBlockLabel(arena, it, tree);924 var colon: TokenIndex = undefined;
925 const label = parseBlockLabel(arena, it, tree, &colon);
917 if (try parseLoopExpr(arena, it, tree)) |node| {926 if (try parseLoopExpr(arena, it, tree)) |node| {
918 if (node.cast(Node.For)) |for_node| {927 if (node.cast(Node.For)) |for_node| {
919 for_node.label = label;928 for_node.label = label;
...@@ -1354,7 +1363,8 @@ fn parseIfTypeExpr(arena: *Allocator, it: *TokenIterator, tree: *Tree) !?*Node {...@@ -1354,7 +1363,8 @@ fn parseIfTypeExpr(arena: *Allocator, it: *TokenIterator, tree: *Tree) !?*Node {
1354/// <- BlockLabel Block1363/// <- BlockLabel Block
1355/// / BlockLabel? LoopTypeExpr1364/// / BlockLabel? LoopTypeExpr
1356fn parseLabeledTypeExpr(arena: *Allocator, it: *TokenIterator, tree: *Tree) !?*Node {1365fn parseLabeledTypeExpr(arena: *Allocator, it: *TokenIterator, tree: *Tree) !?*Node {
1357 const label = parseBlockLabel(arena, it, tree);1366 var colon: TokenIndex = undefined;
1367 const label = parseBlockLabel(arena, it, tree, &colon);
13581368
1359 if (label) |token| {1369 if (label) |token| {
1360 if (try parseBlock(arena, it, tree)) |node| {1370 if (try parseBlock(arena, it, tree)) |node| {
...@@ -1372,12 +1382,9 @@ fn parseLabeledTypeExpr(arena: *Allocator, it: *TokenIterator, tree: *Tree) !?*N...@@ -1372,12 +1382,9 @@ fn parseLabeledTypeExpr(arena: *Allocator, it: *TokenIterator, tree: *Tree) !?*N
1372 return node;1382 return node;
1373 }1383 }
13741384
1375 if (label != null) {1385 if (label) |token| {
1376 // If we saw a label, there should have been a block next1386 putBackToken(it, colon);
1377 try tree.errors.push(AstError{1387 putBackToken(it, token);
1378 .ExpectedLBrace = AstError.ExpectedLBrace{ .token = it.index },
1379 });
1380 return error.ParseError;
1381 }1388 }
1382 return null;1389 return null;
1383}1390}
...@@ -1641,9 +1648,12 @@ fn parseBreakLabel(arena: *Allocator, it: *TokenIterator, tree: *Tree) !?*Node {...@@ -1641,9 +1648,12 @@ fn parseBreakLabel(arena: *Allocator, it: *TokenIterator, tree: *Tree) !?*Node {
1641}1648}
16421649
1643/// BlockLabel <- IDENTIFIER COLON1650/// BlockLabel <- IDENTIFIER COLON
1644fn parseBlockLabel(arena: *Allocator, it: *TokenIterator, tree: *Tree) ?TokenIndex {1651fn parseBlockLabel(arena: *Allocator, it: *TokenIterator, tree: *Tree, colon_token: *TokenIndex) ?TokenIndex {
1645 const identifier = eatToken(it, .Identifier) orelse return null;1652 const identifier = eatToken(it, .Identifier) orelse return null;
1646 if (eatToken(it, .Colon) != null) return identifier;1653 if (eatToken(it, .Colon)) |colon| {
1654 colon_token.* = colon;
1655 return identifier;
1656 }
1647 putBackToken(it, identifier);1657 putBackToken(it, identifier);
1648 return null;1658 return null;
1649}1659}
lib/std/zig/parser_test.zig+27
...@@ -1,3 +1,30 @@...@@ -1,3 +1,30 @@
1test "zig fmt: var struct field" {
2 try testCanonical(
3 \\pub const Pointer = struct {
4 \\ sentinel: var,
5 \\};
6 \\
7 );
8}
9
10test "zig fmt: sentinel-terminated array type" {
11 try testCanonical(
12 \\pub fn cStrToPrefixedFileW(s: [*:0]const u8) ![PATH_MAX_WIDE:0]u16 {
13 \\ return sliceToPrefixedFileW(mem.toSliceConst(u8, s));
14 \\}
15 \\
16 );
17}
18
19test "zig fmt: sentinel-terminated slice type" {
20 try testCanonical(
21 \\pub fn toSlice(self: Buffer) [:0]u8 {
22 \\ return self.list.toSlice()[0..self.len()];
23 \\}
24 \\
25 );
26}
27
1test "zig fmt: anon literal in array" {28test "zig fmt: anon literal in array" {
2 try testCanonical(29 try testCanonical(
3 \\var arr: [2]Foo = .{30 \\var arr: [2]Foo = .{
lib/std/zig/render.zig+8-1
...@@ -477,7 +477,14 @@ fn renderExpression(...@@ -477,7 +477,14 @@ fn renderExpression(
477477
478 ast.Node.PrefixOp.Op.SliceType => |ptr_info| {478 ast.Node.PrefixOp.Op.SliceType => |ptr_info| {
479 try renderToken(tree, stream, prefix_op_node.op_token, indent, start_col, Space.None); // [479 try renderToken(tree, stream, prefix_op_node.op_token, indent, start_col, Space.None); // [
480 try renderToken(tree, stream, tree.nextToken(prefix_op_node.op_token), indent, start_col, Space.None); // ]480 if (ptr_info.sentinel) |sentinel| {
481 const colon_token = tree.prevToken(sentinel.firstToken());
482 try renderToken(tree, stream, colon_token, indent, start_col, Space.None); // :
483 try renderExpression(allocator, stream, tree, indent, start_col, sentinel, Space.None);
484 try renderToken(tree, stream, tree.nextToken(sentinel.lastToken()), indent, start_col, Space.None); // ]
485 } else {
486 try renderToken(tree, stream, tree.nextToken(prefix_op_node.op_token), indent, start_col, Space.None); // ]
487 }
481488
482 if (ptr_info.allowzero_token) |allowzero_token| {489 if (ptr_info.allowzero_token) |allowzero_token| {
483 try renderToken(tree, stream, allowzero_token, indent, start_col, Space.Space); // allowzero490 try renderToken(tree, stream, allowzero_token, indent, start_col, Space.Space); // allowzero