authorgravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2019-02-11 14:07:19-05:00
committergravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2019-02-11 14:07:19-05:00
log4a1b910e03f931b7d8d3cb8c810b084e6e152e18
tree34eea7a1cba725686900d0f0b07c9616f0086c18
parent661fc79fba242f2ad72ede06d4e23e635a1b1452
signature Commit is signed but in an unrecognized format.

zig fmt: support C pointers

See #1059

3 files changed, 35 insertions(+), 2 deletions(-)

std/zig/parse.zig+6-1
......@@ -3525,7 +3525,12 @@ fn tokenIdToPrefixOp(id: Token.Id) ?ast.Node.PrefixOp.Op {
35253525 Token.Id.Minus => ast.Node.PrefixOp.Op{ .Negation = void{} },
35263526 Token.Id.MinusPercent => ast.Node.PrefixOp.Op{ .NegationWrap = void{} },
35273527 Token.Id.Ampersand => ast.Node.PrefixOp.Op{ .AddressOf = void{} },
3528 Token.Id.Asterisk, Token.Id.AsteriskAsterisk, Token.Id.BracketStarBracket => ast.Node.PrefixOp.Op{
3528
3529 Token.Id.Asterisk,
3530 Token.Id.AsteriskAsterisk,
3531 Token.Id.BracketStarBracket,
3532 Token.Id.BracketStarCBracket,
3533 => ast.Node.PrefixOp.Op{
35293534 .PtrType = ast.Node.PrefixOp.PtrInfo{
35303535 .align_info = null,
35313536 .const_token = null,
std/zig/parser_test.zig+7
......@@ -1,3 +1,10 @@
1test "zig fmt: C pointers" {
2 try testCanonical(
3 \\const Ptr = [*c]i32;
4 \\
5 );
6}
7
18test "zig fmt: threadlocal" {
29 try testCanonical(
310 \\threadlocal var x: i32 = 1234;
std/zig/tokenizer.zig+22-1
......@@ -141,6 +141,7 @@ pub const Token = struct {
141141 LineComment,
142142 DocComment,
143143 BracketStarBracket,
144 BracketStarCBracket,
144145 ShebangLine,
145146 Keyword_align,
146147 Keyword_and,
......@@ -279,6 +280,7 @@ pub const Tokenizer = struct {
279280 SawAtSign,
280281 LBracket,
281282 LBracketStar,
283 LBracketStarC,
282284 };
283285
284286 pub fn next(self: *Tokenizer) Token {
......@@ -456,6 +458,9 @@ pub const Tokenizer = struct {
456458 },
457459
458460 State.LBracketStar => switch (c) {
461 'c' => {
462 state = State.LBracketStarC;
463 },
459464 ']' => {
460465 result.id = Token.Id.BracketStarBracket;
461466 self.index += 1;
......@@ -467,6 +472,18 @@ pub const Tokenizer = struct {
467472 },
468473 },
469474
475 State.LBracketStarC => switch (c) {
476 ']' => {
477 result.id = Token.Id.BracketStarCBracket;
478 self.index += 1;
479 break;
480 },
481 else => {
482 result.id = Token.Id.Invalid;
483 break;
484 },
485 },
486
470487 State.Ampersand => switch (c) {
471488 '=' => {
472489 result.id = Token.Id.AmpersandEqual;
......@@ -1035,6 +1052,7 @@ pub const Tokenizer = struct {
10351052 State.CharLiteralEnd,
10361053 State.StringLiteralBackslash,
10371054 State.LBracketStar,
1055 State.LBracketStarC,
10381056 => {
10391057 result.id = Token.Id.Invalid;
10401058 },
......@@ -1169,12 +1187,15 @@ test "tokenizer" {
11691187 testTokenize("test", []Token.Id{Token.Id.Keyword_test});
11701188}
11711189
1172test "tokenizer - unknown length pointer" {
1190test "tokenizer - unknown length pointer and then c pointer" {
11731191 testTokenize(
11741192 \\[*]u8
1193 \\[*c]u8
11751194 , []Token.Id{
11761195 Token.Id.BracketStarBracket,
11771196 Token.Id.Identifier,
1197 Token.Id.BracketStarCBracket,
1198 Token.Id.Identifier,
11781199 });
11791200}
11801201