AstGen: implement anytype parameters

This commit is contained in:
Andrew Kelley 2021-04-20 17:38:06 -07:00
parent a62db38d90
commit 30c9808391
3 changed files with 20 additions and 12 deletions

View File

@ -2172,6 +2172,10 @@ pub const full = struct {
};
it.param_i += 1;
it.tok_i = it.tree.lastToken(param_type) + 1;
// Look for anytype and ... params afterwards.
if (token_tags[it.tok_i] == .comma) {
it.tok_i += 1;
}
it.tok_flag = true;
return Param{
.first_doc_comment = first_doc_comment,
@ -2181,10 +2185,7 @@ pub const full = struct {
.type_expr = param_type,
};
}
// Look for anytype and ... params afterwards.
if (token_tags[it.tok_i] == .comma) {
it.tok_i += 1;
} else {
if (token_tags[it.tok_i] == .r_paren) {
return null;
}
if (token_tags[it.tok_i] == .doc_comment) {
@ -2236,8 +2237,8 @@ pub const full = struct {
.tree = &tree,
.fn_proto = &fn_proto,
.param_i = 0,
.tok_i = undefined,
.tok_flag = false,
.tok_i = fn_proto.lparen + 1,
.tok_flag = true,
};
}
};

View File

@ -2334,7 +2334,11 @@ fn fnDecl(
var count: usize = 0;
var it = fn_proto.iterate(tree.*);
while (it.next()) |param| {
if (param.anytype_ellipsis3) |some| if (token_tags[some] == .ellipsis3) break;
if (param.anytype_ellipsis3) |token| switch (token_tags[token]) {
.ellipsis3 => break,
.keyword_anytype => {},
else => unreachable,
};
count += 1;
}
break :blk count;
@ -2358,11 +2362,10 @@ fn fnDecl(
while (it.next()) |param| : (param_type_i += 1) {
if (param.anytype_ellipsis3) |token| {
switch (token_tags[token]) {
.keyword_anytype => return astgen.failTok(
token,
"TODO implement anytype parameter",
.{},
),
.keyword_anytype => {
param_types[param_type_i] = .none;
continue;
},
.ellipsis3 => {
is_var_args = true;
break;

View File

@ -1816,6 +1816,7 @@ pub const Inst = struct {
/// Trailing:
/// 0. param_type: Ref // for each param_types_len
/// - `none` indicates that the param type is `anytype`.
/// 1. body: Index // for each body_len
pub const Func = struct {
return_type: Ref,
@ -3304,7 +3305,10 @@ const Writer = struct {
try stream.writeAll(", {\n");
self.indent += 2;
const prev_param_count = self.param_count;
self.param_count = param_types.len;
try self.writeBody(stream, body);
self.param_count = prev_param_count;
self.indent -= 2;
try stream.writeByteNTimes(' ', self.indent);
try stream.writeAll("}) ");