| ... | ... | @@ -110,22 +110,29 @@ fn renderTopLevelDecl(allocator: &mem.Allocator, stream: var, tree: &ast.Tree, i |
| 110 | 110 | |
| 111 | 111 | try renderDocComments(tree, stream, tag, indent); |
| 112 | 112 | |
| 113 | | const name_space = if (tag.type_expr == null and tag.value_expr != null) Space.Space else Space.None; |
| 114 | | try renderToken(tree, stream, tag.name_token, indent, name_space); // name |
| 113 | if (tag.type_expr == null and tag.value_expr == null) { |
| 114 | return renderTokenAndTrailingComma(tree, stream, tag.name_token, indent, Space.Newline); // name, |
| 115 | } |
| 116 | |
| 117 | if (tag.type_expr == null) { |
| 118 | try renderToken(tree, stream, tag.name_token, indent, Space.Space); // name |
| 119 | } else { |
| 120 | try renderToken(tree, stream, tag.name_token, indent, Space.None); // name |
| 121 | } |
| 115 | 122 | |
| 116 | 123 | if (tag.type_expr) |type_expr| { |
| 117 | 124 | try renderToken(tree, stream, tree.nextToken(tag.name_token), indent, Space.Space); // : |
| 118 | 125 | |
| 119 | | const after_type_space = if (tag.value_expr == null) Space.None else Space.Space; |
| 120 | | try renderExpression(allocator, stream, tree, indent, type_expr, after_type_space); |
| 121 | | } |
| 122 | | |
| 123 | | if (tag.value_expr) |value_expr| { |
| 124 | | try renderToken(tree, stream, tree.prevToken(value_expr.firstToken()), indent, Space.Space); // = |
| 125 | | try renderExpression(allocator, stream, tree, indent, value_expr, Space.None); |
| 126 | if (tag.value_expr == null) { |
| 127 | return renderTrailingComma(allocator, stream, tree, indent, type_expr, Space.Newline); // type, |
| 128 | } else { |
| 129 | try renderExpression(allocator, stream, tree, indent, type_expr, Space.Space); // type |
| 130 | } |
| 126 | 131 | } |
| 127 | 132 | |
| 128 | | try renderToken(tree, stream, tree.nextToken(decl.lastToken()), indent, Space.Newline); // , |
| 133 | const value_expr = ??tag.value_expr; |
| 134 | try renderToken(tree, stream, tree.prevToken(value_expr.firstToken()), indent, Space.Space); // = |
| 135 | try renderTrailingComma(allocator, stream, tree, indent, value_expr, Space.Newline); // value, |
| 129 | 136 | }, |
| 130 | 137 | |
| 131 | 138 | ast.Node.Id.EnumTag => { |
| ... | ... | @@ -133,15 +140,14 @@ fn renderTopLevelDecl(allocator: &mem.Allocator, stream: var, tree: &ast.Tree, i |
| 133 | 140 | |
| 134 | 141 | try renderDocComments(tree, stream, tag, indent); |
| 135 | 142 | |
| 136 | | const after_name_space = if (tag.value == null) Space.None else Space.Space; |
| 137 | | try renderToken(tree, stream, tag.name_token, indent, after_name_space); // name |
| 138 | | |
| 139 | 143 | if (tag.value) |value| { |
| 144 | try renderToken(tree, stream, tag.name_token, indent, Space.Space); // name |
| 145 | |
| 140 | 146 | try renderToken(tree, stream, tree.nextToken(tag.name_token), indent, Space.Space); // = |
| 141 | | try renderExpression(allocator, stream, tree, indent, value, Space.None); |
| 147 | try renderTrailingComma(allocator, stream, tree, indent, value, Space.Newline); |
| 148 | } else { |
| 149 | try renderTokenAndTrailingComma(tree, stream, tag.name_token, indent, Space.Newline); // name |
| 142 | 150 | } |
| 143 | | |
| 144 | | try renderToken(tree, stream, tree.nextToken(decl.lastToken()), indent, Space.Newline); // , |
| 145 | 151 | }, |
| 146 | 152 | |
| 147 | 153 | ast.Node.Id.Comptime => { |
| ... | ... | @@ -1584,7 +1590,6 @@ const Space = enum { |
| 1584 | 1590 | NoNewline, |
| 1585 | 1591 | NoIndent, |
| 1586 | 1592 | NoComment, |
| 1587 | | IgnoreEmptyComment, |
| 1588 | 1593 | }; |
| 1589 | 1594 | |
| 1590 | 1595 | fn renderToken(tree: &ast.Tree, stream: var, token_index: ast.TokenIndex, indent: usize, space: Space) (@typeOf(stream).Child.Error || Error)!void { |
| ... | ... | @@ -1604,7 +1609,7 @@ fn renderToken(tree: &ast.Tree, stream: var, token_index: ast.TokenIndex, indent |
| 1604 | 1609 | return stream.write("\n"); |
| 1605 | 1610 | } |
| 1606 | 1611 | }, |
| 1607 | | Space.Space, Space.IgnoreEmptyComment => return stream.writeByte(' '), |
| 1612 | Space.Space => return stream.writeByte(' '), |
| 1608 | 1613 | Space.NoComment => unreachable, |
| 1609 | 1614 | } |
| 1610 | 1615 | } |
| ... | ... | @@ -1612,7 +1617,6 @@ fn renderToken(tree: &ast.Tree, stream: var, token_index: ast.TokenIndex, indent |
| 1612 | 1617 | const comment_is_empty = mem.trimRight(u8, tree.tokenSlicePtr(next_token), " ").len == 2; |
| 1613 | 1618 | if (comment_is_empty) { |
| 1614 | 1619 | switch (space) { |
| 1615 | | Space.IgnoreEmptyComment => return stream.writeByte(' '), |
| 1616 | 1620 | Space.Newline => return stream.writeByte('\n'), |
| 1617 | 1621 | else => {}, |
| 1618 | 1622 | } |
| ... | ... | @@ -1644,7 +1648,7 @@ fn renderToken(tree: &ast.Tree, stream: var, token_index: ast.TokenIndex, indent |
| 1644 | 1648 | } |
| 1645 | 1649 | }, |
| 1646 | 1650 | Space.NoNewline => {}, |
| 1647 | | Space.NoComment, Space.IgnoreEmptyComment => unreachable, |
| 1651 | Space.NoComment => unreachable, |
| 1648 | 1652 | } |
| 1649 | 1653 | return; |
| 1650 | 1654 | } |
| ... | ... | @@ -1681,7 +1685,7 @@ fn renderToken(tree: &ast.Tree, stream: var, token_index: ast.TokenIndex, indent |
| 1681 | 1685 | try stream.writeByteNTimes(' ', next_line_indent); |
| 1682 | 1686 | }, |
| 1683 | 1687 | Space.NoNewline => {}, |
| 1684 | | Space.NoComment, Space.IgnoreEmptyComment => unreachable, |
| 1688 | Space.NoComment => unreachable, |
| 1685 | 1689 | } |
| 1686 | 1690 | return; |
| 1687 | 1691 | } |
| ... | ... | @@ -1720,27 +1724,22 @@ fn renderTrailingComma(allocator: &mem.Allocator, stream: var, tree: &ast.Tree, |
| 1720 | 1724 | } |
| 1721 | 1725 | } |
| 1722 | 1726 | |
| 1723 | | fn renderTrailingCommaAndEmptyComment(allocator: &mem.Allocator, stream: var, tree: &ast.Tree, indent: usize, base: &ast.Node) (@typeOf(stream).Child.Error || Error)!void |
| 1724 | | { |
| 1725 | | const end_token = base.lastToken() + 1; |
| 1727 | fn renderTokenAndTrailingComma(tree: &ast.Tree, stream: var, token_index: ast.TokenIndex, indent: usize, space: Space) (@typeOf(stream).Child.Error || Error)!void { |
| 1728 | const end_token = token_index + 1; |
| 1726 | 1729 | switch (tree.tokens.at(end_token).id) { |
| 1727 | 1730 | Token.Id.Comma => { |
| 1728 | | try renderExpression(allocator, stream, tree, indent, base, Space.None); |
| 1729 | | try renderToken(tree, stream, end_token, indent, Space.Space); // , |
| 1730 | | |
| 1731 | | const next_token = tree.tokens.at(end_token + 1); |
| 1732 | | if (next_token.id != Token.Id.LineComment) { |
| 1733 | | try stream.print("//\n"); |
| 1734 | | } |
| 1731 | try renderToken(tree, stream, token_index, indent, Space.None); |
| 1732 | try renderToken(tree, stream, end_token, indent, space); // , |
| 1735 | 1733 | }, |
| 1736 | 1734 | Token.Id.LineComment => { |
| 1737 | | try renderExpression(allocator, stream, tree, indent, base, Space.NoComment); |
| 1735 | try renderToken(tree, stream, token_index, indent, Space.NoComment); |
| 1738 | 1736 | try stream.write(", "); |
| 1739 | | try renderToken(tree, stream, end_token, indent, Space.Newline); |
| 1737 | try renderToken(tree, stream, end_token, indent, space); |
| 1740 | 1738 | }, |
| 1741 | 1739 | else => { |
| 1742 | | try renderExpression(allocator, stream, tree, indent, base, Space.None); |
| 1743 | | try stream.write(", //\n"); |
| 1740 | try renderToken(tree, stream, token_index, indent, Space.None); |
| 1741 | try stream.write(",\n"); |
| 1742 | assert(space == Space.Newline); |
| 1744 | 1743 | }, |
| 1745 | 1744 | } |
| 1746 | 1745 | } |