authorgravatar for jhc@dismail.deJimmi Holst Christensen <jhc@dismail.de> 2018-04-04 10:54:48+02:00
committergravatar for jhc@dismail.deJimmi Holst Christensen <jhc@dismail.de> 2018-04-04 10:54:48+02:00
logca0085c46dc5acb6ea93e35192b7b52294381d75
tree980962cb2ba08744b3ce4299a91f11d576043204
parent020724cfa0677bf42f48957d0ca7a474f6fe31e0

std.zig.parser now parses error set declarations


2 files changed, 137 insertions(+), 21 deletions(-)

std/zig/ast.zig+30-17
...@@ -11,6 +11,7 @@ pub const Node = struct {...@@ -11,6 +11,7 @@ pub const Node = struct {
11 pub const Id = enum {11 pub const Id = enum {
12 Root,12 Root,
13 VarDecl,13 VarDecl,
14 ErrorSetDecl,
14 ContainerDecl,15 ContainerDecl,
15 StructField,16 StructField,
16 UnionTag,17 UnionTag,
...@@ -44,6 +45,7 @@ pub const Node = struct {...@@ -44,6 +45,7 @@ pub const Node = struct {
44 return switch (base.id) {45 return switch (base.id) {
45 Id.Root => @fieldParentPtr(NodeRoot, "base", base).iterate(index),46 Id.Root => @fieldParentPtr(NodeRoot, "base", base).iterate(index),
46 Id.VarDecl => @fieldParentPtr(NodeVarDecl, "base", base).iterate(index),47 Id.VarDecl => @fieldParentPtr(NodeVarDecl, "base", base).iterate(index),
48 Id.ErrorSetDecl => @fieldParentPtr(NodeErrorSetDecl, "base", base).iterate(index),
47 Id.ContainerDecl => @fieldParentPtr(NodeContainerDecl, "base", base).iterate(index),49 Id.ContainerDecl => @fieldParentPtr(NodeContainerDecl, "base", base).iterate(index),
48 Id.StructField => @fieldParentPtr(NodeStructField, "base", base).iterate(index),50 Id.StructField => @fieldParentPtr(NodeStructField, "base", base).iterate(index),
49 Id.UnionTag => @fieldParentPtr(NodeUnionTag, "base", base).iterate(index),51 Id.UnionTag => @fieldParentPtr(NodeUnionTag, "base", base).iterate(index),
...@@ -78,6 +80,7 @@ pub const Node = struct {...@@ -78,6 +80,7 @@ pub const Node = struct {
78 return switch (base.id) {80 return switch (base.id) {
79 Id.Root => @fieldParentPtr(NodeRoot, "base", base).firstToken(),81 Id.Root => @fieldParentPtr(NodeRoot, "base", base).firstToken(),
80 Id.VarDecl => @fieldParentPtr(NodeVarDecl, "base", base).firstToken(),82 Id.VarDecl => @fieldParentPtr(NodeVarDecl, "base", base).firstToken(),
83 Id.ErrorSetDecl => @fieldParentPtr(NodeErrorSetDecl, "base", base).firstToken(),
81 Id.ContainerDecl => @fieldParentPtr(NodeContainerDecl, "base", base).firstToken(),84 Id.ContainerDecl => @fieldParentPtr(NodeContainerDecl, "base", base).firstToken(),
82 Id.StructField => @fieldParentPtr(NodeStructField, "base", base).firstToken(),85 Id.StructField => @fieldParentPtr(NodeStructField, "base", base).firstToken(),
83 Id.UnionTag => @fieldParentPtr(NodeUnionTag, "base", base).firstToken(),86 Id.UnionTag => @fieldParentPtr(NodeUnionTag, "base", base).firstToken(),
...@@ -112,6 +115,7 @@ pub const Node = struct {...@@ -112,6 +115,7 @@ pub const Node = struct {
112 return switch (base.id) {115 return switch (base.id) {
113 Id.Root => @fieldParentPtr(NodeRoot, "base", base).lastToken(),116 Id.Root => @fieldParentPtr(NodeRoot, "base", base).lastToken(),
114 Id.VarDecl => @fieldParentPtr(NodeVarDecl, "base", base).lastToken(),117 Id.VarDecl => @fieldParentPtr(NodeVarDecl, "base", base).lastToken(),
118 Id.ErrorSetDecl => @fieldParentPtr(NodeErrorSetDecl, "base", base).lastToken(),
115 Id.ContainerDecl => @fieldParentPtr(NodeContainerDecl, "base", base).lastToken(),119 Id.ContainerDecl => @fieldParentPtr(NodeContainerDecl, "base", base).lastToken(),
116 Id.StructField => @fieldParentPtr(NodeStructField, "base", base).lastToken(),120 Id.StructField => @fieldParentPtr(NodeStructField, "base", base).lastToken(),
117 Id.UnionTag => @fieldParentPtr(NodeUnionTag, "base", base).lastToken(),121 Id.UnionTag => @fieldParentPtr(NodeUnionTag, "base", base).lastToken(),
...@@ -212,6 +216,30 @@ pub const NodeVarDecl = struct {...@@ -212,6 +216,30 @@ pub const NodeVarDecl = struct {
212 }216 }
213};217};
214218
219pub 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
215pub const NodeContainerDecl = struct {243pub const NodeContainerDecl = struct {
216 base: Node,244 base: Node,
217 ltoken: Token,245 ltoken: Token,
...@@ -251,23 +279,8 @@ pub const NodeContainerDecl = struct {...@@ -251,23 +279,8 @@ pub const NodeContainerDecl = struct {
251 InitArg.Enum => { }279 InitArg.Enum => { }
252 }280 }
253281
254 if (i < self.decls.len) return self.decls.at(i);282 if (i < self.fields_and_decls.len) return self.fields_and_decls.at(i);
255 i -= self.decls.len;283 i -= self.fields_and_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 }
271284
272 return null;285 return null;
273 }286 }
std/zig/parser.zig+107-4
...@@ -685,11 +685,66 @@ pub const Parser = struct {...@@ -685,11 +685,66 @@ pub const Parser = struct {
685 continue;685 continue;
686 },686 },
687 Token.Id.Keyword_error => {687 Token.Id.Keyword_error => {
688 const node = try arena.create(ast.NodeErrorType);688 const next = self.getNextToken();
689 *node = ast.NodeErrorType {689
690 .base = self.initNode(ast.Node.Id.ErrorType),690 if (next.id != Token.Id.LBrace) {
691 .token = token,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 try stack.append(State {748 try stack.append(State {
694 .Operand = &node.base749 .Operand = &node.base
695 });750 });
...@@ -2115,6 +2170,42 @@ pub const Parser = struct {...@@ -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 ast.Node.Id.MultilineStringLiteral => {2209 ast.Node.Id.MultilineStringLiteral => {
2119 const multiline_str_literal = @fieldParentPtr(ast.NodeMultilineStringLiteral, "base", base);2210 const multiline_str_literal = @fieldParentPtr(ast.NodeMultilineStringLiteral, "base", base);
2120 try stream.print("\n");2211 try stream.print("\n");
...@@ -2643,6 +2734,18 @@ test "zig fmt: union declaration" {...@@ -2643,6 +2734,18 @@ test "zig fmt: union declaration" {
2643 );2734 );
2644}2735}
26452736
2737test "zig fmt: error set declaration" {
2738 try testCanonical(
2739 \\const E = error {
2740 \\ A,
2741 \\ B,
2742 \\
2743 \\ C
2744 \\};
2745 \\
2746 );
2747}
2748
2646test "zig fmt: switch" {2749test "zig fmt: switch" {
2647 try testCanonical(2750 try testCanonical(
2648 \\test "switch" {2751 \\test "switch" {