authorgravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2023-11-04 17:37:34-07:00
committergravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2023-11-04 17:37:34-07:00
log31ad3af956231357ffa2c0fcfaf96a95c2fe1e8b
tree32b5837255e2e02cc6c4b67adfc3096c8288fa43
parentfc1e7a56441aea4a9394c4e8c0142110891b4a1a

std.zig.render: support fixing unused parameter


1 files changed, 67 insertions(+), 15 deletions(-)

lib/std/zig/render.zig+67-15
......@@ -133,6 +133,7 @@ fn renderMember(
133133) Error!void {
134134 const tree = r.tree;
135135 const ais = r.ais;
136 const node_tags = tree.nodes.items(.tag);
136137 const token_tags = tree.tokens.items(.tag);
137138 const main_tokens = tree.nodes.items(.main_token);
138139 const datas = tree.nodes.items(.data);
......@@ -194,6 +195,45 @@ fn renderMember(
194195 ais.popIndent();
195196 try ais.insertNewline();
196197 try renderToken(r, tree.lastToken(body_node), space); // rbrace
198 } else if (r.fixups.unused_var_decls.count() != 0) {
199 ais.pushIndentNextLine();
200 const lbrace = tree.nodes.items(.main_token)[body_node];
201 try renderToken(r, lbrace, .newline);
202
203 var fn_proto_buf: [1]Ast.Node.Index = undefined;
204 const full_fn_proto = tree.fullFnProto(&fn_proto_buf, fn_proto).?;
205 var it = full_fn_proto.iterate(&tree);
206 while (it.next()) |param| {
207 const name_ident = param.name_token.?;
208 assert(token_tags[name_ident] == .identifier);
209 if (r.fixups.unused_var_decls.contains(name_ident)) {
210 const w = ais.writer();
211 try w.writeAll("_ = ");
212 try w.writeAll(tokenSliceForRender(r.tree, name_ident));
213 try w.writeAll(";\n");
214 }
215 }
216 var statements_buf: [2]Ast.Node.Index = undefined;
217 const statements = switch (node_tags[body_node]) {
218 .block_two,
219 .block_two_semicolon,
220 => b: {
221 statements_buf = .{ datas[body_node].lhs, datas[body_node].rhs };
222 if (datas[body_node].lhs == 0) {
223 break :b statements_buf[0..0];
224 } else if (datas[body_node].rhs == 0) {
225 break :b statements_buf[0..1];
226 } else {
227 break :b statements_buf[0..2];
228 }
229 },
230 .block,
231 .block_semicolon,
232 => tree.extra_data[datas[body_node].lhs..datas[body_node].rhs],
233
234 else => unreachable,
235 };
236 return finishRenderBlock(r, body_node, statements, space);
197237 } else {
198238 return renderExpression(r, body_node, space);
199239 }
......@@ -1069,7 +1109,7 @@ fn renderVarDecl(
10691109 space: Space,
10701110) Error!void {
10711111 try renderVarDeclWithoutFixups(r, var_decl, ignore_comptime_token, space);
1072 if (r.fixups.unused_var_decls.contains(var_decl.ast.mut_token)) {
1112 if (r.fixups.unused_var_decls.contains(var_decl.ast.mut_token + 1)) {
10731113 // Discard the variable like this: `_ = foo;`
10741114 const w = r.ais.writer();
10751115 try w.writeAll("_ = ");
......@@ -1967,7 +2007,6 @@ fn renderBlock(
19672007 const tree = r.tree;
19682008 const ais = r.ais;
19692009 const token_tags = tree.tokens.items(.tag);
1970 const node_tags = tree.nodes.items(.tag);
19712010 const lbrace = tree.nodes.items(.main_token)[block_node];
19722011
19732012 if (token_tags[lbrace - 1] == .colon and
......@@ -1976,22 +2015,35 @@ fn renderBlock(
19762015 try renderIdentifier(r, lbrace - 2, .none, .eagerly_unquote); // identifier
19772016 try renderToken(r, lbrace - 1, .space); // :
19782017 }
1979
19802018 ais.pushIndentNextLine();
19812019 if (statements.len == 0) {
19822020 try renderToken(r, lbrace, .none);
1983 } else {
1984 try renderToken(r, lbrace, .newline);
1985 for (statements, 0..) |stmt, i| {
1986 if (i != 0) try renderExtraNewline(r, stmt);
1987 switch (node_tags[stmt]) {
1988 .global_var_decl,
1989 .local_var_decl,
1990 .simple_var_decl,
1991 .aligned_var_decl,
1992 => try renderVarDecl(r, tree.fullVarDecl(stmt).?, false, .semicolon),
1993 else => try renderExpression(r, stmt, .semicolon),
1994 }
2021 ais.popIndent();
2022 try renderToken(r, tree.lastToken(block_node), space); // rbrace
2023 return;
2024 }
2025 try renderToken(r, lbrace, .newline);
2026 return finishRenderBlock(r, block_node, statements, space);
2027}
2028
2029fn finishRenderBlock(
2030 r: *Render,
2031 block_node: Ast.Node.Index,
2032 statements: []const Ast.Node.Index,
2033 space: Space,
2034) Error!void {
2035 const tree = r.tree;
2036 const node_tags = tree.nodes.items(.tag);
2037 const ais = r.ais;
2038 for (statements, 0..) |stmt, i| {
2039 if (i != 0) try renderExtraNewline(r, stmt);
2040 switch (node_tags[stmt]) {
2041 .global_var_decl,
2042 .local_var_decl,
2043 .simple_var_decl,
2044 .aligned_var_decl,
2045 => try renderVarDecl(r, tree.fullVarDecl(stmt).?, false, .semicolon),
2046 else => try renderExpression(r, stmt, .semicolon),
19952047 }
19962048 }
19972049 ais.popIndent();