authorgravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2020-05-20 23:28:31-04:00
committergravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2020-05-20 23:28:31-04:00
log3c5d581ce35b137a7b80ac1431c1d9132e281fef
tree3df0bfb5c486a488e8a6db2ffbebe716a7135987
parent140dc2f43e347ddddc2f6f344b388bdc74c97c56

update translate-c to the new fn params AST node API


1 files changed, 32 insertions(+), 44 deletions(-)

src-self-hosted/translate_c.zig+32-44
......@@ -534,17 +534,13 @@ fn visitFnDecl(c: *Context, fn_decl: *const ZigClangFunctionDecl) Error!void {
534534 const block_node = try transCreateNodeBlock(rp.c, null);
535535 block_scope.setBlockNode(block_node);
536536
537 var it = proto_node.params.first;
538537 var param_id: c_uint = 0;
539 var prev_node_link = &proto_node.params_first;
540 while (it) |p_node| : ({prev_node_link = &p_node.next; it = p_node.next;}) {
541 const p = p_node.data;
542 const param = @fieldParentPtr(ast.Node.ParamDecl, "base", p);
538 for (proto_node.params()) |param, i| {
543539 const param_name = if (param.name_token) |name_tok|
544540 tokenSlice(c, name_tok)
545541 else if (param.param_type == .var_args) {
546 assert(p_node.next == null);
547 prev_node_link.* = null;
542 assert(i + 1 == proto_node.params_len);
543 proto_node.params_len -= 1;
548544 break;
549545 } else
550546 return failDecl(c, fn_decl_loc, fn_name, "function {} parameter has no name", .{fn_name});
......@@ -3843,7 +3839,7 @@ fn transCreateNodeFnCall(c: *Context, fn_expr: *ast.Node) !*ast.Node.SuffixOp {
38433839 _ = try appendToken(c, .LParen, "(");
38443840 const node = try c.arena.create(ast.Node.SuffixOp);
38453841 node.* = .{
3846 .lhs = .{ .node = fn_expr },
3842 .lhs = fn_expr,
38473843 .op = .{
38483844 .Call = .{
38493845 .params = ast.Node.SuffixOp.Op.Call.ParamList{},
......@@ -4129,41 +4125,36 @@ fn transCreateNodeMacroFn(c: *Context, name: []const u8, ref: *ast.Node, proto_a
41294125 const name_tok = try appendIdentifier(c, name);
41304126 _ = try appendToken(c, .LParen, "(");
41314127
4132 var fn_params = ast.Node.FnProto.ParamList{};
4133 var fn_params_list = &fn_params.first;
4134 var it = proto_alias.params.first;
4135 while (it) |pn_node| : (it = pn_node.next) {
4136 const pn = pn_node.data;
4137 if (pn_node != proto_alias.params.first.?) {
4128 var fn_params = std.ArrayList(ast.Node.FnProto.ParamDecl).init(c.gpa);
4129 defer fn_params.deinit();
4130
4131 for (proto_alias.params()) |param, i| {
4132 if (i != 0) {
41384133 _ = try appendToken(c, .Comma, ",");
41394134 }
4140 const param = pn.cast(ast.Node.ParamDecl).?;
4141
41424135 const param_name_tok = param.name_token orelse
41434136 try appendTokenFmt(c, .Identifier, "arg_{}", .{c.getMangle()});
41444137
41454138 _ = try appendToken(c, .Colon, ":");
41464139
4147 const param_node = try c.arena.create(ast.Node.ParamDecl);
4148 param_node.* = .{
4140 (try fn_params.addOne()).* = .{
41494141 .doc_comments = null,
41504142 .comptime_token = null,
41514143 .noalias_token = param.noalias_token,
41524144 .name_token = param_name_tok,
41534145 .param_type = param.param_type,
41544146 };
4155 fn_params_list = try c.llpush(*ast.Node, fn_params_list, &param_node.base);
41564147 }
41574148
41584149 _ = try appendToken(c, .RParen, ")");
41594150
4160 const fn_proto = try c.arena.create(ast.Node.FnProto);
4151 const fn_proto = try ast.Node.FnProto.alloc(c.arena, fn_params.items.len);
41614152 fn_proto.* = .{
41624153 .doc_comments = null,
41634154 .visib_token = pub_tok,
41644155 .fn_token = fn_tok,
41654156 .name_token = name_tok,
4166 .params = fn_params,
4157 .params_len = fn_params.items.len,
41674158 .return_type = proto_alias.return_type,
41684159 .var_args_token = null,
41694160 .extern_export_inline_token = inline_tok,
......@@ -4173,6 +4164,7 @@ fn transCreateNodeMacroFn(c: *Context, name: []const u8, ref: *ast.Node, proto_a
41734164 .section_expr = null,
41744165 .callconv_expr = null,
41754166 };
4167 mem.copy(ast.Node.FnProto.ParamDecl, fn_proto.params(), fn_params.items);
41764168
41774169 const block = try transCreateNodeBlock(c, null);
41784170 var block_statements_it = &block.statements.first;
......@@ -4182,13 +4174,10 @@ fn transCreateNodeMacroFn(c: *Context, name: []const u8, ref: *ast.Node, proto_a
41824174 const call_expr = try transCreateNodeFnCall(c, unwrap_expr);
41834175 var call_params_it = &call_expr.op.Call.params.first;
41844176
4185 it = fn_params.first;
4186 while (it) |pn_node| : (it = pn_node.next) {
4187 const pn = pn_node.data;
4188 if (fn_params.first.? != pn_node) {
4177 for (fn_params.items) |param, i| {
4178 if (i != 0) {
41894179 _ = try appendToken(c, .Comma, ",");
41904180 }
4191 const param = pn.cast(ast.Node.ParamDecl).?;
41924181 call_params_it = try c.llpush(*ast.Node, call_params_it, try transCreateNodeIdentifier(c, tokenSlice(c, param.name_token.?)),);
41934182 }
41944183 call_expr.rtoken = try appendToken(c, .RParen, ")");
......@@ -4207,7 +4196,7 @@ fn transCreateNodeUnwrapNull(c: *Context, wrapped: *ast.Node) !*ast.Node {
42074196 const node = try c.arena.create(ast.Node.SuffixOp);
42084197 node.* = .{
42094198 .op = .UnwrapOptional,
4210 .lhs = .{ .node = wrapped },
4199 .lhs = wrapped,
42114200 .rtoken = qm,
42124201 };
42134202 return &node.base;
......@@ -4697,9 +4686,10 @@ fn finishTransFnProto(
46974686 const name_tok = if (fn_decl_context) |ctx| try appendIdentifier(rp.c, ctx.fn_name) else null;
46984687 const lparen_tok = try appendToken(rp.c, .LParen, "(");
46994688
4700 var fn_params = ast.Node.FnProto.ParamList{};
4701 var fn_params_list = rp.c.llpusher(&fn_params);
4689 var fn_params = std.ArrayList(ast.Node.FnProto.ParamDecl).init(rp.c.gpa);
4690 defer fn_params.deinit();
47024691 const param_count: usize = if (fn_proto_ty != null) ZigClangFunctionProtoType_getNumParams(fn_proto_ty.?) else 0;
4692 try fn_params.ensureCapacity(param_count + 1); // +1 for possible var args node
47034693
47044694 var i: usize = 0;
47054695 while (i < param_count) : (i += 1) {
......@@ -4723,15 +4713,13 @@ fn finishTransFnProto(
47234713
47244714 const type_node = try transQualType(rp, param_qt, source_loc);
47254715
4726 const param_node = try rp.c.arena.create(ast.Node.ParamDecl);
4727 param_node.* = .{
4716 fn_params.addOneAssumeCapacity().* = .{
47284717 .doc_comments = null,
47294718 .comptime_token = null,
47304719 .noalias_token = noalias_tok,
47314720 .name_token = param_name_tok,
47324721 .param_type = .{ .type_expr = type_node },
47334722 };
4734 try fn_params_list.push(&param_node.base);
47354723
47364724 if (i + 1 < param_count) {
47374725 _ = try appendToken(rp.c, .Comma, ",");
......@@ -4743,15 +4731,13 @@ fn finishTransFnProto(
47434731 _ = try appendToken(rp.c, .Comma, ",");
47444732 }
47454733
4746 const var_arg_node = try rp.c.arena.create(ast.Node.ParamDecl);
4747 var_arg_node.* = .{
4734 fn_params.addOneAssumeCapacity().* = .{
47484735 .doc_comments = null,
47494736 .comptime_token = null,
47504737 .noalias_token = null,
47514738 .name_token = null,
47524739 .param_type = .{ .var_args = try appendToken(rp.c, .Ellipsis3, "...") }
47534740 };
4754 try fn_params_list.push(&var_arg_node.base);
47554741 }
47564742
47574743 const rparen_tok = try appendToken(rp.c, .RParen, ")");
......@@ -4818,13 +4804,13 @@ fn finishTransFnProto(
48184804 }
48194805 };
48204806
4821 const fn_proto = try rp.c.arena.create(ast.Node.FnProto);
4807 const fn_proto = try ast.Node.FnProto.alloc(rp.c.arena, fn_params.items.len);
48224808 fn_proto.* = .{
48234809 .doc_comments = null,
48244810 .visib_token = pub_tok,
48254811 .fn_token = fn_tok,
48264812 .name_token = name_tok,
4827 .params = fn_params,
4813 .params_len = fn_params.items.len,
48284814 .return_type = .{ .Explicit = return_type_node },
48294815 .var_args_token = null, // TODO this field is broken in the AST data model
48304816 .extern_export_inline_token = extern_export_inline_tok,
......@@ -4834,6 +4820,7 @@ fn finishTransFnProto(
48344820 .section_expr = linksection_expr,
48354821 .callconv_expr = callconv_expr,
48364822 };
4823 mem.copy(ast.Node.FnProto.ParamDecl, fn_proto.params(), fn_params.items);
48374824 return fn_proto;
48384825}
48394826
......@@ -5130,8 +5117,10 @@ fn transMacroFnDefine(c: *Context, it: *CTokenList.Iterator, source: []const u8,
51305117 .{},
51315118 );
51325119 }
5133 var fn_params = ast.Node.FnProto.ParamList{};
5134 var fn_params_it = &fn_params.first;
5120
5121 var fn_params = std.ArrayList(ast.Node.FnProto.ParamDecl).init(c.gpa);
5122 defer fn_params.deinit();
5123
51355124 while (true) {
51365125 const param_tok = it.next().?;
51375126 if (param_tok.id != .Identifier) {
......@@ -5154,15 +5143,13 @@ fn transMacroFnDefine(c: *Context, it: *CTokenList.Iterator, source: []const u8,
51545143 .token = token_index,
51555144 };
51565145
5157 const param_node = try c.arena.create(ast.Node.ParamDecl);
5158 param_node.* = .{
5146 (try fn_params.addOne()).* = .{
51595147 .doc_comments = null,
51605148 .comptime_token = null,
51615149 .noalias_token = null,
51625150 .name_token = param_name_tok,
51635151 .param_type = .{ .type_expr = &identifier.base },
51645152 };
5165 fn_params_it = try c.llpush(*ast.Node, fn_params_it, &param_node.base);
51665153
51675154 if (it.peek().?.id != .Comma)
51685155 break;
......@@ -5186,13 +5173,13 @@ fn transMacroFnDefine(c: *Context, it: *CTokenList.Iterator, source: []const u8,
51865173 type_of.rparen_token = try appendToken(c, .RParen, ")");
51875174 var type_of_params = c.llpusher(&type_of.params);
51885175
5189 const fn_proto = try c.arena.create(ast.Node.FnProto);
5176 const fn_proto = try ast.Node.FnProto.alloc(c.arena, fn_params.items.len);
51905177 fn_proto.* = .{
51915178 .visib_token = pub_tok,
51925179 .extern_export_inline_token = inline_tok,
51935180 .fn_token = fn_tok,
51945181 .name_token = name_tok,
5195 .params = fn_params,
5182 .params_len = fn_params.items.len,
51965183 .return_type = .{ .Explicit = &type_of.base },
51975184 .doc_comments = null,
51985185 .var_args_token = null,
......@@ -5202,6 +5189,7 @@ fn transMacroFnDefine(c: *Context, it: *CTokenList.Iterator, source: []const u8,
52025189 .section_expr = null,
52035190 .callconv_expr = null,
52045191 };
5192 mem.copy(ast.Node.FnProto.ParamDecl, fn_proto.params(), fn_params.items);
52055193
52065194 const block = try transCreateNodeBlock(c, null);
52075195 var block_statements = c.llpusher(&block.statements);