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(...@@ -133,6 +133,7 @@ fn renderMember(
133) Error!void {133) Error!void {
134 const tree = r.tree;134 const tree = r.tree;
135 const ais = r.ais;135 const ais = r.ais;
136 const node_tags = tree.nodes.items(.tag);
136 const token_tags = tree.tokens.items(.tag);137 const token_tags = tree.tokens.items(.tag);
137 const main_tokens = tree.nodes.items(.main_token);138 const main_tokens = tree.nodes.items(.main_token);
138 const datas = tree.nodes.items(.data);139 const datas = tree.nodes.items(.data);
...@@ -194,6 +195,45 @@ fn renderMember(...@@ -194,6 +195,45 @@ fn renderMember(
194 ais.popIndent();195 ais.popIndent();
195 try ais.insertNewline();196 try ais.insertNewline();
196 try renderToken(r, tree.lastToken(body_node), space); // rbrace197 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);
197 } else {237 } else {
198 return renderExpression(r, body_node, space);238 return renderExpression(r, body_node, space);
199 }239 }
...@@ -1069,7 +1109,7 @@ fn renderVarDecl(...@@ -1069,7 +1109,7 @@ fn renderVarDecl(
1069 space: Space,1109 space: Space,
1070) Error!void {1110) Error!void {
1071 try renderVarDeclWithoutFixups(r, var_decl, ignore_comptime_token, space);1111 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)) {
1073 // Discard the variable like this: `_ = foo;`1113 // Discard the variable like this: `_ = foo;`
1074 const w = r.ais.writer();1114 const w = r.ais.writer();
1075 try w.writeAll("_ = ");1115 try w.writeAll("_ = ");
...@@ -1967,7 +2007,6 @@ fn renderBlock(...@@ -1967,7 +2007,6 @@ fn renderBlock(
1967 const tree = r.tree;2007 const tree = r.tree;
1968 const ais = r.ais;2008 const ais = r.ais;
1969 const token_tags = tree.tokens.items(.tag);2009 const token_tags = tree.tokens.items(.tag);
1970 const node_tags = tree.nodes.items(.tag);
1971 const lbrace = tree.nodes.items(.main_token)[block_node];2010 const lbrace = tree.nodes.items(.main_token)[block_node];
19722011
1973 if (token_tags[lbrace - 1] == .colon and2012 if (token_tags[lbrace - 1] == .colon and
...@@ -1976,22 +2015,35 @@ fn renderBlock(...@@ -1976,22 +2015,35 @@ fn renderBlock(
1976 try renderIdentifier(r, lbrace - 2, .none, .eagerly_unquote); // identifier2015 try renderIdentifier(r, lbrace - 2, .none, .eagerly_unquote); // identifier
1977 try renderToken(r, lbrace - 1, .space); // :2016 try renderToken(r, lbrace - 1, .space); // :
1978 }2017 }
1979
1980 ais.pushIndentNextLine();2018 ais.pushIndentNextLine();
1981 if (statements.len == 0) {2019 if (statements.len == 0) {
1982 try renderToken(r, lbrace, .none);2020 try renderToken(r, lbrace, .none);
1983 } else {2021 ais.popIndent();
1984 try renderToken(r, lbrace, .newline);2022 try renderToken(r, tree.lastToken(block_node), space); // rbrace
1985 for (statements, 0..) |stmt, i| {2023 return;
1986 if (i != 0) try renderExtraNewline(r, stmt);2024 }
1987 switch (node_tags[stmt]) {2025 try renderToken(r, lbrace, .newline);
1988 .global_var_decl,2026 return finishRenderBlock(r, block_node, statements, space);
1989 .local_var_decl,2027}
1990 .simple_var_decl,2028
1991 .aligned_var_decl,2029fn finishRenderBlock(
1992 => try renderVarDecl(r, tree.fullVarDecl(stmt).?, false, .semicolon),2030 r: *Render,
1993 else => try renderExpression(r, stmt, .semicolon),2031 block_node: Ast.Node.Index,
1994 }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),
1995 }2047 }
1996 }2048 }
1997 ais.popIndent();2049 ais.popIndent();