| ... | @@ -81,7 +81,7 @@ fn renderTopLevelDecl(allocator: &mem.Allocator, stream: var, tree: &ast.Tree, i | ... | @@ -81,7 +81,7 @@ fn renderTopLevelDecl(allocator: &mem.Allocator, stream: var, tree: &ast.Tree, i |
| 81 | } | 81 | } |
| 82 | try stream.print("{}: ", tree.tokenSlice(field.name_token)); | 82 | try stream.print("{}: ", tree.tokenSlice(field.name_token)); |
| 83 | try renderExpression(allocator, stream, tree, indent, field.type_expr); | 83 | try renderExpression(allocator, stream, tree, indent, field.type_expr); |
| 84 | try renderToken(tree, stream, field.lastToken() + 1, indent, true); | 84 | try renderToken(tree, stream, field.lastToken() + 1, indent, true, true); |
| 85 | }, | 85 | }, |
| 86 | ast.Node.Id.UnionTag => { | 86 | ast.Node.Id.UnionTag => { |
| 87 | const tag = @fieldParentPtr(ast.Node.UnionTag, "base", decl); | 87 | const tag = @fieldParentPtr(ast.Node.UnionTag, "base", decl); |
| ... | @@ -513,9 +513,9 @@ fn renderExpression(allocator: &mem.Allocator, stream: var, tree: &ast.Tree, ind | ... | @@ -513,9 +513,9 @@ fn renderExpression(allocator: &mem.Allocator, stream: var, tree: &ast.Tree, ind |
| 513 | ast.Node.Id.GroupedExpression => { | 513 | ast.Node.Id.GroupedExpression => { |
| 514 | const grouped_expr = @fieldParentPtr(ast.Node.GroupedExpression, "base", base); | 514 | const grouped_expr = @fieldParentPtr(ast.Node.GroupedExpression, "base", base); |
| 515 | | 515 | |
| 516 | try stream.write("("); | 516 | try renderToken(tree, stream, grouped_expr.lparen, indent, false, false); |
| 517 | try renderExpression(allocator, stream, tree, indent, grouped_expr.expr); | 517 | try renderExpression(allocator, stream, tree, indent, grouped_expr.expr); |
| 518 | try stream.write(")"); | 518 | try renderToken(tree, stream, grouped_expr.rparen, indent, false, false); |
| 519 | }, | 519 | }, |
| 520 | | 520 | |
| 521 | ast.Node.Id.FieldInitializer => { | 521 | ast.Node.Id.FieldInitializer => { |
| ... | @@ -527,7 +527,7 @@ fn renderExpression(allocator: &mem.Allocator, stream: var, tree: &ast.Tree, ind | ... | @@ -527,7 +527,7 @@ fn renderExpression(allocator: &mem.Allocator, stream: var, tree: &ast.Tree, ind |
| 527 | | 527 | |
| 528 | ast.Node.Id.IntegerLiteral => { | 528 | ast.Node.Id.IntegerLiteral => { |
| 529 | const integer_literal = @fieldParentPtr(ast.Node.IntegerLiteral, "base", base); | 529 | const integer_literal = @fieldParentPtr(ast.Node.IntegerLiteral, "base", base); |
| 530 | try stream.print("{}", tree.tokenSlice(integer_literal.token)); | 530 | try renderToken(tree, stream, integer_literal.token, indent, false, false); |
| 531 | }, | 531 | }, |
| 532 | ast.Node.Id.FloatLiteral => { | 532 | ast.Node.Id.FloatLiteral => { |
| 533 | const float_literal = @fieldParentPtr(ast.Node.FloatLiteral, "base", base); | 533 | const float_literal = @fieldParentPtr(ast.Node.FloatLiteral, "base", base); |
| ... | @@ -535,7 +535,7 @@ fn renderExpression(allocator: &mem.Allocator, stream: var, tree: &ast.Tree, ind | ... | @@ -535,7 +535,7 @@ fn renderExpression(allocator: &mem.Allocator, stream: var, tree: &ast.Tree, ind |
| 535 | }, | 535 | }, |
| 536 | ast.Node.Id.StringLiteral => { | 536 | ast.Node.Id.StringLiteral => { |
| 537 | const string_literal = @fieldParentPtr(ast.Node.StringLiteral, "base", base); | 537 | const string_literal = @fieldParentPtr(ast.Node.StringLiteral, "base", base); |
| 538 | try stream.print("{}", tree.tokenSlice(string_literal.token)); | 538 | try renderToken(tree, stream, string_literal.token, indent, false, false); |
| 539 | }, | 539 | }, |
| 540 | ast.Node.Id.CharLiteral => { | 540 | ast.Node.Id.CharLiteral => { |
| 541 | const char_literal = @fieldParentPtr(ast.Node.CharLiteral, "base", base); | 541 | const char_literal = @fieldParentPtr(ast.Node.CharLiteral, "base", base); |
| ... | @@ -840,9 +840,9 @@ fn renderExpression(allocator: &mem.Allocator, stream: var, tree: &ast.Tree, ind | ... | @@ -840,9 +840,9 @@ fn renderExpression(allocator: &mem.Allocator, stream: var, tree: &ast.Tree, ind |
| 840 | }, | 840 | }, |
| 841 | Token.Id.LineComment => { | 841 | Token.Id.LineComment => { |
| 842 | try stream.write(", "); | 842 | try stream.write(", "); |
| 843 | try renderToken(tree, stream, index, indent, true); | 843 | try renderToken(tree, stream, index, indent, true, true); |
| 844 | }, | 844 | }, |
| 845 | else => try renderToken(tree, stream, index, indent, true), | 845 | else => try renderToken(tree, stream, index, indent, true, true), |
| 846 | } | 846 | } |
| 847 | } | 847 | } |
| 848 | }, | 848 | }, |
| ... | @@ -971,7 +971,7 @@ fn renderExpression(allocator: &mem.Allocator, stream: var, tree: &ast.Tree, ind | ... | @@ -971,7 +971,7 @@ fn renderExpression(allocator: &mem.Allocator, stream: var, tree: &ast.Tree, ind |
| 971 | try stream.print("{} (", tree.tokenSlice(if_node.if_token)); | 971 | try stream.print("{} (", tree.tokenSlice(if_node.if_token)); |
| 972 | | 972 | |
| 973 | try renderExpression(allocator, stream, tree, indent, if_node.condition); | 973 | try renderExpression(allocator, stream, tree, indent, if_node.condition); |
| 974 | try renderToken(tree, stream, if_node.condition.lastToken() + 1, indent, false); | 974 | try renderToken(tree, stream, if_node.condition.lastToken() + 1, indent, false, true); |
| 975 | | 975 | |
| 976 | if (if_node.payload) |payload| { | 976 | if (if_node.payload) |payload| { |
| 977 | try renderExpression(allocator, stream, tree, indent, payload); | 977 | try renderExpression(allocator, stream, tree, indent, payload); |
| ... | @@ -1126,11 +1126,11 @@ fn renderExpression(allocator: &mem.Allocator, stream: var, tree: &ast.Tree, ind | ... | @@ -1126,11 +1126,11 @@ fn renderExpression(allocator: &mem.Allocator, stream: var, tree: &ast.Tree, ind |
| 1126 | | 1126 | |
| 1127 | fn renderVarDecl(allocator: &mem.Allocator, stream: var, tree: &ast.Tree, indent: usize, var_decl: &ast.Node.VarDecl) (@typeOf(stream).Child.Error || Error)!void { | 1127 | fn renderVarDecl(allocator: &mem.Allocator, stream: var, tree: &ast.Tree, indent: usize, var_decl: &ast.Node.VarDecl) (@typeOf(stream).Child.Error || Error)!void { |
| 1128 | if (var_decl.visib_token) |visib_token| { | 1128 | if (var_decl.visib_token) |visib_token| { |
| 1129 | try stream.print("{} ", tree.tokenSlice(visib_token)); | 1129 | try renderToken(tree, stream, visib_token, indent, false, true); |
| 1130 | } | 1130 | } |
| 1131 | | 1131 | |
| 1132 | if (var_decl.extern_export_token) |extern_export_token| { | 1132 | if (var_decl.extern_export_token) |extern_export_token| { |
| 1133 | try stream.print("{} ", tree.tokenSlice(extern_export_token)); | 1133 | try renderToken(tree, stream, extern_export_token, indent, false, true); |
| 1134 | | 1134 | |
| 1135 | if (var_decl.lib_name) |lib_name| { | 1135 | if (var_decl.lib_name) |lib_name| { |
| 1136 | try renderExpression(allocator, stream, tree, indent, lib_name); | 1136 | try renderExpression(allocator, stream, tree, indent, lib_name); |
| ... | @@ -1139,10 +1139,11 @@ fn renderVarDecl(allocator: &mem.Allocator, stream: var, tree: &ast.Tree, indent | ... | @@ -1139,10 +1139,11 @@ fn renderVarDecl(allocator: &mem.Allocator, stream: var, tree: &ast.Tree, indent |
| 1139 | } | 1139 | } |
| 1140 | | 1140 | |
| 1141 | if (var_decl.comptime_token) |comptime_token| { | 1141 | if (var_decl.comptime_token) |comptime_token| { |
| 1142 | try stream.print("{} ", tree.tokenSlice(comptime_token)); | 1142 | try renderToken(tree, stream, comptime_token, indent, false, true); |
| 1143 | } | 1143 | } |
| 1144 | | 1144 | |
| 1145 | try stream.print("{} {}", tree.tokenSlice(var_decl.mut_token), tree.tokenSlice(var_decl.name_token)); | 1145 | try renderToken(tree, stream, var_decl.mut_token, indent, false, true); |
| | 1146 | try renderToken(tree, stream, var_decl.name_token, indent, false, false); |
| 1146 | | 1147 | |
| 1147 | if (var_decl.type_node) |type_node| { | 1148 | if (var_decl.type_node) |type_node| { |
| 1148 | try stream.write(": "); | 1149 | try stream.write(": "); |
| ... | @@ -1161,14 +1162,14 @@ fn renderVarDecl(allocator: &mem.Allocator, stream: var, tree: &ast.Tree, indent | ... | @@ -1161,14 +1162,14 @@ fn renderVarDecl(allocator: &mem.Allocator, stream: var, tree: &ast.Tree, indent |
| 1161 | try renderExpression(allocator, stream, tree, indent, init_node); | 1162 | try renderExpression(allocator, stream, tree, indent, init_node); |
| 1162 | } | 1163 | } |
| 1163 | | 1164 | |
| 1164 | try renderToken(tree, stream, var_decl.semicolon_token, indent, true); | 1165 | try renderToken(tree, stream, var_decl.semicolon_token, indent, true, false); |
| 1165 | } | 1166 | } |
| 1166 | | 1167 | |
| 1167 | fn maybeRenderSemicolon(stream: var, tree: &ast.Tree, indent: usize, base: &ast.Node) (@typeOf(stream).Child.Error || Error)!void { | 1168 | fn maybeRenderSemicolon(stream: var, tree: &ast.Tree, indent: usize, base: &ast.Node) (@typeOf(stream).Child.Error || Error)!void { |
| 1168 | if (base.requireSemiColon()) { | 1169 | if (base.requireSemiColon()) { |
| 1169 | const semicolon_index = base.lastToken() + 1; | 1170 | const semicolon_index = base.lastToken() + 1; |
| 1170 | assert(tree.tokens.at(semicolon_index).id == Token.Id.Semicolon); | 1171 | assert(tree.tokens.at(semicolon_index).id == Token.Id.Semicolon); |
| 1171 | try renderToken(tree, stream, semicolon_index, indent, true); | 1172 | try renderToken(tree, stream, semicolon_index, indent, true, true); |
| 1172 | } | 1173 | } |
| 1173 | } | 1174 | } |
| 1174 | | 1175 | |
| ... | @@ -1203,7 +1204,7 @@ fn renderStatement(allocator: &mem.Allocator, stream: var, tree: &ast.Tree, inde | ... | @@ -1203,7 +1204,7 @@ fn renderStatement(allocator: &mem.Allocator, stream: var, tree: &ast.Tree, inde |
| 1203 | } | 1204 | } |
| 1204 | } | 1205 | } |
| 1205 | | 1206 | |
| 1206 | fn renderToken(tree: &ast.Tree, stream: var, token_index: ast.TokenIndex, indent: usize, line_break: bool) (@typeOf(stream).Child.Error || Error)!void { | 1207 | fn renderToken(tree: &ast.Tree, stream: var, token_index: ast.TokenIndex, indent: usize, line_break: bool, space: bool) (@typeOf(stream).Child.Error || Error)!void { |
| 1207 | const token = tree.tokens.at(token_index); | 1208 | const token = tree.tokens.at(token_index); |
| 1208 | try stream.write(tree.tokenSlicePtr(token)); | 1209 | try stream.write(tree.tokenSlicePtr(token)); |
| 1209 | | 1210 | |
| ... | @@ -1214,13 +1215,19 @@ fn renderToken(tree: &ast.Tree, stream: var, token_index: ast.TokenIndex, indent | ... | @@ -1214,13 +1215,19 @@ fn renderToken(tree: &ast.Tree, stream: var, token_index: ast.TokenIndex, indent |
| 1214 | try stream.print(" {}", tree.tokenSlicePtr(next_token)); | 1215 | try stream.print(" {}", tree.tokenSlicePtr(next_token)); |
| 1215 | if (!line_break) { | 1216 | if (!line_break) { |
| 1216 | try stream.write("\n"); | 1217 | try stream.write("\n"); |
| 1217 | try stream.writeByteNTimes(' ', indent + indent_delta); | 1218 | |
| | 1219 | const after_comment_token = tree.tokens.at(token_index + 2); |
| | 1220 | const next_line_indent = switch (after_comment_token.id) { |
| | 1221 | Token.Id.RParen, Token.Id.RBrace, Token.Id.RBracket => indent, |
| | 1222 | else => indent + indent_delta, |
| | 1223 | }; |
| | 1224 | try stream.writeByteNTimes(' ', next_line_indent); |
| 1218 | return; | 1225 | return; |
| 1219 | } | 1226 | } |
| 1220 | } | 1227 | } |
| 1221 | } | 1228 | } |
| 1222 | | 1229 | |
| 1223 | if (!line_break) { | 1230 | if (!line_break and space) { |
| 1224 | try stream.writeByte(' '); | 1231 | try stream.writeByte(' '); |
| 1225 | } | 1232 | } |
| 1226 | } | 1233 | } |