| ... | ... | @@ -18,6 +18,11 @@ pub const Fixups = struct { |
| 18 | 18 | /// The key is the mut token (`var`/`const`) of the variable declaration |
| 19 | 19 | /// that should have a `_ = foo;` inserted afterwards. |
| 20 | 20 | unused_var_decls: std.AutoHashMapUnmanaged(Ast.TokenIndex, void) = .{}, |
| 21 | /// The functions in this unordered set of indices will render with a |
| 22 | /// function body of `@trap()` instead, with all parameters discarded. |
| 23 | /// The indexes correspond to the order in which the functions appear in |
| 24 | /// the file. |
| 25 | gut_functions: std.AutoHashMapUnmanaged(u32, void) = .{}, |
| 21 | 26 | |
| 22 | 27 | pub fn count(f: Fixups) usize { |
| 23 | 28 | return f.unused_var_decls.count(); |
| ... | ... | @@ -34,6 +39,9 @@ const Render = struct { |
| 34 | 39 | ais: *Ais, |
| 35 | 40 | tree: Ast, |
| 36 | 41 | fixups: Fixups, |
| 42 | /// Keeps track of how many function declarations we have seen so far. Used |
| 43 | /// by Fixups. |
| 44 | function_index: u32, |
| 37 | 45 | }; |
| 38 | 46 | |
| 39 | 47 | pub fn renderTree(buffer: *std.ArrayList(u8), tree: Ast, fixups: Fixups) Error!void { |
| ... | ... | @@ -47,24 +55,25 @@ pub fn renderTree(buffer: *std.ArrayList(u8), tree: Ast, fixups: Fixups) Error!v |
| 47 | 55 | .ais = &auto_indenting_stream, |
| 48 | 56 | .tree = tree, |
| 49 | 57 | .fixups = fixups, |
| 58 | .function_index = 0, |
| 50 | 59 | }; |
| 51 | 60 | |
| 52 | 61 | // Render all the line comments at the beginning of the file. |
| 53 | 62 | const comment_end_loc = tree.tokens.items(.start)[0]; |
| 54 | | _ = try renderComments(r, 0, comment_end_loc); |
| 63 | _ = try renderComments(&r, 0, comment_end_loc); |
| 55 | 64 | |
| 56 | 65 | if (tree.tokens.items(.tag)[0] == .container_doc_comment) { |
| 57 | | try renderContainerDocComments(r, 0); |
| 66 | try renderContainerDocComments(&r, 0); |
| 58 | 67 | } |
| 59 | 68 | |
| 60 | 69 | if (tree.mode == .zon) { |
| 61 | 70 | try renderExpression( |
| 62 | | r, |
| 71 | &r, |
| 63 | 72 | tree.nodes.items(.data)[0].lhs, |
| 64 | 73 | .newline, |
| 65 | 74 | ); |
| 66 | 75 | } else { |
| 67 | | try renderMembers(r, tree.rootDecls()); |
| 76 | try renderMembers(&r, tree.rootDecls()); |
| 68 | 77 | } |
| 69 | 78 | |
| 70 | 79 | if (auto_indenting_stream.disabled_offset) |disabled_offset| { |
| ... | ... | @@ -73,7 +82,7 @@ pub fn renderTree(buffer: *std.ArrayList(u8), tree: Ast, fixups: Fixups) Error!v |
| 73 | 82 | } |
| 74 | 83 | |
| 75 | 84 | /// Render all members in the given slice, keeping empty lines where appropriate |
| 76 | | fn renderMembers(r: Render, members: []const Ast.Node.Index) Error!void { |
| 85 | fn renderMembers(r: *Render, members: []const Ast.Node.Index) Error!void { |
| 77 | 86 | const tree = r.tree; |
| 78 | 87 | if (members.len == 0) return; |
| 79 | 88 | const container: Container = for (members) |member| { |
| ... | ... | @@ -93,7 +102,7 @@ const Container = enum { |
| 93 | 102 | }; |
| 94 | 103 | |
| 95 | 104 | fn renderMember( |
| 96 | | r: Render, |
| 105 | r: *Render, |
| 97 | 106 | container: Container, |
| 98 | 107 | decl: Ast.Node.Index, |
| 99 | 108 | space: Space, |
| ... | ... | @@ -106,6 +115,8 @@ fn renderMember( |
| 106 | 115 | try renderDocComments(r, tree.firstToken(decl)); |
| 107 | 116 | switch (tree.nodes.items(.tag)[decl]) { |
| 108 | 117 | .fn_decl => { |
| 118 | const this_index = r.function_index; |
| 119 | r.function_index += 1; |
| 109 | 120 | // Some examples: |
| 110 | 121 | // pub extern "foo" fn ... |
| 111 | 122 | // export fn ... |
| ... | ... | @@ -150,7 +161,19 @@ fn renderMember( |
| 150 | 161 | } |
| 151 | 162 | assert(datas[decl].rhs != 0); |
| 152 | 163 | try renderExpression(r, fn_proto, .space); |
| 153 | | return renderExpression(r, datas[decl].rhs, space); |
| 164 | const body_node = datas[decl].rhs; |
| 165 | if (r.fixups.gut_functions.contains(this_index)) { |
| 166 | ais.pushIndent(); |
| 167 | const lbrace = tree.nodes.items(.main_token)[body_node]; |
| 168 | try renderToken(r, lbrace, .newline); |
| 169 | try discardAllParams(r, fn_proto); |
| 170 | try ais.writer().writeAll("@trap();"); |
| 171 | ais.popIndent(); |
| 172 | try ais.insertNewline(); |
| 173 | try renderToken(r, tree.lastToken(body_node), space); // rbrace |
| 174 | } else { |
| 175 | return renderExpression(r, body_node, space); |
| 176 | } |
| 154 | 177 | }, |
| 155 | 178 | .fn_proto_simple, |
| 156 | 179 | .fn_proto_multi, |
| ... | ... | @@ -227,7 +250,7 @@ fn renderMember( |
| 227 | 250 | } |
| 228 | 251 | |
| 229 | 252 | /// Render all expressions in the slice, keeping empty lines where appropriate |
| 230 | | fn renderExpressions(r: Render, expressions: []const Ast.Node.Index, space: Space) Error!void { |
| 253 | fn renderExpressions(r: *Render, expressions: []const Ast.Node.Index, space: Space) Error!void { |
| 231 | 254 | if (expressions.len == 0) return; |
| 232 | 255 | try renderExpression(r, expressions[0], space); |
| 233 | 256 | for (expressions[1..]) |expression| { |
| ... | ... | @@ -236,7 +259,7 @@ fn renderExpressions(r: Render, expressions: []const Ast.Node.Index, space: Spac |
| 236 | 259 | } |
| 237 | 260 | } |
| 238 | 261 | |
| 239 | | fn renderExpression(r: Render, node: Ast.Node.Index, space: Space) Error!void { |
| 262 | fn renderExpression(r: *Render, node: Ast.Node.Index, space: Space) Error!void { |
| 240 | 263 | const tree = r.tree; |
| 241 | 264 | const ais = r.ais; |
| 242 | 265 | const token_tags = tree.tokens.items(.tag); |
| ... | ... | @@ -815,7 +838,7 @@ fn renderExpression(r: Render, node: Ast.Node.Index, space: Space) Error!void { |
| 815 | 838 | } |
| 816 | 839 | |
| 817 | 840 | fn renderArrayType( |
| 818 | | r: Render, |
| 841 | r: *Render, |
| 819 | 842 | array_type: Ast.full.ArrayType, |
| 820 | 843 | space: Space, |
| 821 | 844 | ) Error!void { |
| ... | ... | @@ -836,7 +859,7 @@ fn renderArrayType( |
| 836 | 859 | return renderExpression(r, array_type.ast.elem_type, space); |
| 837 | 860 | } |
| 838 | 861 | |
| 839 | | fn renderPtrType(r: Render, ptr_type: Ast.full.PtrType, space: Space) Error!void { |
| 862 | fn renderPtrType(r: *Render, ptr_type: Ast.full.PtrType, space: Space) Error!void { |
| 840 | 863 | const tree = r.tree; |
| 841 | 864 | switch (ptr_type.size) { |
| 842 | 865 | .One => { |
| ... | ... | @@ -925,7 +948,7 @@ fn renderPtrType(r: Render, ptr_type: Ast.full.PtrType, space: Space) Error!void |
| 925 | 948 | } |
| 926 | 949 | |
| 927 | 950 | fn renderSlice( |
| 928 | | r: Render, |
| 951 | r: *Render, |
| 929 | 952 | slice_node: Ast.Node.Index, |
| 930 | 953 | slice: Ast.full.Slice, |
| 931 | 954 | space: Space, |
| ... | ... | @@ -960,7 +983,7 @@ fn renderSlice( |
| 960 | 983 | } |
| 961 | 984 | |
| 962 | 985 | fn renderAsmOutput( |
| 963 | | r: Render, |
| 986 | r: *Render, |
| 964 | 987 | asm_output: Ast.Node.Index, |
| 965 | 988 | space: Space, |
| 966 | 989 | ) Error!void { |
| ... | ... | @@ -989,7 +1012,7 @@ fn renderAsmOutput( |
| 989 | 1012 | } |
| 990 | 1013 | |
| 991 | 1014 | fn renderAsmInput( |
| 992 | | r: Render, |
| 1015 | r: *Render, |
| 993 | 1016 | asm_input: Ast.Node.Index, |
| 994 | 1017 | space: Space, |
| 995 | 1018 | ) Error!void { |
| ... | ... | @@ -1010,7 +1033,25 @@ fn renderAsmInput( |
| 1010 | 1033 | } |
| 1011 | 1034 | |
| 1012 | 1035 | fn renderVarDecl( |
| 1013 | | r: Render, |
| 1036 | r: *Render, |
| 1037 | var_decl: Ast.full.VarDecl, |
| 1038 | /// Destructures intentionally ignore leading `comptime` tokens. |
| 1039 | ignore_comptime_token: bool, |
| 1040 | /// `comma_space` and `space` are used for destructure LHS decls. |
| 1041 | space: Space, |
| 1042 | ) Error!void { |
| 1043 | try renderVarDeclWithoutFixups(r, var_decl, ignore_comptime_token, space); |
| 1044 | if (r.fixups.unused_var_decls.contains(var_decl.ast.mut_token)) { |
| 1045 | // Discard the variable like this: `_ = foo;` |
| 1046 | const w = r.ais.writer(); |
| 1047 | try w.writeAll("_ = "); |
| 1048 | try w.writeAll(tokenSliceForRender(r.tree, var_decl.ast.mut_token + 1)); |
| 1049 | try w.writeAll(";\n"); |
| 1050 | } |
| 1051 | } |
| 1052 | |
| 1053 | fn renderVarDeclWithoutFixups( |
| 1054 | r: *Render, |
| 1014 | 1055 | var_decl: Ast.full.VarDecl, |
| 1015 | 1056 | /// Destructures intentionally ignore leading `comptime` tokens. |
| 1016 | 1057 | ignore_comptime_token: bool, |
| ... | ... | @@ -1131,7 +1172,7 @@ fn renderVarDecl( |
| 1131 | 1172 | return renderExpression(r, var_decl.ast.init_node, space); // ; |
| 1132 | 1173 | } |
| 1133 | 1174 | |
| 1134 | | fn renderIf(r: Render, if_node: Ast.full.If, space: Space) Error!void { |
| 1175 | fn renderIf(r: *Render, if_node: Ast.full.If, space: Space) Error!void { |
| 1135 | 1176 | return renderWhile(r, .{ |
| 1136 | 1177 | .ast = .{ |
| 1137 | 1178 | .while_token = if_node.ast.if_token, |
| ... | ... | @@ -1150,7 +1191,7 @@ fn renderIf(r: Render, if_node: Ast.full.If, space: Space) Error!void { |
| 1150 | 1191 | |
| 1151 | 1192 | /// Note that this function is additionally used to render if expressions, with |
| 1152 | 1193 | /// respective values set to null. |
| 1153 | | fn renderWhile(r: Render, while_node: Ast.full.While, space: Space) Error!void { |
| 1194 | fn renderWhile(r: *Render, while_node: Ast.full.While, space: Space) Error!void { |
| 1154 | 1195 | const tree = r.tree; |
| 1155 | 1196 | const token_tags = tree.tokens.items(.tag); |
| 1156 | 1197 | |
| ... | ... | @@ -1214,7 +1255,7 @@ fn renderWhile(r: Render, while_node: Ast.full.While, space: Space) Error!void { |
| 1214 | 1255 | } |
| 1215 | 1256 | |
| 1216 | 1257 | fn renderThenElse( |
| 1217 | | r: Render, |
| 1258 | r: *Render, |
| 1218 | 1259 | last_prefix_token: Ast.TokenIndex, |
| 1219 | 1260 | then_expr: Ast.Node.Index, |
| 1220 | 1261 | else_token: Ast.TokenIndex, |
| ... | ... | @@ -1275,7 +1316,7 @@ fn renderThenElse( |
| 1275 | 1316 | } |
| 1276 | 1317 | } |
| 1277 | 1318 | |
| 1278 | | fn renderFor(r: Render, for_node: Ast.full.For, space: Space) Error!void { |
| 1319 | fn renderFor(r: *Render, for_node: Ast.full.For, space: Space) Error!void { |
| 1279 | 1320 | const tree = r.tree; |
| 1280 | 1321 | const ais = r.ais; |
| 1281 | 1322 | const token_tags = tree.tokens.items(.tag); |
| ... | ... | @@ -1346,7 +1387,7 @@ fn renderFor(r: Render, for_node: Ast.full.For, space: Space) Error!void { |
| 1346 | 1387 | } |
| 1347 | 1388 | |
| 1348 | 1389 | fn renderContainerField( |
| 1349 | | r: Render, |
| 1390 | r: *Render, |
| 1350 | 1391 | container: Container, |
| 1351 | 1392 | field_param: Ast.full.ContainerField, |
| 1352 | 1393 | space: Space, |
| ... | ... | @@ -1450,7 +1491,7 @@ fn renderContainerField( |
| 1450 | 1491 | } |
| 1451 | 1492 | |
| 1452 | 1493 | fn renderBuiltinCall( |
| 1453 | | r: Render, |
| 1494 | r: *Render, |
| 1454 | 1495 | builtin_token: Ast.TokenIndex, |
| 1455 | 1496 | params: []const Ast.Node.Index, |
| 1456 | 1497 | space: Space, |
| ... | ... | @@ -1588,7 +1629,7 @@ fn renderBuiltinCall( |
| 1588 | 1629 | } |
| 1589 | 1630 | } |
| 1590 | 1631 | |
| 1591 | | fn renderFnProto(r: Render, fn_proto: Ast.full.FnProto, space: Space) Error!void { |
| 1632 | fn renderFnProto(r: *Render, fn_proto: Ast.full.FnProto, space: Space) Error!void { |
| 1592 | 1633 | const tree = r.tree; |
| 1593 | 1634 | const ais = r.ais; |
| 1594 | 1635 | const token_tags = tree.tokens.items(.tag); |
| ... | ... | @@ -1806,7 +1847,7 @@ fn renderFnProto(r: Render, fn_proto: Ast.full.FnProto, space: Space) Error!void |
| 1806 | 1847 | } |
| 1807 | 1848 | |
| 1808 | 1849 | fn renderSwitchCase( |
| 1809 | | r: Render, |
| 1850 | r: *Render, |
| 1810 | 1851 | switch_case: Ast.full.SwitchCase, |
| 1811 | 1852 | space: Space, |
| 1812 | 1853 | ) Error!void { |
| ... | ... | @@ -1869,7 +1910,7 @@ fn renderSwitchCase( |
| 1869 | 1910 | } |
| 1870 | 1911 | |
| 1871 | 1912 | fn renderBlock( |
| 1872 | | r: Render, |
| 1913 | r: *Render, |
| 1873 | 1914 | block_node: Ast.Node.Index, |
| 1874 | 1915 | statements: []const Ast.Node.Index, |
| 1875 | 1916 | space: Space, |
| ... | ... | @@ -1910,7 +1951,7 @@ fn renderBlock( |
| 1910 | 1951 | } |
| 1911 | 1952 | |
| 1912 | 1953 | fn renderStructInit( |
| 1913 | | r: Render, |
| 1954 | r: *Render, |
| 1914 | 1955 | struct_node: Ast.Node.Index, |
| 1915 | 1956 | struct_init: Ast.full.StructInit, |
| 1916 | 1957 | space: Space, |
| ... | ... | @@ -1975,7 +2016,7 @@ fn renderStructInit( |
| 1975 | 2016 | } |
| 1976 | 2017 | |
| 1977 | 2018 | fn renderArrayInit( |
| 1978 | | r: Render, |
| 2019 | r: *Render, |
| 1979 | 2020 | array_init: Ast.full.ArrayInit, |
| 1980 | 2021 | space: Space, |
| 1981 | 2022 | ) Error!void { |
| ... | ... | @@ -2095,6 +2136,7 @@ fn renderArrayInit( |
| 2095 | 2136 | .ais = &auto_indenting_stream, |
| 2096 | 2137 | .tree = r.tree, |
| 2097 | 2138 | .fixups = r.fixups, |
| 2139 | .function_index = r.function_index, |
| 2098 | 2140 | }; |
| 2099 | 2141 | |
| 2100 | 2142 | // Calculate size of columns in current section |
| ... | ... | @@ -2106,7 +2148,7 @@ fn renderArrayInit( |
| 2106 | 2148 | sub_expr_buffer_starts[i] = start; |
| 2107 | 2149 | |
| 2108 | 2150 | if (i + 1 < section_exprs.len) { |
| 2109 | | try renderExpression(sub_render, expr, .none); |
| 2151 | try renderExpression(&sub_render, expr, .none); |
| 2110 | 2152 | const width = sub_expr_buffer.items.len - start; |
| 2111 | 2153 | const this_contains_newline = mem.indexOfScalar(u8, sub_expr_buffer.items[start..], '\n') != null; |
| 2112 | 2154 | contains_newline = contains_newline or this_contains_newline; |
| ... | ... | @@ -2126,7 +2168,7 @@ fn renderArrayInit( |
| 2126 | 2168 | column_counter = 0; |
| 2127 | 2169 | } |
| 2128 | 2170 | } else { |
| 2129 | | try renderExpression(sub_render, expr, .comma); |
| 2171 | try renderExpression(&sub_render, expr, .comma); |
| 2130 | 2172 | const width = sub_expr_buffer.items.len - start - 2; |
| 2131 | 2173 | const this_contains_newline = mem.indexOfScalar(u8, sub_expr_buffer.items[start .. sub_expr_buffer.items.len - 1], '\n') != null; |
| 2132 | 2174 | contains_newline = contains_newline or this_contains_newline; |
| ... | ... | @@ -2201,7 +2243,7 @@ fn renderArrayInit( |
| 2201 | 2243 | } |
| 2202 | 2244 | |
| 2203 | 2245 | fn renderContainerDecl( |
| 2204 | | r: Render, |
| 2246 | r: *Render, |
| 2205 | 2247 | container_decl_node: Ast.Node.Index, |
| 2206 | 2248 | container_decl: Ast.full.ContainerDecl, |
| 2207 | 2249 | space: Space, |
| ... | ... | @@ -2317,7 +2359,7 @@ fn renderContainerDecl( |
| 2317 | 2359 | } |
| 2318 | 2360 | |
| 2319 | 2361 | fn renderAsm( |
| 2320 | | r: Render, |
| 2362 | r: *Render, |
| 2321 | 2363 | asm_node: Ast.full.Asm, |
| 2322 | 2364 | space: Space, |
| 2323 | 2365 | ) Error!void { |
| ... | ... | @@ -2476,7 +2518,7 @@ fn renderAsm( |
| 2476 | 2518 | } |
| 2477 | 2519 | |
| 2478 | 2520 | fn renderCall( |
| 2479 | | r: Render, |
| 2521 | r: *Render, |
| 2480 | 2522 | call: Ast.full.Call, |
| 2481 | 2523 | space: Space, |
| 2482 | 2524 | ) Error!void { |
| ... | ... | @@ -2488,7 +2530,7 @@ fn renderCall( |
| 2488 | 2530 | } |
| 2489 | 2531 | |
| 2490 | 2532 | fn renderParamList( |
| 2491 | | r: Render, |
| 2533 | r: *Render, |
| 2492 | 2534 | lparen: Ast.TokenIndex, |
| 2493 | 2535 | params: []const Ast.Node.Index, |
| 2494 | 2536 | space: Space, |
| ... | ... | @@ -2557,7 +2599,7 @@ fn renderParamList( |
| 2557 | 2599 | |
| 2558 | 2600 | /// Renders the given expression indented, popping the indent before rendering |
| 2559 | 2601 | /// any following line comments |
| 2560 | | fn renderExpressionIndented(r: Render, node: Ast.Node.Index, space: Space) Error!void { |
| 2602 | fn renderExpressionIndented(r: *Render, node: Ast.Node.Index, space: Space) Error!void { |
| 2561 | 2603 | const tree = r.tree; |
| 2562 | 2604 | const ais = r.ais; |
| 2563 | 2605 | const token_starts = tree.tokens.items(.start); |
| ... | ... | @@ -2617,7 +2659,7 @@ fn renderExpressionIndented(r: Render, node: Ast.Node.Index, space: Space) Error |
| 2617 | 2659 | |
| 2618 | 2660 | /// Render an expression, and the comma that follows it, if it is present in the source. |
| 2619 | 2661 | /// If a comma is present, and `space` is `Space.comma`, render only a single comma. |
| 2620 | | fn renderExpressionComma(r: Render, node: Ast.Node.Index, space: Space) Error!void { |
| 2662 | fn renderExpressionComma(r: *Render, node: Ast.Node.Index, space: Space) Error!void { |
| 2621 | 2663 | const tree = r.tree; |
| 2622 | 2664 | const token_tags = tree.tokens.items(.tag); |
| 2623 | 2665 | const maybe_comma = tree.lastToken(node) + 1; |
| ... | ... | @@ -2631,7 +2673,7 @@ fn renderExpressionComma(r: Render, node: Ast.Node.Index, space: Space) Error!vo |
| 2631 | 2673 | |
| 2632 | 2674 | /// Render a token, and the comma that follows it, if it is present in the source. |
| 2633 | 2675 | /// If a comma is present, and `space` is `Space.comma`, render only a single comma. |
| 2634 | | fn renderTokenComma(r: Render, token: Ast.TokenIndex, space: Space) Error!void { |
| 2676 | fn renderTokenComma(r: *Render, token: Ast.TokenIndex, space: Space) Error!void { |
| 2635 | 2677 | const tree = r.tree; |
| 2636 | 2678 | const token_tags = tree.tokens.items(.tag); |
| 2637 | 2679 | const maybe_comma = token + 1; |
| ... | ... | @@ -2645,7 +2687,7 @@ fn renderTokenComma(r: Render, token: Ast.TokenIndex, space: Space) Error!void { |
| 2645 | 2687 | |
| 2646 | 2688 | /// Render an identifier, and the comma that follows it, if it is present in the source. |
| 2647 | 2689 | /// If a comma is present, and `space` is `Space.comma`, render only a single comma. |
| 2648 | | fn renderIdentifierComma(r: Render, token: Ast.TokenIndex, space: Space, quote: QuoteBehavior) Error!void { |
| 2690 | fn renderIdentifierComma(r: *Render, token: Ast.TokenIndex, space: Space, quote: QuoteBehavior) Error!void { |
| 2649 | 2691 | const tree = r.tree; |
| 2650 | 2692 | const token_tags = tree.tokens.items(.tag); |
| 2651 | 2693 | const maybe_comma = token + 1; |
| ... | ... | @@ -2678,7 +2720,7 @@ const Space = enum { |
| 2678 | 2720 | skip, |
| 2679 | 2721 | }; |
| 2680 | 2722 | |
| 2681 | | fn renderToken(r: Render, token_index: Ast.TokenIndex, space: Space) Error!void { |
| 2723 | fn renderToken(r: *Render, token_index: Ast.TokenIndex, space: Space) Error!void { |
| 2682 | 2724 | const tree = r.tree; |
| 2683 | 2725 | const ais = r.ais; |
| 2684 | 2726 | const lexeme = tokenSliceForRender(tree, token_index); |
| ... | ... | @@ -2686,7 +2728,7 @@ fn renderToken(r: Render, token_index: Ast.TokenIndex, space: Space) Error!void |
| 2686 | 2728 | try renderSpace(r, token_index, lexeme.len, space); |
| 2687 | 2729 | } |
| 2688 | 2730 | |
| 2689 | | fn renderSpace(r: Render, token_index: Ast.TokenIndex, lexeme_len: usize, space: Space) Error!void { |
| 2731 | fn renderSpace(r: *Render, token_index: Ast.TokenIndex, lexeme_len: usize, space: Space) Error!void { |
| 2690 | 2732 | const tree = r.tree; |
| 2691 | 2733 | const ais = r.ais; |
| 2692 | 2734 | const token_tags = tree.tokens.items(.tag); |
| ... | ... | @@ -2734,7 +2776,7 @@ const QuoteBehavior = enum { |
| 2734 | 2776 | eagerly_unquote_except_underscore, |
| 2735 | 2777 | }; |
| 2736 | 2778 | |
| 2737 | | fn renderIdentifier(r: Render, token_index: Ast.TokenIndex, space: Space, quote: QuoteBehavior) Error!void { |
| 2779 | fn renderIdentifier(r: *Render, token_index: Ast.TokenIndex, space: Space, quote: QuoteBehavior) Error!void { |
| 2738 | 2780 | const tree = r.tree; |
| 2739 | 2781 | const token_tags = tree.tokens.items(.tag); |
| 2740 | 2782 | assert(token_tags[token_index] == .identifier); |
| ... | ... | @@ -2836,7 +2878,7 @@ fn renderIdentifier(r: Render, token_index: Ast.TokenIndex, space: Space, quote: |
| 2836 | 2878 | // Renders a @"" quoted identifier, normalizing escapes. |
| 2837 | 2879 | // Unnecessary escapes are un-escaped, and \u escapes are normalized to \x when they fit. |
| 2838 | 2880 | // If unquote is true, the @"" is removed and the result is a bare symbol whose validity is asserted. |
| 2839 | | fn renderQuotedIdentifier(r: Render, token_index: Ast.TokenIndex, space: Space, comptime unquote: bool) !void { |
| 2881 | fn renderQuotedIdentifier(r: *Render, token_index: Ast.TokenIndex, space: Space, comptime unquote: bool) !void { |
| 2840 | 2882 | const tree = r.tree; |
| 2841 | 2883 | const ais = r.ais; |
| 2842 | 2884 | const token_tags = tree.tokens.items(.tag); |
| ... | ... | @@ -2922,7 +2964,7 @@ fn hasMultilineString(tree: Ast, start_token: Ast.TokenIndex, end_token: Ast.Tok |
| 2922 | 2964 | |
| 2923 | 2965 | /// Assumes that start is the first byte past the previous token and |
| 2924 | 2966 | /// that end is the last byte before the next token. |
| 2925 | | fn renderComments(r: Render, start: usize, end: usize) Error!bool { |
| 2967 | fn renderComments(r: *Render, start: usize, end: usize) Error!bool { |
| 2926 | 2968 | const tree = r.tree; |
| 2927 | 2969 | const ais = r.ais; |
| 2928 | 2970 | |
| ... | ... | @@ -2985,12 +3027,12 @@ fn renderComments(r: Render, start: usize, end: usize) Error!bool { |
| 2985 | 3027 | return index != start; |
| 2986 | 3028 | } |
| 2987 | 3029 | |
| 2988 | | fn renderExtraNewline(r: Render, node: Ast.Node.Index) Error!void { |
| 3030 | fn renderExtraNewline(r: *Render, node: Ast.Node.Index) Error!void { |
| 2989 | 3031 | return renderExtraNewlineToken(r, r.tree.firstToken(node)); |
| 2990 | 3032 | } |
| 2991 | 3033 | |
| 2992 | 3034 | /// Check if there is an empty line immediately before the given token. If so, render it. |
| 2993 | | fn renderExtraNewlineToken(r: Render, token_index: Ast.TokenIndex) Error!void { |
| 3035 | fn renderExtraNewlineToken(r: *Render, token_index: Ast.TokenIndex) Error!void { |
| 2994 | 3036 | const tree = r.tree; |
| 2995 | 3037 | const ais = r.ais; |
| 2996 | 3038 | const token_starts = tree.tokens.items(.start); |
| ... | ... | @@ -3017,7 +3059,7 @@ fn renderExtraNewlineToken(r: Render, token_index: Ast.TokenIndex) Error!void { |
| 3017 | 3059 | |
| 3018 | 3060 | /// end_token is the token one past the last doc comment token. This function |
| 3019 | 3061 | /// searches backwards from there. |
| 3020 | | fn renderDocComments(r: Render, end_token: Ast.TokenIndex) Error!void { |
| 3062 | fn renderDocComments(r: *Render, end_token: Ast.TokenIndex) Error!void { |
| 3021 | 3063 | const tree = r.tree; |
| 3022 | 3064 | // Search backwards for the first doc comment. |
| 3023 | 3065 | const token_tags = tree.tokens.items(.tag); |
| ... | ... | @@ -3049,7 +3091,7 @@ fn renderDocComments(r: Render, end_token: Ast.TokenIndex) Error!void { |
| 3049 | 3091 | } |
| 3050 | 3092 | |
| 3051 | 3093 | /// start_token is first container doc comment token. |
| 3052 | | fn renderContainerDocComments(r: Render, start_token: Ast.TokenIndex) Error!void { |
| 3094 | fn renderContainerDocComments(r: *Render, start_token: Ast.TokenIndex) Error!void { |
| 3053 | 3095 | const tree = r.tree; |
| 3054 | 3096 | const token_tags = tree.tokens.items(.tag); |
| 3055 | 3097 | var tok = start_token; |
| ... | ... | @@ -3064,6 +3106,25 @@ fn renderContainerDocComments(r: Render, start_token: Ast.TokenIndex) Error!void |
| 3064 | 3106 | } |
| 3065 | 3107 | } |
| 3066 | 3108 | |
| 3109 | fn discardAllParams(r: *Render, fn_proto_node: Ast.Node.Index) Error!void { |
| 3110 | const tree = r.tree; |
| 3111 | const ais = r.ais; |
| 3112 | var buf: [1]Ast.Node.Index = undefined; |
| 3113 | const fn_proto = tree.fullFnProto(&buf, fn_proto_node).?; |
| 3114 | const token_tags = tree.tokens.items(.tag); |
| 3115 | const main_tokens = tree.nodes.items(.main_token); |
| 3116 | for (fn_proto.ast.params) |param_node| { |
| 3117 | const type_ident = main_tokens[param_node]; |
| 3118 | assert(token_tags[type_ident] == .identifier); |
| 3119 | const name_ident = type_ident - 2; |
| 3120 | assert(token_tags[name_ident] == .identifier); |
| 3121 | const w = ais.writer(); |
| 3122 | try w.writeAll("_ = "); |
| 3123 | try w.writeAll(tokenSliceForRender(r.tree, name_ident)); |
| 3124 | try w.writeAll(";\n"); |
| 3125 | } |
| 3126 | } |
| 3127 | |
| 3067 | 3128 | fn tokenSliceForRender(tree: Ast, token_index: Ast.TokenIndex) []const u8 { |
| 3068 | 3129 | var ret = tree.tokenSlice(token_index); |
| 3069 | 3130 | switch (tree.tokens.items(.tag)[token_index]) { |