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
signaturelock-open 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 {...@@ -3525,7 +3525,12 @@ fn tokenIdToPrefixOp(id: Token.Id) ?ast.Node.PrefixOp.Op {
3525 Token.Id.Minus => ast.Node.PrefixOp.Op{ .Negation = void{} },3525 Token.Id.Minus => ast.Node.PrefixOp.Op{ .Negation = void{} },
3526 Token.Id.MinusPercent => ast.Node.PrefixOp.Op{ .NegationWrap = void{} },3526 Token.Id.MinusPercent => ast.Node.PrefixOp.Op{ .NegationWrap = void{} },
3527 Token.Id.Ampersand => ast.Node.PrefixOp.Op{ .AddressOf = void{} },3527 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{
3529 .PtrType = ast.Node.PrefixOp.PtrInfo{3534 .PtrType = ast.Node.PrefixOp.PtrInfo{
3530 .align_info = null,3535 .align_info = null,
3531 .const_token = null,3536 .const_token = null,
std/zig/parser_test.zig+7
...@@ -1,3 +1,10 @@...@@ -1,3 +1,10 @@
1test "zig fmt: C pointers" {
2 try testCanonical(
3 \\const Ptr = [*c]i32;
4 \\
5 );
6}
7
1test "zig fmt: threadlocal" {8test "zig fmt: threadlocal" {
2 try testCanonical(9 try testCanonical(
3 \\threadlocal var x: i32 = 1234;10 \\threadlocal var x: i32 = 1234;
std/zig/tokenizer.zig+22-1
...@@ -141,6 +141,7 @@ pub const Token = struct {...@@ -141,6 +141,7 @@ pub const Token = struct {
141 LineComment,141 LineComment,
142 DocComment,142 DocComment,
143 BracketStarBracket,143 BracketStarBracket,
144 BracketStarCBracket,
144 ShebangLine,145 ShebangLine,
145 Keyword_align,146 Keyword_align,
146 Keyword_and,147 Keyword_and,
...@@ -279,6 +280,7 @@ pub const Tokenizer = struct {...@@ -279,6 +280,7 @@ pub const Tokenizer = struct {
279 SawAtSign,280 SawAtSign,
280 LBracket,281 LBracket,
281 LBracketStar,282 LBracketStar,
283 LBracketStarC,
282 };284 };
283285
284 pub fn next(self: *Tokenizer) Token {286 pub fn next(self: *Tokenizer) Token {
...@@ -456,6 +458,9 @@ pub const Tokenizer = struct {...@@ -456,6 +458,9 @@ pub const Tokenizer = struct {
456 },458 },
457459
458 State.LBracketStar => switch (c) {460 State.LBracketStar => switch (c) {
461 'c' => {
462 state = State.LBracketStarC;
463 },
459 ']' => {464 ']' => {
460 result.id = Token.Id.BracketStarBracket;465 result.id = Token.Id.BracketStarBracket;
461 self.index += 1;466 self.index += 1;
...@@ -467,6 +472,18 @@ pub const Tokenizer = struct {...@@ -467,6 +472,18 @@ pub const Tokenizer = struct {
467 },472 },
468 },473 },
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
470 State.Ampersand => switch (c) {487 State.Ampersand => switch (c) {
471 '=' => {488 '=' => {
472 result.id = Token.Id.AmpersandEqual;489 result.id = Token.Id.AmpersandEqual;
...@@ -1035,6 +1052,7 @@ pub const Tokenizer = struct {...@@ -1035,6 +1052,7 @@ pub const Tokenizer = struct {
1035 State.CharLiteralEnd,1052 State.CharLiteralEnd,
1036 State.StringLiteralBackslash,1053 State.StringLiteralBackslash,
1037 State.LBracketStar,1054 State.LBracketStar,
1055 State.LBracketStarC,
1038 => {1056 => {
1039 result.id = Token.Id.Invalid;1057 result.id = Token.Id.Invalid;
1040 },1058 },
...@@ -1169,12 +1187,15 @@ test "tokenizer" {...@@ -1169,12 +1187,15 @@ test "tokenizer" {
1169 testTokenize("test", []Token.Id{Token.Id.Keyword_test});1187 testTokenize("test", []Token.Id{Token.Id.Keyword_test});
1170}1188}
11711189
1172test "tokenizer - unknown length pointer" {1190test "tokenizer - unknown length pointer and then c pointer" {
1173 testTokenize(1191 testTokenize(
1174 \\[*]u81192 \\[*]u8
1193 \\[*c]u8
1175 , []Token.Id{1194 , []Token.Id{
1176 Token.Id.BracketStarBracket,1195 Token.Id.BracketStarBracket,
1177 Token.Id.Identifier,1196 Token.Id.Identifier,
1197 Token.Id.BracketStarCBracket,
1198 Token.Id.Identifier,
1178 });1199 });
1179}1200}
11801201