From 409ca8882939418b3d4cbd4be7a18daf1d4833aa Mon Sep 17 00:00:00 2001 From: Andrew Kelley Date: Fri, 5 Feb 2021 17:46:15 -0700 Subject: [PATCH] zig fmt: trailing comma in fn parameter list --- lib/std/zig/ast.zig | 4 +- lib/std/zig/parser_test.zig | 76 ++++++++++++++++++------------------- lib/std/zig/render.zig | 46 +++++++++++++--------- 3 files changed, 69 insertions(+), 57 deletions(-) diff --git a/lib/std/zig/ast.zig b/lib/std/zig/ast.zig index 9db1bc3b19..f875c5a93d 100644 --- a/lib/std/zig/ast.zig +++ b/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 diff --git a/lib/std/zig/parser_test.zig b/lib/std/zig/parser_test.zig index 345bce2654..e46cbf09d9 100644 --- a/lib/std/zig/parser_test.zig +++ b/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 { diff --git a/lib/std/zig/render.zig b/lib/std/zig/render.zig index cc3cf855c3..274e181e0e 100644 --- a/lib/std/zig/render.zig +++ b/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; + const tok = tree.firstToken(fn_proto.ast.callconv_expr) - 3; + const start = token_starts[tok]; + if (start < smallest_start) { + rparen = tok; + smallest_start = start; + } } - if (token_tags[maybe_bang] == .Bang) { - break :blk maybe_bang - 1; - } - 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(); }