Commit 4a1b910e03

Andrew Kelley <andrew@ziglang.org>
2019-02-11 20:07:19
zig fmt: support C pointers
See #1059
1 parent 661fc79
Changed files (3)
std/zig/parse.zig
@@ -3525,7 +3525,12 @@ fn tokenIdToPrefixOp(id: Token.Id) ?ast.Node.PrefixOp.Op {
         Token.Id.Minus => ast.Node.PrefixOp.Op{ .Negation = void{} },
         Token.Id.MinusPercent => ast.Node.PrefixOp.Op{ .NegationWrap = void{} },
         Token.Id.Ampersand => ast.Node.PrefixOp.Op{ .AddressOf = void{} },
-        Token.Id.Asterisk, Token.Id.AsteriskAsterisk, Token.Id.BracketStarBracket => ast.Node.PrefixOp.Op{
+
+        Token.Id.Asterisk,
+        Token.Id.AsteriskAsterisk,
+        Token.Id.BracketStarBracket,
+        Token.Id.BracketStarCBracket,
+        => ast.Node.PrefixOp.Op{
             .PtrType = ast.Node.PrefixOp.PtrInfo{
                 .align_info = null,
                 .const_token = null,
std/zig/parser_test.zig
@@ -1,3 +1,10 @@
+test "zig fmt: C pointers" {
+    try testCanonical(
+        \\const Ptr = [*c]i32;
+        \\
+    );
+}
+
 test "zig fmt: threadlocal" {
     try testCanonical(
         \\threadlocal var x: i32 = 1234;
std/zig/tokenizer.zig
@@ -141,6 +141,7 @@ pub const Token = struct {
         LineComment,
         DocComment,
         BracketStarBracket,
+        BracketStarCBracket,
         ShebangLine,
         Keyword_align,
         Keyword_and,
@@ -279,6 +280,7 @@ pub const Tokenizer = struct {
         SawAtSign,
         LBracket,
         LBracketStar,
+        LBracketStarC,
     };
 
     pub fn next(self: *Tokenizer) Token {
@@ -456,6 +458,9 @@ pub const Tokenizer = struct {
                 },
 
                 State.LBracketStar => switch (c) {
+                    'c' => {
+                        state = State.LBracketStarC;
+                    },
                     ']' => {
                         result.id = Token.Id.BracketStarBracket;
                         self.index += 1;
@@ -467,6 +472,18 @@ pub const Tokenizer = struct {
                     },
                 },
 
+                State.LBracketStarC => switch (c) {
+                    ']' => {
+                        result.id = Token.Id.BracketStarCBracket;
+                        self.index += 1;
+                        break;
+                    },
+                    else => {
+                        result.id = Token.Id.Invalid;
+                        break;
+                    },
+                },
+
                 State.Ampersand => switch (c) {
                     '=' => {
                         result.id = Token.Id.AmpersandEqual;
@@ -1035,6 +1052,7 @@ pub const Tokenizer = struct {
                 State.CharLiteralEnd,
                 State.StringLiteralBackslash,
                 State.LBracketStar,
+                State.LBracketStarC,
                 => {
                     result.id = Token.Id.Invalid;
                 },
@@ -1169,12 +1187,15 @@ test "tokenizer" {
     testTokenize("test", []Token.Id{Token.Id.Keyword_test});
 }
 
-test "tokenizer - unknown length pointer" {
+test "tokenizer - unknown length pointer and then c pointer" {
     testTokenize(
         \\[*]u8
+        \\[*c]u8
     , []Token.Id{
         Token.Id.BracketStarBracket,
         Token.Id.Identifier,
+        Token.Id.BracketStarCBracket,
+        Token.Id.Identifier,
     });
 }