| author | |
| committer | |
| log | ca0085c46dc5acb6ea93e35192b7b52294381d75 |
| tree | 980962cb2ba08744b3ce4299a91f11d576043204 |
| parent | 020724cfa0677bf42f48957d0ca7a474f6fe31e0 |
2 files changed, 137 insertions(+), 21 deletions(-)
std/zig/ast.zig+30-17| ... | ... | @@ -11,6 +11,7 @@ pub const Node = struct { |
| 11 | 11 | pub const Id = enum { |
| 12 | 12 | Root, |
| 13 | 13 | VarDecl, |
| 14 | ErrorSetDecl, | |
| 14 | 15 | ContainerDecl, |
| 15 | 16 | StructField, |
| 16 | 17 | UnionTag, |
| ... | ... | @@ -44,6 +45,7 @@ pub const Node = struct { |
| 44 | 45 | return switch (base.id) { |
| 45 | 46 | Id.Root => @fieldParentPtr(NodeRoot, "base", base).iterate(index), |
| 46 | 47 | Id.VarDecl => @fieldParentPtr(NodeVarDecl, "base", base).iterate(index), |
| 48 | Id.ErrorSetDecl => @fieldParentPtr(NodeErrorSetDecl, "base", base).iterate(index), | |
| 47 | 49 | Id.ContainerDecl => @fieldParentPtr(NodeContainerDecl, "base", base).iterate(index), |
| 48 | 50 | Id.StructField => @fieldParentPtr(NodeStructField, "base", base).iterate(index), |
| 49 | 51 | Id.UnionTag => @fieldParentPtr(NodeUnionTag, "base", base).iterate(index), |
| ... | ... | @@ -78,6 +80,7 @@ pub const Node = struct { |
| 78 | 80 | return switch (base.id) { |
| 79 | 81 | Id.Root => @fieldParentPtr(NodeRoot, "base", base).firstToken(), |
| 80 | 82 | Id.VarDecl => @fieldParentPtr(NodeVarDecl, "base", base).firstToken(), |
| 83 | Id.ErrorSetDecl => @fieldParentPtr(NodeErrorSetDecl, "base", base).firstToken(), | |
| 81 | 84 | Id.ContainerDecl => @fieldParentPtr(NodeContainerDecl, "base", base).firstToken(), |
| 82 | 85 | Id.StructField => @fieldParentPtr(NodeStructField, "base", base).firstToken(), |
| 83 | 86 | Id.UnionTag => @fieldParentPtr(NodeUnionTag, "base", base).firstToken(), |
| ... | ... | @@ -112,6 +115,7 @@ pub const Node = struct { |
| 112 | 115 | return switch (base.id) { |
| 113 | 116 | Id.Root => @fieldParentPtr(NodeRoot, "base", base).lastToken(), |
| 114 | 117 | Id.VarDecl => @fieldParentPtr(NodeVarDecl, "base", base).lastToken(), |
| 118 | Id.ErrorSetDecl => @fieldParentPtr(NodeErrorSetDecl, "base", base).lastToken(), | |
| 115 | 119 | Id.ContainerDecl => @fieldParentPtr(NodeContainerDecl, "base", base).lastToken(), |
| 116 | 120 | Id.StructField => @fieldParentPtr(NodeStructField, "base", base).lastToken(), |
| 117 | 121 | Id.UnionTag => @fieldParentPtr(NodeUnionTag, "base", base).lastToken(), |
| ... | ... | @@ -212,6 +216,30 @@ pub const NodeVarDecl = struct { |
| 212 | 216 | } |
| 213 | 217 | }; |
| 214 | 218 | |
| 219 | pub const NodeErrorSetDecl = struct { | |
| 220 | base: Node, | |
| 221 | error_token: Token, | |
| 222 | decls: ArrayList(&NodeIdentifier), | |
| 223 | rbrace_token: Token, | |
| 224 | ||
| 225 | pub fn iterate(self: &NodeErrorSetDecl, index: usize) ?&Node { | |
| 226 | var i = index; | |
| 227 | ||
| 228 | if (i < self.decls.len) return self.decls.at(i); | |
| 229 | i -= self.decls.len; | |
| 230 | ||
| 231 | return null; | |
| 232 | } | |
| 233 | ||
| 234 | pub fn firstToken(self: &NodeErrorSetDecl) Token { | |
| 235 | return self.error_token; | |
| 236 | } | |
| 237 | ||
| 238 | pub fn lastToken(self: &NodeErrorSetDecl) Token { | |
| 239 | return self.rbrace_token; | |
| 240 | } | |
| 241 | }; | |
| 242 | ||
| 215 | 243 | pub const NodeContainerDecl = struct { |
| 216 | 244 | base: Node, |
| 217 | 245 | ltoken: Token, |
| ... | ... | @@ -251,23 +279,8 @@ pub const NodeContainerDecl = struct { |
| 251 | 279 | InitArg.Enum => { } |
| 252 | 280 | } |
| 253 | 281 | |
| 254 | if (i < self.decls.len) return self.decls.at(i); | |
| 255 | i -= self.decls.len; | |
| 256 | ||
| 257 | switch (self.kind) { | |
| 258 | Kind.Struct => |fields| { | |
| 259 | if (i < fields.len) return fields.at(i); | |
| 260 | i -= fields.len; | |
| 261 | }, | |
| 262 | Kind.Enum => |tags| { | |
| 263 | if (i < tags.len) return tags.at(i); | |
| 264 | i -= tags.len; | |
| 265 | }, | |
| 266 | Kind.Union => |tags| { | |
| 267 | if (i < tags.len) return tags.at(i); | |
| 268 | i -= tags.len; | |
| 269 | }, | |
| 270 | } | |
| 282 | if (i < self.fields_and_decls.len) return self.fields_and_decls.at(i); | |
| 283 | i -= self.fields_and_decls.len; | |
| 271 | 284 | |
| 272 | 285 | return null; |
| 273 | 286 | } |
std/zig/parser.zig+107-4| ... | ... | @@ -685,11 +685,66 @@ pub const Parser = struct { |
| 685 | 685 | continue; |
| 686 | 686 | }, |
| 687 | 687 | Token.Id.Keyword_error => { |
| 688 | const node = try arena.create(ast.NodeErrorType); | |
| 689 | *node = ast.NodeErrorType { | |
| 690 | .base = self.initNode(ast.Node.Id.ErrorType), | |
| 691 | .token = token, | |
| 688 | const next = self.getNextToken(); | |
| 689 | ||
| 690 | if (next.id != Token.Id.LBrace) { | |
| 691 | self.putBackToken(next); | |
| 692 | const node = try arena.create(ast.NodeErrorType); | |
| 693 | *node = ast.NodeErrorType { | |
| 694 | .base = self.initNode(ast.Node.Id.ErrorType), | |
| 695 | .token = token, | |
| 696 | }; | |
| 697 | try stack.append(State { | |
| 698 | .Operand = &node.base | |
| 699 | }); | |
| 700 | try stack.append(State.AfterOperand); | |
| 701 | continue; | |
| 702 | } | |
| 703 | ||
| 704 | const node = try arena.create(ast.NodeErrorSetDecl); | |
| 705 | *node = ast.NodeErrorSetDecl { | |
| 706 | .base = self.initNode(ast.Node.Id.ErrorSetDecl), | |
| 707 | .error_token = token, | |
| 708 | .decls = ArrayList(&ast.NodeIdentifier).init(arena), | |
| 709 | .rbrace_token = undefined, | |
| 692 | 710 | }; |
| 711 | ||
| 712 | while (true) { | |
| 713 | const t = self.getNextToken(); | |
| 714 | switch (t.id) { | |
| 715 | Token.Id.RBrace => { | |
| 716 | node.rbrace_token = t; | |
| 717 | break; | |
| 718 | }, | |
| 719 | Token.Id.Identifier => { | |
| 720 | try node.decls.append( | |
| 721 | try self.createIdentifier(arena, t) | |
| 722 | ); | |
| 723 | }, | |
| 724 | else => { | |
| 725 | return self.parseError(token, "expected {} or {}, found {}", | |
| 726 | @tagName(Token.Id.RBrace), | |
| 727 | @tagName(Token.Id.Identifier), | |
| 728 | @tagName(token.id)); | |
| 729 | } | |
| 730 | } | |
| 731 | ||
| 732 | const t2 = self.getNextToken(); | |
| 733 | switch (t2.id) { | |
| 734 | Token.Id.RBrace => { | |
| 735 | node.rbrace_token = t; | |
| 736 | break; | |
| 737 | }, | |
| 738 | Token.Id.Comma => continue, | |
| 739 | else => { | |
| 740 | return self.parseError(token, "expected {} or {}, found {}", | |
| 741 | @tagName(Token.Id.RBrace), | |
| 742 | @tagName(Token.Id.Comma), | |
| 743 | @tagName(token.id)); | |
| 744 | } | |
| 745 | } | |
| 746 | } | |
| 747 | ||
| 693 | 748 | try stack.append(State { |
| 694 | 749 | .Operand = &node.base |
| 695 | 750 | }); |
| ... | ... | @@ -2115,6 +2170,42 @@ pub const Parser = struct { |
| 2115 | 2170 | }, |
| 2116 | 2171 | } |
| 2117 | 2172 | }, |
| 2173 | ast.Node.Id.ErrorSetDecl => { | |
| 2174 | const err_set_decl = @fieldParentPtr(ast.NodeErrorSetDecl, "base", base); | |
| 2175 | try stream.print("error "); | |
| 2176 | ||
| 2177 | try stack.append(RenderState { .Text = "}"}); | |
| 2178 | try stack.append(RenderState.PrintIndent); | |
| 2179 | try stack.append(RenderState { .Indent = indent }); | |
| 2180 | try stack.append(RenderState { .Text = "\n"}); | |
| 2181 | ||
| 2182 | const decls = err_set_decl.decls.toSliceConst(); | |
| 2183 | var i = decls.len; | |
| 2184 | while (i != 0) { | |
| 2185 | i -= 1; | |
| 2186 | const node = decls[i]; | |
| 2187 | try stack.append(RenderState { .Expression = &node.base}); | |
| 2188 | try stack.append(RenderState.PrintIndent); | |
| 2189 | try stack.append(RenderState { | |
| 2190 | .Text = blk: { | |
| 2191 | if (i != 0) { | |
| 2192 | const prev_node = decls[i - 1]; | |
| 2193 | const loc = self.tokenizer.getTokenLocation(prev_node.lastToken().end, node.firstToken()); | |
| 2194 | if (loc.line >= 2) { | |
| 2195 | break :blk "\n\n"; | |
| 2196 | } | |
| 2197 | } | |
| 2198 | break :blk "\n"; | |
| 2199 | }, | |
| 2200 | }); | |
| 2201 | ||
| 2202 | if (i != 0) { | |
| 2203 | try stack.append(RenderState { .Text = "," }); | |
| 2204 | } | |
| 2205 | } | |
| 2206 | try stack.append(RenderState { .Indent = indent + indent_delta}); | |
| 2207 | try stack.append(RenderState { .Text = "{"}); | |
| 2208 | }, | |
| 2118 | 2209 | ast.Node.Id.MultilineStringLiteral => { |
| 2119 | 2210 | const multiline_str_literal = @fieldParentPtr(ast.NodeMultilineStringLiteral, "base", base); |
| 2120 | 2211 | try stream.print("\n"); |
| ... | ... | @@ -2643,6 +2734,18 @@ test "zig fmt: union declaration" { |
| 2643 | 2734 | ); |
| 2644 | 2735 | } |
| 2645 | 2736 | |
| 2737 | test "zig fmt: error set declaration" { | |
| 2738 | try testCanonical( | |
| 2739 | \\const E = error { | |
| 2740 | \\ A, | |
| 2741 | \\ B, | |
| 2742 | \\ | |
| 2743 | \\ C | |
| 2744 | \\}; | |
| 2745 | \\ | |
| 2746 | ); | |
| 2747 | } | |
| 2748 | ||
| 2646 | 2749 | test "zig fmt: switch" { |
| 2647 | 2750 | try testCanonical( |
| 2648 | 2751 | \\test "switch" { |