Commit 409ca88829

Andrew Kelley <andrew@ziglang.org>
2021-02-06 01:46:15
zig fmt: trailing comma in fn parameter list
1 parent 16a2562
Changed files (3)
lib/std/zig/ast.zig
@@ -231,7 +231,6 @@ pub const Tree = struct {
             .NullLiteral,
             .UndefinedLiteral,
             .UnreachableLiteral,
-            .EnumLiteral,
             .StringLiteral,
             .GroupedExpression,
             .BuiltinCallTwo,
@@ -256,6 +255,7 @@ pub const Tree = struct {
             .StructInitDot,
             .StructInitDotTwo,
             .StructInitDotTwoComma,
+            .EnumLiteral,
             => return main_tokens[n] - 1,
 
             .Catch,
@@ -494,6 +494,7 @@ pub const Tree = struct {
             .UnreachableLiteral,
             .Identifier,
             .Deref,
+            .EnumLiteral,
             => return main_tokens[n] + end_offset,
 
             .Call,
@@ -682,7 +683,6 @@ pub const Tree = struct {
             .Switch => unreachable, // TODO
             .If => unreachable, // TODO
             .Continue => unreachable, // TODO
-            .EnumLiteral => unreachable, // TODO
             .ErrorSetDecl => unreachable, // TODO
             .AsmSimple => unreachable, // TODO
             .Asm => unreachable, // TODO
lib/std/zig/parser_test.zig
@@ -225,44 +225,44 @@ test "zig fmt: container declaration, transform trailing comma" {
     );
 }
 
-//test "zig fmt: trailing comma in fn parameter list" {
-//    try testCanonical(
-//        \\pub fn f(
-//        \\    a: i32,
-//        \\    b: i32,
-//        \\) i32 {}
-//        \\pub fn f(
-//        \\    a: i32,
-//        \\    b: i32,
-//        \\) align(8) i32 {}
-//        \\pub fn f(
-//        \\    a: i32,
-//        \\    b: i32,
-//        \\) linksection(".text") i32 {}
-//        \\pub fn f(
-//        \\    a: i32,
-//        \\    b: i32,
-//        \\) callconv(.C) i32 {}
-//        \\pub fn f(
-//        \\    a: i32,
-//        \\    b: i32,
-//        \\) align(8) linksection(".text") i32 {}
-//        \\pub fn f(
-//        \\    a: i32,
-//        \\    b: i32,
-//        \\) align(8) callconv(.C) i32 {}
-//        \\pub fn f(
-//        \\    a: i32,
-//        \\    b: i32,
-//        \\) align(8) linksection(".text") callconv(.C) i32 {}
-//        \\pub fn f(
-//        \\    a: i32,
-//        \\    b: i32,
-//        \\) linksection(".text") callconv(.C) i32 {}
-//        \\
-//    );
-//}
-//
+test "zig fmt: trailing comma in fn parameter list" {
+    try testCanonical(
+        \\pub fn f(
+        \\    a: i32,
+        \\    b: i32,
+        \\) i32 {}
+        \\pub fn f(
+        \\    a: i32,
+        \\    b: i32,
+        \\) align(8) i32 {}
+        \\pub fn f(
+        \\    a: i32,
+        \\    b: i32,
+        \\) linksection(".text") i32 {}
+        \\pub fn f(
+        \\    a: i32,
+        \\    b: i32,
+        \\) callconv(.C) i32 {}
+        \\pub fn f(
+        \\    a: i32,
+        \\    b: i32,
+        \\) align(8) linksection(".text") i32 {}
+        \\pub fn f(
+        \\    a: i32,
+        \\    b: i32,
+        \\) align(8) callconv(.C) i32 {}
+        \\pub fn f(
+        \\    a: i32,
+        \\    b: i32,
+        \\) align(8) linksection(".text") callconv(.C) i32 {}
+        \\pub fn f(
+        \\    a: i32,
+        \\    b: i32,
+        \\) linksection(".text") callconv(.C) i32 {}
+        \\
+    );
+}
+
 //test "zig fmt: comptime struct field" {
 //    try testCanonical(
 //        \\const Foo = struct {
lib/std/zig/render.zig
@@ -1138,13 +1138,10 @@ fn renderExpression(ais: *Ais, tree: ast.Tree, node: ast.Node.Index, space: Spac
         //    return renderToken(ais, tree, asm_node.rparen, space);
         //},
 
-        .EnumLiteral => unreachable, // TODO
-        //.EnumLiteral => {
-        //    const enum_literal = @fieldParentPtr(ast.Node.EnumLiteral, "base", base);
-
-        //    try renderToken(ais, tree, enum_literal.dot, Space.None); // .
-        //    return renderToken(ais, tree, enum_literal.name, space); // name
-        //},
+        .EnumLiteral => {
+            try renderToken(ais, tree, main_tokens[node] - 1, .None); // .
+            return renderToken(ais, tree, main_tokens[node], space); // name
+        },
 
         .FnDecl => unreachable,
         .ContainerField => unreachable,
@@ -1538,6 +1535,7 @@ fn renderBuiltinCall(
 
 fn renderFnProto(ais: *Ais, tree: ast.Tree, fn_proto: ast.Full.FnProto, space: Space) Error!void {
     const token_tags = tree.tokens.items(.tag);
+    const token_starts = tree.tokens.items(.start);
 
     const after_fn_token = fn_proto.ast.fn_token + 1;
     const lparen = if (token_tags[after_fn_token] == .Identifier) blk: {
@@ -1552,21 +1550,35 @@ fn renderFnProto(ais: *Ais, tree: ast.Tree, fn_proto: ast.Full.FnProto, space: S
 
     const maybe_bang = tree.firstToken(fn_proto.ast.return_type) - 1;
     const rparen = blk: {
-        // The first token for the annotation expressions is the left
-        // parenthesis, hence the need for two previous tokens.
+        // These may appear in any order, so we have to check the token_starts array
+        // to find out which is first.
+        var rparen: ast.TokenIndex = maybe_bang;
+        var smallest_start = token_starts[maybe_bang];
         if (fn_proto.ast.align_expr != 0) {
-            break :blk tree.firstToken(fn_proto.ast.align_expr) - 3;
+            const tok = tree.firstToken(fn_proto.ast.align_expr) - 3;
+            const start = token_starts[tok];
+            if (start < smallest_start) {
+                rparen = tok;
+                smallest_start = start;
+            }
         }
         if (fn_proto.ast.section_expr != 0) {
-            break :blk tree.firstToken(fn_proto.ast.section_expr) - 3;
+            const tok = tree.firstToken(fn_proto.ast.section_expr) - 3;
+            const start = token_starts[tok];
+            if (start < smallest_start) {
+                rparen = tok;
+                smallest_start = start;
+            }
         }
         if (fn_proto.ast.callconv_expr != 0) {
-            break :blk tree.firstToken(fn_proto.ast.callconv_expr) - 3;
-        }
-        if (token_tags[maybe_bang] == .Bang) {
-            break :blk maybe_bang - 1;
+            const tok = tree.firstToken(fn_proto.ast.callconv_expr) - 3;
+            const start = token_starts[tok];
+            if (start < smallest_start) {
+                rparen = tok;
+                smallest_start = start;
+            }
         }
-        break :blk maybe_bang;
+        break :blk rparen;
     };
     assert(token_tags[rparen] == .RParen);
 
@@ -1663,7 +1675,7 @@ fn renderFnProto(ais: *Ais, tree: ast.Tree, fn_proto: ast.Full.FnProto, space: S
             const param = fn_proto.ast.params[param_i];
             param_i += 1;
             try renderExpression(ais, tree, param, .Comma);
-            last_param_token = tree.lastToken(param) + 2;
+            last_param_token = tree.lastToken(param) + 1;
         }
         ais.popIndent();
     }