| author | |
| committer | |
| log | a05011d403d084d75b3a3d8a5a38fa0a4bfe3380 |
| tree | 003db1d9a48c615a9e50e691db982428eb58dc76 |
| parent | ed62081d38736b2fabb3949fa821af2cf03dbe6e |
| signature | Commit is signed but in an unrecognized format. |
3 files changed, 33 insertions(+), 32 deletions(-)
lib/std/zig/ast.zig+19-6| ... | @@ -986,14 +986,22 @@ pub const Node = struct { | ... | @@ -986,14 +986,22 @@ pub const Node = struct { |
| 986 | comptime_token: ?TokenIndex, | 986 | comptime_token: ?TokenIndex, |
| 987 | noalias_token: ?TokenIndex, | 987 | noalias_token: ?TokenIndex, |
| 988 | name_token: ?TokenIndex, | 988 | name_token: ?TokenIndex, |
| 989 | type_node: *Node, | 989 | param_type: ParamType, |
| 990 | var_args_token: ?TokenIndex, | 990 | |
| 991 | pub const ParamType = union(enum) { | ||
| 992 | var_type: *Node, | ||
| 993 | var_args: TokenIndex, | ||
| 994 | type_expr: *Node, | ||
| 995 | }; | ||
| 991 | 996 | ||
| 992 | pub fn iterate(self: *ParamDecl, index: usize) ?*Node { | 997 | pub fn iterate(self: *ParamDecl, index: usize) ?*Node { |
| 993 | var i = index; | 998 | var i = index; |
| 994 | 999 | ||
| 995 | if (i < 1) { | 1000 | if (i < 1) { |
| 996 | return if (self.var_args_token == null) self.type_node else null; | 1001 | switch (self.param_type) { |
| 1002 | .var_args => return null, | ||
| 1003 | .var_type, .type_expr => |node| return node, | ||
| 1004 | } | ||
| 997 | } | 1005 | } |
| 998 | i -= 1; | 1006 | i -= 1; |
| 999 | 1007 | ||
| ... | @@ -1004,12 +1012,17 @@ pub const Node = struct { | ... | @@ -1004,12 +1012,17 @@ pub const Node = struct { |
| 1004 | if (self.comptime_token) |comptime_token| return comptime_token; | 1012 | if (self.comptime_token) |comptime_token| return comptime_token; |
| 1005 | if (self.noalias_token) |noalias_token| return noalias_token; | 1013 | if (self.noalias_token) |noalias_token| return noalias_token; |
| 1006 | if (self.name_token) |name_token| return name_token; | 1014 | if (self.name_token) |name_token| return name_token; |
| 1007 | return self.type_node.firstToken(); | 1015 | switch (self.param_type) { |
| 1016 | .var_args => |tok| return tok, | ||
| 1017 | .var_type, .type_expr => |node| return node.firstToken(), | ||
| 1018 | } | ||
| 1008 | } | 1019 | } |
| 1009 | 1020 | ||
| 1010 | pub fn lastToken(self: *const ParamDecl) TokenIndex { | 1021 | pub fn lastToken(self: *const ParamDecl) TokenIndex { |
| 1011 | if (self.var_args_token) |var_args_token| return var_args_token; | 1022 | switch (self.param_type) { |
| 1012 | return self.type_node.lastToken(); | 1023 | .var_args => |tok| return tok, |
| 1024 | .var_type, .type_expr => |node| return node.lastToken(), | ||
| 1025 | } | ||
| 1013 | } | 1026 | } |
| 1014 | }; | 1027 | }; |
| 1015 | 1028 |
lib/std/zig/parse.zig+11-22| ... | @@ -510,9 +510,10 @@ fn parseFnProto(arena: *Allocator, it: *TokenIterator, tree: *Tree) !?*Node { | ... | @@ -510,9 +510,10 @@ fn parseFnProto(arena: *Allocator, it: *TokenIterator, tree: *Tree) !?*Node { |
| 510 | else | 510 | else |
| 511 | R{ .Explicit = return_type_expr.? }; | 511 | R{ .Explicit = return_type_expr.? }; |
| 512 | 512 | ||
| 513 | const var_args_token = if (params.len > 0) | 513 | const var_args_token = if (params.len > 0) blk: { |
| 514 | params.at(params.len - 1).*.cast(Node.ParamDecl).?.var_args_token | 514 | const param_type = params.at(params.len - 1).*.cast(Node.ParamDecl).?.param_type; |
| 515 | else | 515 | break :blk if (param_type == .var_args) param_type.var_args else null; |
| 516 | } else | ||
| 516 | null; | 517 | null; |
| 517 | 518 | ||
| 518 | const fn_proto_node = try arena.create(Node.FnProto); | 519 | const fn_proto_node = try arena.create(Node.FnProto); |
| ... | @@ -1939,15 +1940,8 @@ fn parseParamDecl(arena: *Allocator, it: *TokenIterator, tree: *Tree) !?*Node { | ... | @@ -1939,15 +1940,8 @@ fn parseParamDecl(arena: *Allocator, it: *TokenIterator, tree: *Tree) !?*Node { |
| 1939 | .comptime_token = comptime_token, | 1940 | .comptime_token = comptime_token, |
| 1940 | .noalias_token = noalias_token, | 1941 | .noalias_token = noalias_token, |
| 1941 | .name_token = name_token, | 1942 | .name_token = name_token, |
| 1942 | // TODO: These should be squished into a ParamType enum | 1943 | .param_type = param_type, |
| 1943 | .type_node = undefined, | ||
| 1944 | .var_args_token = null, | ||
| 1945 | }; | 1944 | }; |
| 1946 | switch (param_type) { | ||
| 1947 | .VarType => |node| param_decl.type_node = node, | ||
| 1948 | .TypeExpr => |node| param_decl.type_node = node, | ||
| 1949 | .VarArgs => |token| param_decl.var_args_token = token, | ||
| 1950 | } | ||
| 1951 | return &param_decl.base; | 1945 | return &param_decl.base; |
| 1952 | } | 1946 | } |
| 1953 | 1947 | ||
| ... | @@ -1955,20 +1949,15 @@ fn parseParamDecl(arena: *Allocator, it: *TokenIterator, tree: *Tree) !?*Node { | ... | @@ -1955,20 +1949,15 @@ fn parseParamDecl(arena: *Allocator, it: *TokenIterator, tree: *Tree) !?*Node { |
| 1955 | /// <- KEYWORD_var | 1949 | /// <- KEYWORD_var |
| 1956 | /// / DOT3 | 1950 | /// / DOT3 |
| 1957 | /// / TypeExpr | 1951 | /// / TypeExpr |
| 1958 | fn parseParamType(arena: *Allocator, it: *TokenIterator, tree: *Tree) !?ParamType { | 1952 | fn parseParamType(arena: *Allocator, it: *TokenIterator, tree: *Tree) !?Node.ParamDecl.ParamType { |
| 1959 | if (try parseVarType(arena, it, tree)) |node| return ParamType{ .VarType = node }; | 1953 | // TODO cast from tuple to error union is broken |
| 1960 | if (eatToken(it, .Ellipsis3)) |token| return ParamType{ .VarArgs = token }; | 1954 | const P = Node.ParamDecl.ParamType; |
| 1961 | if (try parseTypeExpr(arena, it, tree)) |node| return ParamType{ .TypeExpr = node }; | 1955 | if (try parseVarType(arena, it, tree)) |node| return P{ .var_type = node }; |
| 1956 | if (eatToken(it, .Ellipsis3)) |token| return P{ .var_args = token }; | ||
| 1957 | if (try parseTypeExpr(arena, it, tree)) |node| return P{ .type_expr = node }; | ||
| 1962 | return null; | 1958 | return null; |
| 1963 | } | 1959 | } |
| 1964 | 1960 | ||
| 1965 | // TODO: Move to ast.Node.ParamDecl.ParamType | ||
| 1966 | const ParamType = union(enum) { | ||
| 1967 | VarType: *Node, | ||
| 1968 | VarArgs: TokenIndex, | ||
| 1969 | TypeExpr: *Node, | ||
| 1970 | }; | ||
| 1971 | |||
| 1972 | /// IfPrefix <- KEYWORD_if LPAREN Expr RPAREN PtrPayload? | 1961 | /// IfPrefix <- KEYWORD_if LPAREN Expr RPAREN PtrPayload? |
| 1973 | fn parseIfPrefix(arena: *Allocator, it: *TokenIterator, tree: *Tree) !?*Node { | 1962 | fn parseIfPrefix(arena: *Allocator, it: *TokenIterator, tree: *Tree) !?*Node { |
| 1974 | const if_token = eatToken(it, .Keyword_if) orelse return null; | 1963 | const if_token = eatToken(it, .Keyword_if) orelse return null; |
lib/std/zig/render.zig+3-4| ... | @@ -2150,10 +2150,9 @@ fn renderParamDecl( | ... | @@ -2150,10 +2150,9 @@ fn renderParamDecl( |
| 2150 | try renderToken(tree, stream, name_token, indent, start_col, Space.None); | 2150 | try renderToken(tree, stream, name_token, indent, start_col, Space.None); |
| 2151 | try renderToken(tree, stream, tree.nextToken(name_token), indent, start_col, Space.Space); // : | 2151 | try renderToken(tree, stream, tree.nextToken(name_token), indent, start_col, Space.Space); // : |
| 2152 | } | 2152 | } |
| 2153 | if (param_decl.var_args_token) |var_args_token| { | 2153 | switch (param_decl.param_type) { |
| 2154 | try renderToken(tree, stream, var_args_token, indent, start_col, space); | 2154 | .var_args => |token| try renderToken(tree, stream, token, indent, start_col, space), |
| 2155 | } else { | 2155 | .var_type, .type_expr => |node| try renderExpression(allocator, stream, tree, indent, start_col, node, space), |
| 2156 | try renderExpression(allocator, stream, tree, indent, start_col, param_decl.type_node, space); | ||
| 2157 | } | 2156 | } |
| 2158 | } | 2157 | } |
| 2159 | 2158 |