authorgravatar for jhc@dismail.deJimmi Holst Christensen <jhc@dismail.de> 2018-04-10 15:16:31+02:00
committergravatar for jhc@dismail.deJimmi Holst Christensen <jhc@dismail.de> 2018-04-10 15:16:31+02:00
logdb9a9f3a6c248e74953d9f7cbf6bedc78e3c23ff
treef5ac38593550a832389c2f20b8a2ddd165cf1ce1
parentaa09e7b63995639084d25329954b1972a72ad12d

std.zig.parser now parses the `var` type

* I parse it as a type in all contexts. This is not how the C++ compiler does it, but I think typechecking should catch this

2 files changed, 42 insertions(+), 11 deletions(-)

std/zig/ast.zig+21-2
...@@ -55,6 +55,7 @@ pub const Node = struct {...@@ -55,6 +55,7 @@ pub const Node = struct {
55 AsmOutput,55 AsmOutput,
56 Unreachable,56 Unreachable,
57 ErrorType,57 ErrorType,
58 VarType,
58 BuiltinCall,59 BuiltinCall,
59 LineComment,60 LineComment,
60 TestDecl,61 TestDecl,
...@@ -108,6 +109,7 @@ pub const Node = struct {...@@ -108,6 +109,7 @@ pub const Node = struct {
108 Id.AsmOutput => @fieldParentPtr(NodeAsmOutput, "base", base).iterate(index),109 Id.AsmOutput => @fieldParentPtr(NodeAsmOutput, "base", base).iterate(index),
109 Id.Unreachable => @fieldParentPtr(NodeUnreachable, "base", base).iterate(index),110 Id.Unreachable => @fieldParentPtr(NodeUnreachable, "base", base).iterate(index),
110 Id.ErrorType => @fieldParentPtr(NodeErrorType, "base", base).iterate(index),111 Id.ErrorType => @fieldParentPtr(NodeErrorType, "base", base).iterate(index),
112 Id.VarType => @fieldParentPtr(NodeVarType, "base", base).iterate(index),
111 Id.BuiltinCall => @fieldParentPtr(NodeBuiltinCall, "base", base).iterate(index),113 Id.BuiltinCall => @fieldParentPtr(NodeBuiltinCall, "base", base).iterate(index),
112 Id.LineComment => @fieldParentPtr(NodeLineComment, "base", base).iterate(index),114 Id.LineComment => @fieldParentPtr(NodeLineComment, "base", base).iterate(index),
113 Id.TestDecl => @fieldParentPtr(NodeTestDecl, "base", base).iterate(index),115 Id.TestDecl => @fieldParentPtr(NodeTestDecl, "base", base).iterate(index),
...@@ -162,6 +164,7 @@ pub const Node = struct {...@@ -162,6 +164,7 @@ pub const Node = struct {
162 Id.AsmInput => @fieldParentPtr(NodeAsmInput, "base", base).firstToken(),164 Id.AsmInput => @fieldParentPtr(NodeAsmInput, "base", base).firstToken(),
163 Id.AsmOutput => @fieldParentPtr(NodeAsmOutput, "base", base).firstToken(),165 Id.AsmOutput => @fieldParentPtr(NodeAsmOutput, "base", base).firstToken(),
164 Id.ErrorType => @fieldParentPtr(NodeErrorType, "base", base).firstToken(),166 Id.ErrorType => @fieldParentPtr(NodeErrorType, "base", base).firstToken(),
167 Id.VarType => @fieldParentPtr(NodeVarType, "base", base).firstToken(),
165 Id.BuiltinCall => @fieldParentPtr(NodeBuiltinCall, "base", base).firstToken(),168 Id.BuiltinCall => @fieldParentPtr(NodeBuiltinCall, "base", base).firstToken(),
166 Id.LineComment => @fieldParentPtr(NodeLineComment, "base", base).firstToken(),169 Id.LineComment => @fieldParentPtr(NodeLineComment, "base", base).firstToken(),
167 Id.TestDecl => @fieldParentPtr(NodeTestDecl, "base", base).firstToken(),170 Id.TestDecl => @fieldParentPtr(NodeTestDecl, "base", base).firstToken(),
...@@ -216,6 +219,7 @@ pub const Node = struct {...@@ -216,6 +219,7 @@ pub const Node = struct {
216 Id.AsmOutput => @fieldParentPtr(NodeAsmOutput, "base", base).lastToken(),219 Id.AsmOutput => @fieldParentPtr(NodeAsmOutput, "base", base).lastToken(),
217 Id.Unreachable => @fieldParentPtr(NodeUnreachable, "base", base).lastToken(),220 Id.Unreachable => @fieldParentPtr(NodeUnreachable, "base", base).lastToken(),
218 Id.ErrorType => @fieldParentPtr(NodeErrorType, "base", base).lastToken(),221 Id.ErrorType => @fieldParentPtr(NodeErrorType, "base", base).lastToken(),
222 Id.VarType => @fieldParentPtr(NodeVarType, "base", base).lastToken(),
219 Id.BuiltinCall => @fieldParentPtr(NodeBuiltinCall, "base", base).lastToken(),223 Id.BuiltinCall => @fieldParentPtr(NodeBuiltinCall, "base", base).lastToken(),
220 Id.LineComment => @fieldParentPtr(NodeLineComment, "base", base).lastToken(),224 Id.LineComment => @fieldParentPtr(NodeLineComment, "base", base).lastToken(),
221 Id.TestDecl => @fieldParentPtr(NodeTestDecl, "base", base).lastToken(),225 Id.TestDecl => @fieldParentPtr(NodeTestDecl, "base", base).lastToken(),
...@@ -541,7 +545,6 @@ pub const NodeFnProto = struct {...@@ -541,7 +545,6 @@ pub const NodeFnProto = struct {
541545
542 pub const ReturnType = union(enum) {546 pub const ReturnType = union(enum) {
543 Explicit: &Node,547 Explicit: &Node,
544 Infer: Token,
545 InferErrorSet: &Node,548 InferErrorSet: &Node,
546 };549 };
547550
...@@ -597,7 +600,6 @@ pub const NodeFnProto = struct {...@@ -597,7 +600,6 @@ pub const NodeFnProto = struct {
597 // TODO allow this and next prong to share bodies since the types are the same600 // TODO allow this and next prong to share bodies since the types are the same
598 ReturnType.Explicit => |node| return node.lastToken(),601 ReturnType.Explicit => |node| return node.lastToken(),
599 ReturnType.InferErrorSet => |node| return node.lastToken(),602 ReturnType.InferErrorSet => |node| return node.lastToken(),
600 ReturnType.Infer => |token| return token,
601 }603 }
602 }604 }
603};605};
...@@ -1788,6 +1790,23 @@ pub const NodeErrorType = struct {...@@ -1788,6 +1790,23 @@ pub const NodeErrorType = struct {
1788 }1790 }
1789};1791};
17901792
1793pub const NodeVarType = struct {
1794 base: Node,
1795 token: Token,
1796
1797 pub fn iterate(self: &NodeVarType, index: usize) ?&Node {
1798 return null;
1799 }
1800
1801 pub fn firstToken(self: &NodeVarType) Token {
1802 return self.token;
1803 }
1804
1805 pub fn lastToken(self: &NodeVarType) Token {
1806 return self.token;
1807 }
1808};
1809
1791pub const NodeLineComment = struct {1810pub const NodeLineComment = struct {
1792 base: Node,1811 base: Node,
1793 lines: ArrayList(Token),1812 lines: ArrayList(Token),
std/zig/parser.zig+21-9
...@@ -1437,6 +1437,14 @@ pub const Parser = struct {...@@ -1437,6 +1437,14 @@ pub const Parser = struct {
1437 dest_ptr.store(&node.base);1437 dest_ptr.store(&node.base);
1438 continue;1438 continue;
1439 },1439 },
1440 Token.Id.Keyword_var => {
1441 const node = try arena.create(ast.NodeVarType);
1442 *node = ast.NodeVarType {
1443 .base = self.initNode(ast.Node.Id.VarType),
1444 .token = token,
1445 };
1446 dest_ptr.store(&node.base);
1447 },
1440 Token.Id.Keyword_unreachable => {1448 Token.Id.Keyword_unreachable => {
1441 const node = try arena.create(ast.NodeUnreachable);1449 const node = try arena.create(ast.NodeUnreachable);
1442 *node = ast.NodeUnreachable {1450 *node = ast.NodeUnreachable {
...@@ -2192,9 +2200,6 @@ pub const Parser = struct {...@@ -2192,9 +2200,6 @@ pub const Parser = struct {
2192 State.FnProtoReturnType => |fn_proto| {2200 State.FnProtoReturnType => |fn_proto| {
2193 const token = self.getNextToken();2201 const token = self.getNextToken();
2194 switch (token.id) {2202 switch (token.id) {
2195 Token.Id.Keyword_var => {
2196 fn_proto.return_type = ast.NodeFnProto.ReturnType { .Infer = token };
2197 },
2198 Token.Id.Bang => {2203 Token.Id.Bang => {
2199 fn_proto.return_type = ast.NodeFnProto.ReturnType { .InferErrorSet = undefined };2204 fn_proto.return_type = ast.NodeFnProto.ReturnType { .InferErrorSet = undefined };
2200 stack.append(State {2205 stack.append(State {
...@@ -3573,6 +3578,10 @@ pub const Parser = struct {...@@ -3573,6 +3578,10 @@ pub const Parser = struct {
3573 const error_type = @fieldParentPtr(ast.NodeErrorType, "base", base);3578 const error_type = @fieldParentPtr(ast.NodeErrorType, "base", base);
3574 try stream.print("{}", self.tokenizer.getTokenSlice(error_type.token));3579 try stream.print("{}", self.tokenizer.getTokenSlice(error_type.token));
3575 },3580 },
3581 ast.Node.Id.VarType => {
3582 const var_type = @fieldParentPtr(ast.NodeVarType, "base", base);
3583 try stream.print("{}", self.tokenizer.getTokenSlice(var_type.token));
3584 },
3576 ast.Node.Id.ContainerDecl => {3585 ast.Node.Id.ContainerDecl => {
3577 const container_decl = @fieldParentPtr(ast.NodeContainerDecl, "base", base);3586 const container_decl = @fieldParentPtr(ast.NodeContainerDecl, "base", base);
35783587
...@@ -3711,9 +3720,6 @@ pub const Parser = struct {...@@ -3711,9 +3720,6 @@ pub const Parser = struct {
3711 ast.NodeFnProto.ReturnType.Explicit => |node| {3720 ast.NodeFnProto.ReturnType.Explicit => |node| {
3712 try stack.append(RenderState { .Expression = node});3721 try stack.append(RenderState { .Expression = node});
3713 },3722 },
3714 ast.NodeFnProto.ReturnType.Infer => {
3715 try stack.append(RenderState { .Text = "var"});
3716 },
3717 ast.NodeFnProto.ReturnType.InferErrorSet => |node| {3723 ast.NodeFnProto.ReturnType.InferErrorSet => |node| {
3718 try stack.append(RenderState { .Expression = node});3724 try stack.append(RenderState { .Expression = node});
3719 try stack.append(RenderState { .Text = "!"});3725 try stack.append(RenderState { .Text = "!"});
...@@ -4136,9 +4142,6 @@ pub const Parser = struct {...@@ -4136,9 +4142,6 @@ pub const Parser = struct {
4136 ast.NodeFnProto.ReturnType.Explicit => |node| {4142 ast.NodeFnProto.ReturnType.Explicit => |node| {
4137 try stack.append(RenderState { .Expression = node});4143 try stack.append(RenderState { .Expression = node});
4138 },4144 },
4139 ast.NodeFnProto.ReturnType.Infer => {
4140 try stream.print("var");
4141 },
4142 ast.NodeFnProto.ReturnType.InferErrorSet => |node| {4145 ast.NodeFnProto.ReturnType.InferErrorSet => |node| {
4143 try stream.print("!");4146 try stream.print("!");
4144 try stack.append(RenderState { .Expression = node});4147 try stack.append(RenderState { .Expression = node});
...@@ -4489,6 +4492,15 @@ test "zig fmt: var args" {...@@ -4489,6 +4492,15 @@ test "zig fmt: var args" {
4489 );4492 );
4490}4493}
44914494
4495test "zig fmt: var type" {
4496 try testCanonical(
4497 \\fn print(args: var) var {}
4498 \\const Var = var;
4499 \\const i: var = 0;
4500 \\
4501 );
4502}
4503
4492test "zig fmt: extern function" {4504test "zig fmt: extern function" {
4493 try testCanonical(4505 try testCanonical(
4494 \\extern fn puts(s: &const u8) c_int;4506 \\extern fn puts(s: &const u8) c_int;