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