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 {
1111 pub const Id = enum {
1212 Root,
1313 VarDecl,
14 ErrorSetDecl,
1415 ContainerDecl,
1516 StructField,
1617 UnionTag,
......@@ -44,6 +45,7 @@ pub const Node = struct {
4445 return switch (base.id) {
4546 Id.Root => @fieldParentPtr(NodeRoot, "base", base).iterate(index),
4647 Id.VarDecl => @fieldParentPtr(NodeVarDecl, "base", base).iterate(index),
48 Id.ErrorSetDecl => @fieldParentPtr(NodeErrorSetDecl, "base", base).iterate(index),
4749 Id.ContainerDecl => @fieldParentPtr(NodeContainerDecl, "base", base).iterate(index),
4850 Id.StructField => @fieldParentPtr(NodeStructField, "base", base).iterate(index),
4951 Id.UnionTag => @fieldParentPtr(NodeUnionTag, "base", base).iterate(index),
......@@ -78,6 +80,7 @@ pub const Node = struct {
7880 return switch (base.id) {
7981 Id.Root => @fieldParentPtr(NodeRoot, "base", base).firstToken(),
8082 Id.VarDecl => @fieldParentPtr(NodeVarDecl, "base", base).firstToken(),
83 Id.ErrorSetDecl => @fieldParentPtr(NodeErrorSetDecl, "base", base).firstToken(),
8184 Id.ContainerDecl => @fieldParentPtr(NodeContainerDecl, "base", base).firstToken(),
8285 Id.StructField => @fieldParentPtr(NodeStructField, "base", base).firstToken(),
8386 Id.UnionTag => @fieldParentPtr(NodeUnionTag, "base", base).firstToken(),
......@@ -112,6 +115,7 @@ pub const Node = struct {
112115 return switch (base.id) {
113116 Id.Root => @fieldParentPtr(NodeRoot, "base", base).lastToken(),
114117 Id.VarDecl => @fieldParentPtr(NodeVarDecl, "base", base).lastToken(),
118 Id.ErrorSetDecl => @fieldParentPtr(NodeErrorSetDecl, "base", base).lastToken(),
115119 Id.ContainerDecl => @fieldParentPtr(NodeContainerDecl, "base", base).lastToken(),
116120 Id.StructField => @fieldParentPtr(NodeStructField, "base", base).lastToken(),
117121 Id.UnionTag => @fieldParentPtr(NodeUnionTag, "base", base).lastToken(),
......@@ -212,6 +216,30 @@ pub const NodeVarDecl = struct {
212216 }
213217};
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
215243pub const NodeContainerDecl = struct {
216244 base: Node,
217245 ltoken: Token,
......@@ -251,23 +279,8 @@ pub const NodeContainerDecl = struct {
251279 InitArg.Enum => { }
252280 }
253281
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;
271284
272285 return null;
273286 }
std/zig/parser.zig+107-4
......@@ -685,11 +685,66 @@ pub const Parser = struct {
685685 continue;
686686 },
687687 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,
692710 };
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
693748 try stack.append(State {
694749 .Operand = &node.base
695750 });
......@@ -2115,6 +2170,42 @@ pub const Parser = struct {
21152170 },
21162171 }
21172172 },
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 },
21182209 ast.Node.Id.MultilineStringLiteral => {
21192210 const multiline_str_literal = @fieldParentPtr(ast.NodeMultilineStringLiteral, "base", base);
21202211 try stream.print("\n");
......@@ -2643,6 +2734,18 @@ test "zig fmt: union declaration" {
26432734 );
26442735}
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
26462749test "zig fmt: switch" {
26472750 try testCanonical(
26482751 \\test "switch" {