zig fmt: trailing comma in fn parameter list

This commit is contained in:
Andrew Kelley 2021-02-05 17:46:15 -07:00
parent 16a2562c3f
commit 409ca88829
3 changed files with 69 additions and 57 deletions

View File

@ -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

View File

@ -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 {

View File

@ -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();
}