| ... | ... | @@ -741,8 +741,8 @@ fn renderExpression(r: *Render, node: Ast.Node.Index, space: Space) Error!void { |
| 741 | 741 | try renderToken(r, lbrace, .none); |
| 742 | 742 | try renderIdentifier(r, lbrace + 1, .none, .eagerly_unquote); // identifier |
| 743 | 743 | return renderToken(r, rbrace, space); |
| 744 | | } else if (tree.tokenTag(rbrace - 1) == .comma) { |
| 745 | | // There is a trailing comma so render each member on a new line. |
| 744 | } else if (!isOneLineErrorSetDecl(tree, lbrace, rbrace)) { |
| 745 | // Render each member on a new line. |
| 746 | 746 | try ais.pushIndent(.normal); |
| 747 | 747 | try renderToken(r, lbrace, .newline); |
| 748 | 748 | var i = lbrace + 1; |
| ... | ... | @@ -755,19 +755,17 @@ fn renderExpression(r: *Render, node: Ast.Node.Index, space: Space) Error!void { |
| 755 | 755 | try renderIdentifier(r, i, .comma, .eagerly_unquote); |
| 756 | 756 | ais.popSpace(); |
| 757 | 757 | }, |
| 758 | | .comma => {}, |
| 759 | 758 | else => unreachable, |
| 760 | 759 | } |
| 761 | 760 | } |
| 762 | 761 | ais.popIndent(); |
| 763 | 762 | return renderToken(r, rbrace, space); |
| 764 | 763 | } else { |
| 765 | | // There is no trailing comma so render everything on one line. |
| 764 | // Render each member on one line. |
| 766 | 765 | try renderToken(r, lbrace, .space); |
| 767 | 766 | var i = lbrace + 1; |
| 768 | 767 | while (i < rbrace) : (i += 1) { |
| 769 | 768 | switch (tree.tokenTag(i)) { |
| 770 | | .doc_comment => unreachable, // TODO |
| 771 | 769 | .identifier => try renderIdentifier(r, i, .comma_space, .eagerly_unquote), |
| 772 | 770 | .comma => {}, |
| 773 | 771 | else => unreachable, |
| ... | ... | @@ -2231,6 +2229,18 @@ fn renderArrayInit( |
| 2231 | 2229 | return renderToken(r, rbrace, space); // rbrace |
| 2232 | 2230 | } |
| 2233 | 2231 | |
| 2232 | fn isOneLineErrorSetDecl( |
| 2233 | tree: Ast, |
| 2234 | lbrace: Ast.TokenIndex, |
| 2235 | rbrace: Ast.TokenIndex, |
| 2236 | ) bool { |
| 2237 | // If there is a trailing comma, comment, or document comment, then render each |
| 2238 | // item on its own line. |
| 2239 | return tree.tokenTag(rbrace - 1) != .comma and |
| 2240 | !hasDocComment(tree, lbrace + 1, rbrace) and |
| 2241 | !hasComment(tree, lbrace, rbrace); |
| 2242 | } |
| 2243 | |
| 2234 | 2244 | fn renderContainerDecl( |
| 2235 | 2245 | r: *Render, |
| 2236 | 2246 | container_decl_node: Ast.Node.Index, |
| ... | ... | @@ -2885,6 +2895,16 @@ fn hasMultilineString(tree: Ast, start_token: Ast.TokenIndex, end_token: Ast.Tok |
| 2885 | 2895 | ) != null; |
| 2886 | 2896 | } |
| 2887 | 2897 | |
| 2898 | /// Returns true if there exists a doc comment between the start |
| 2899 | /// of token `start_token` and the start of token `end_token`. |
| 2900 | fn hasDocComment(tree: Ast, start_token: Ast.TokenIndex, end_token: Ast.TokenIndex) bool { |
| 2901 | return std.mem.indexOfScalar( |
| 2902 | Token.Tag, |
| 2903 | tree.tokens.items(.tag)[start_token..end_token], |
| 2904 | .doc_comment, |
| 2905 | ) != null; |
| 2906 | } |
| 2907 | |
| 2888 | 2908 | /// Assumes that start is the first byte past the previous token and |
| 2889 | 2909 | /// that end is the last byte before the next token. |
| 2890 | 2910 | fn renderComments(r: *Render, start: usize, end: usize) Error!bool { |