| author | |
| committer | |
| log | db9a9f3a6c248e74953d9f7cbf6bedc78e3c23ff |
| tree | f5ac38593550a832389c2f20b8a2ddd165cf1ce1 |
| parent | aa09e7b63995639084d25329954b1972a72ad12d |
* I parse it as a type in all contexts. This is not how the
C++ compiler does it, but I think typechecking should catch this2 files changed, 42 insertions(+), 11 deletions(-)
std/zig/ast.zig+21-2| ... | ... | @@ -55,6 +55,7 @@ pub const Node = struct { |
| 55 | 55 | AsmOutput, |
| 56 | 56 | Unreachable, |
| 57 | 57 | ErrorType, |
| 58 | VarType, | |
| 58 | 59 | BuiltinCall, |
| 59 | 60 | LineComment, |
| 60 | 61 | TestDecl, |
| ... | ... | @@ -108,6 +109,7 @@ pub const Node = struct { |
| 108 | 109 | Id.AsmOutput => @fieldParentPtr(NodeAsmOutput, "base", base).iterate(index), |
| 109 | 110 | Id.Unreachable => @fieldParentPtr(NodeUnreachable, "base", base).iterate(index), |
| 110 | 111 | Id.ErrorType => @fieldParentPtr(NodeErrorType, "base", base).iterate(index), |
| 112 | Id.VarType => @fieldParentPtr(NodeVarType, "base", base).iterate(index), | |
| 111 | 113 | Id.BuiltinCall => @fieldParentPtr(NodeBuiltinCall, "base", base).iterate(index), |
| 112 | 114 | Id.LineComment => @fieldParentPtr(NodeLineComment, "base", base).iterate(index), |
| 113 | 115 | Id.TestDecl => @fieldParentPtr(NodeTestDecl, "base", base).iterate(index), |
| ... | ... | @@ -162,6 +164,7 @@ pub const Node = struct { |
| 162 | 164 | Id.AsmInput => @fieldParentPtr(NodeAsmInput, "base", base).firstToken(), |
| 163 | 165 | Id.AsmOutput => @fieldParentPtr(NodeAsmOutput, "base", base).firstToken(), |
| 164 | 166 | Id.ErrorType => @fieldParentPtr(NodeErrorType, "base", base).firstToken(), |
| 167 | Id.VarType => @fieldParentPtr(NodeVarType, "base", base).firstToken(), | |
| 165 | 168 | Id.BuiltinCall => @fieldParentPtr(NodeBuiltinCall, "base", base).firstToken(), |
| 166 | 169 | Id.LineComment => @fieldParentPtr(NodeLineComment, "base", base).firstToken(), |
| 167 | 170 | Id.TestDecl => @fieldParentPtr(NodeTestDecl, "base", base).firstToken(), |
| ... | ... | @@ -216,6 +219,7 @@ pub const Node = struct { |
| 216 | 219 | Id.AsmOutput => @fieldParentPtr(NodeAsmOutput, "base", base).lastToken(), |
| 217 | 220 | Id.Unreachable => @fieldParentPtr(NodeUnreachable, "base", base).lastToken(), |
| 218 | 221 | Id.ErrorType => @fieldParentPtr(NodeErrorType, "base", base).lastToken(), |
| 222 | Id.VarType => @fieldParentPtr(NodeVarType, "base", base).lastToken(), | |
| 219 | 223 | Id.BuiltinCall => @fieldParentPtr(NodeBuiltinCall, "base", base).lastToken(), |
| 220 | 224 | Id.LineComment => @fieldParentPtr(NodeLineComment, "base", base).lastToken(), |
| 221 | 225 | Id.TestDecl => @fieldParentPtr(NodeTestDecl, "base", base).lastToken(), |
| ... | ... | @@ -541,7 +545,6 @@ pub const NodeFnProto = struct { |
| 541 | 545 | |
| 542 | 546 | pub const ReturnType = union(enum) { |
| 543 | 547 | Explicit: &Node, |
| 544 | Infer: Token, | |
| 545 | 548 | InferErrorSet: &Node, |
| 546 | 549 | }; |
| 547 | 550 | |
| ... | ... | @@ -597,7 +600,6 @@ pub const NodeFnProto = struct { |
| 597 | 600 | // TODO allow this and next prong to share bodies since the types are the same |
| 598 | 601 | ReturnType.Explicit => |node| return node.lastToken(), |
| 599 | 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 | 1790 | } |
| 1789 | 1791 | }; |
| 1790 | 1792 | |
| 1793 | pub 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 | ||
| 1791 | 1810 | pub const NodeLineComment = struct { |
| 1792 | 1811 | base: Node, |
| 1793 | 1812 | lines: ArrayList(Token), |
std/zig/parser.zig+21-9| ... | ... | @@ -1437,6 +1437,14 @@ pub const Parser = struct { |
| 1437 | 1437 | dest_ptr.store(&node.base); |
| 1438 | 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 | 1448 | Token.Id.Keyword_unreachable => { |
| 1441 | 1449 | const node = try arena.create(ast.NodeUnreachable); |
| 1442 | 1450 | *node = ast.NodeUnreachable { |
| ... | ... | @@ -2192,9 +2200,6 @@ pub const Parser = struct { |
| 2192 | 2200 | State.FnProtoReturnType => |fn_proto| { |
| 2193 | 2201 | const token = self.getNextToken(); |
| 2194 | 2202 | switch (token.id) { |
| 2195 | Token.Id.Keyword_var => { | |
| 2196 | fn_proto.return_type = ast.NodeFnProto.ReturnType { .Infer = token }; | |
| 2197 | }, | |
| 2198 | 2203 | Token.Id.Bang => { |
| 2199 | 2204 | fn_proto.return_type = ast.NodeFnProto.ReturnType { .InferErrorSet = undefined }; |
| 2200 | 2205 | stack.append(State { |
| ... | ... | @@ -3573,6 +3578,10 @@ pub const Parser = struct { |
| 3573 | 3578 | const error_type = @fieldParentPtr(ast.NodeErrorType, "base", base); |
| 3574 | 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 | 3585 | ast.Node.Id.ContainerDecl => { |
| 3577 | 3586 | const container_decl = @fieldParentPtr(ast.NodeContainerDecl, "base", base); |
| 3578 | 3587 | |
| ... | ... | @@ -3711,9 +3720,6 @@ pub const Parser = struct { |
| 3711 | 3720 | ast.NodeFnProto.ReturnType.Explicit => |node| { |
| 3712 | 3721 | try stack.append(RenderState { .Expression = node}); |
| 3713 | 3722 | }, |
| 3714 | ast.NodeFnProto.ReturnType.Infer => { | |
| 3715 | try stack.append(RenderState { .Text = "var"}); | |
| 3716 | }, | |
| 3717 | 3723 | ast.NodeFnProto.ReturnType.InferErrorSet => |node| { |
| 3718 | 3724 | try stack.append(RenderState { .Expression = node}); |
| 3719 | 3725 | try stack.append(RenderState { .Text = "!"}); |
| ... | ... | @@ -4136,9 +4142,6 @@ pub const Parser = struct { |
| 4136 | 4142 | ast.NodeFnProto.ReturnType.Explicit => |node| { |
| 4137 | 4143 | try stack.append(RenderState { .Expression = node}); |
| 4138 | 4144 | }, |
| 4139 | ast.NodeFnProto.ReturnType.Infer => { | |
| 4140 | try stream.print("var"); | |
| 4141 | }, | |
| 4142 | 4145 | ast.NodeFnProto.ReturnType.InferErrorSet => |node| { |
| 4143 | 4146 | try stream.print("!"); |
| 4144 | 4147 | try stack.append(RenderState { .Expression = node}); |
| ... | ... | @@ -4489,6 +4492,15 @@ test "zig fmt: var args" { |
| 4489 | 4492 | ); |
| 4490 | 4493 | } |
| 4491 | 4494 | |
| 4495 | test "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 | ||
| 4492 | 4504 | test "zig fmt: extern function" { |
| 4493 | 4505 | try testCanonical( |
| 4494 | 4506 | \\extern fn puts(s: &const u8) c_int; |