| ... | ... | @@ -40,7 +40,7 @@ pub fn renderTree(buffer: *std.ArrayList(u8), tree: Ast) Error!void { |
| 40 | 40 | /// Render all members in the given slice, keeping empty lines where appropriate |
| 41 | 41 | fn renderMembers(gpa: Allocator, ais: *Ais, tree: Ast, members: []const Ast.Node.Index) Error!void { |
| 42 | 42 | if (members.len == 0) return; |
| 43 | | var any_non_tuple_like_fields = false; |
| 43 | var is_tuple = true; |
| 44 | 44 | for (members) |member| { |
| 45 | 45 | const tuple_like = switch (tree.nodes.items(.tag)[member]) { |
| 46 | 46 | .container_field_init => tree.containerFieldInit(member).ast.tuple_like, |
| ... | ... | @@ -49,14 +49,14 @@ fn renderMembers(gpa: Allocator, ais: *Ais, tree: Ast, members: []const Ast.Node |
| 49 | 49 | else => continue, |
| 50 | 50 | }; |
| 51 | 51 | if (!tuple_like) { |
| 52 | | any_non_tuple_like_fields = true; |
| 52 | is_tuple = false; |
| 53 | 53 | break; |
| 54 | 54 | } |
| 55 | 55 | } |
| 56 | | try renderMember(gpa, ais, tree, members[0], any_non_tuple_like_fields, .newline); |
| 56 | try renderMember(gpa, ais, tree, members[0], is_tuple, .newline); |
| 57 | 57 | for (members[1..]) |member| { |
| 58 | 58 | try renderExtraNewline(ais, tree, member); |
| 59 | | try renderMember(gpa, ais, tree, member, any_non_tuple_like_fields, .newline); |
| 59 | try renderMember(gpa, ais, tree, member, is_tuple, .newline); |
| 60 | 60 | } |
| 61 | 61 | } |
| 62 | 62 | |
| ... | ... | @@ -65,7 +65,7 @@ fn renderMember( |
| 65 | 65 | ais: *Ais, |
| 66 | 66 | tree: Ast, |
| 67 | 67 | decl: Ast.Node.Index, |
| 68 | | any_non_tuple_like_fields: bool, |
| 68 | is_tuple: bool, |
| 69 | 69 | space: Space, |
| 70 | 70 | ) Error!void { |
| 71 | 71 | const token_tags = tree.tokens.items(.tag); |
| ... | ... | @@ -181,9 +181,9 @@ fn renderMember( |
| 181 | 181 | try renderExpression(gpa, ais, tree, datas[decl].rhs, space); |
| 182 | 182 | }, |
| 183 | 183 | |
| 184 | | .container_field_init => return renderContainerField(gpa, ais, tree, tree.containerFieldInit(decl), any_non_tuple_like_fields, space), |
| 185 | | .container_field_align => return renderContainerField(gpa, ais, tree, tree.containerFieldAlign(decl), any_non_tuple_like_fields, space), |
| 186 | | .container_field => return renderContainerField(gpa, ais, tree, tree.containerField(decl), any_non_tuple_like_fields, space), |
| 184 | .container_field_init => return renderContainerField(gpa, ais, tree, tree.containerFieldInit(decl), is_tuple, space), |
| 185 | .container_field_align => return renderContainerField(gpa, ais, tree, tree.containerFieldAlign(decl), is_tuple, space), |
| 186 | .container_field => return renderContainerField(gpa, ais, tree, tree.containerField(decl), is_tuple, space), |
| 187 | 187 | .@"comptime" => return renderExpression(gpa, ais, tree, decl, space), |
| 188 | 188 | |
| 189 | 189 | .root => unreachable, |
| ... | ... | @@ -1179,18 +1179,11 @@ fn renderContainerField( |
| 1179 | 1179 | ais: *Ais, |
| 1180 | 1180 | tree: Ast, |
| 1181 | 1181 | field_param: Ast.full.ContainerField, |
| 1182 | | any_non_tuple_like_fields: bool, |
| 1182 | is_tuple: bool, |
| 1183 | 1183 | space: Space, |
| 1184 | 1184 | ) Error!void { |
| 1185 | 1185 | var field = field_param; |
| 1186 | | if (field.ast.tuple_like and any_non_tuple_like_fields and field.ast.type_expr != 0 |
| 1187 | | and tree.nodes.items(.tag)[field.ast.type_expr] == .identifier |
| 1188 | | ) { |
| 1189 | | const ident = tree.nodes.items(.main_token)[field.ast.type_expr]; |
| 1190 | | field.ast.tuple_like = false; |
| 1191 | | field.ast.main_token = ident; |
| 1192 | | field.ast.type_expr = 0; |
| 1193 | | } |
| 1186 | if (!is_tuple) field.convertToNonTupleLike(tree.nodes); |
| 1194 | 1187 | |
| 1195 | 1188 | if (field.comptime_token) |t| { |
| 1196 | 1189 | try renderToken(ais, tree, t, .space); // comptime |
| ... | ... | @@ -1935,8 +1928,8 @@ fn renderContainerDecl( |
| 1935 | 1928 | try renderToken(ais, tree, layout_token, .space); |
| 1936 | 1929 | } |
| 1937 | 1930 | |
| 1938 | | var any_non_tuple_like_fields = token_tags[container_decl.ast.main_token] != .keyword_struct; |
| 1939 | | if (!any_non_tuple_like_fields) for (container_decl.ast.members) |member| { |
| 1931 | var is_tuple = token_tags[container_decl.ast.main_token] == .keyword_struct; |
| 1932 | if (is_tuple) for (container_decl.ast.members) |member| { |
| 1940 | 1933 | const tuple_like = switch (tree.nodes.items(.tag)[member]) { |
| 1941 | 1934 | .container_field_init => tree.containerFieldInit(member).ast.tuple_like, |
| 1942 | 1935 | .container_field_align => tree.containerFieldAlign(member).ast.tuple_like, |
| ... | ... | @@ -1944,7 +1937,7 @@ fn renderContainerDecl( |
| 1944 | 1937 | else => continue, |
| 1945 | 1938 | }; |
| 1946 | 1939 | if (!tuple_like) { |
| 1947 | | any_non_tuple_like_fields = true; |
| 1940 | is_tuple = false; |
| 1948 | 1941 | break; |
| 1949 | 1942 | } |
| 1950 | 1943 | }; |
| ... | ... | @@ -2015,7 +2008,7 @@ fn renderContainerDecl( |
| 2015 | 2008 | // Print all the declarations on the same line. |
| 2016 | 2009 | try renderToken(ais, tree, lbrace, .space); // lbrace |
| 2017 | 2010 | for (container_decl.ast.members) |member| { |
| 2018 | | try renderMember(gpa, ais, tree, member, any_non_tuple_like_fields, .space); |
| 2011 | try renderMember(gpa, ais, tree, member, is_tuple, .space); |
| 2019 | 2012 | } |
| 2020 | 2013 | return renderToken(ais, tree, rbrace, space); // rbrace |
| 2021 | 2014 | } |
| ... | ... | @@ -2033,9 +2026,9 @@ fn renderContainerDecl( |
| 2033 | 2026 | .container_field_init, |
| 2034 | 2027 | .container_field_align, |
| 2035 | 2028 | .container_field, |
| 2036 | | => try renderMember(gpa, ais, tree, member, any_non_tuple_like_fields, .comma), |
| 2029 | => try renderMember(gpa, ais, tree, member, is_tuple, .comma), |
| 2037 | 2030 | |
| 2038 | | else => try renderMember(gpa, ais, tree, member, any_non_tuple_like_fields, .newline), |
| 2031 | else => try renderMember(gpa, ais, tree, member, is_tuple, .newline), |
| 2039 | 2032 | } |
| 2040 | 2033 | } |
| 2041 | 2034 | ais.popIndent(); |