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