| ... | ... | @@ -534,17 +534,13 @@ fn visitFnDecl(c: *Context, fn_decl: *const ZigClangFunctionDecl) Error!void { |
| 534 | 534 | const block_node = try transCreateNodeBlock(rp.c, null); |
| 535 | 535 | block_scope.setBlockNode(block_node); |
| 536 | 536 | |
| 537 | | var it = proto_node.params.first; |
| 538 | 537 | 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| { |
| 543 | 539 | const param_name = if (param.name_token) |name_tok| |
| 544 | 540 | tokenSlice(c, name_tok) |
| 545 | 541 | 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; |
| 548 | 544 | break; |
| 549 | 545 | } else |
| 550 | 546 | 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 { |
| 3843 | 3839 | _ = try appendToken(c, .LParen, "("); |
| 3844 | 3840 | const node = try c.arena.create(ast.Node.SuffixOp); |
| 3845 | 3841 | node.* = .{ |
| 3846 | | .lhs = .{ .node = fn_expr }, |
| 3842 | .lhs = fn_expr, |
| 3847 | 3843 | .op = .{ |
| 3848 | 3844 | .Call = .{ |
| 3849 | 3845 | .params = ast.Node.SuffixOp.Op.Call.ParamList{}, |
| ... | ... | @@ -4129,41 +4125,36 @@ fn transCreateNodeMacroFn(c: *Context, name: []const u8, ref: *ast.Node, proto_a |
| 4129 | 4125 | const name_tok = try appendIdentifier(c, name); |
| 4130 | 4126 | _ = try appendToken(c, .LParen, "("); |
| 4131 | 4127 | |
| 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) { |
| 4138 | 4133 | _ = try appendToken(c, .Comma, ","); |
| 4139 | 4134 | } |
| 4140 | | const param = pn.cast(ast.Node.ParamDecl).?; |
| 4141 | | |
| 4142 | 4135 | const param_name_tok = param.name_token orelse |
| 4143 | 4136 | try appendTokenFmt(c, .Identifier, "arg_{}", .{c.getMangle()}); |
| 4144 | 4137 | |
| 4145 | 4138 | _ = try appendToken(c, .Colon, ":"); |
| 4146 | 4139 | |
| 4147 | | const param_node = try c.arena.create(ast.Node.ParamDecl); |
| 4148 | | param_node.* = .{ |
| 4140 | (try fn_params.addOne()).* = .{ |
| 4149 | 4141 | .doc_comments = null, |
| 4150 | 4142 | .comptime_token = null, |
| 4151 | 4143 | .noalias_token = param.noalias_token, |
| 4152 | 4144 | .name_token = param_name_tok, |
| 4153 | 4145 | .param_type = param.param_type, |
| 4154 | 4146 | }; |
| 4155 | | fn_params_list = try c.llpush(*ast.Node, fn_params_list, &param_node.base); |
| 4156 | 4147 | } |
| 4157 | 4148 | |
| 4158 | 4149 | _ = try appendToken(c, .RParen, ")"); |
| 4159 | 4150 | |
| 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); |
| 4161 | 4152 | fn_proto.* = .{ |
| 4162 | 4153 | .doc_comments = null, |
| 4163 | 4154 | .visib_token = pub_tok, |
| 4164 | 4155 | .fn_token = fn_tok, |
| 4165 | 4156 | .name_token = name_tok, |
| 4166 | | .params = fn_params, |
| 4157 | .params_len = fn_params.items.len, |
| 4167 | 4158 | .return_type = proto_alias.return_type, |
| 4168 | 4159 | .var_args_token = null, |
| 4169 | 4160 | .extern_export_inline_token = inline_tok, |
| ... | ... | @@ -4173,6 +4164,7 @@ fn transCreateNodeMacroFn(c: *Context, name: []const u8, ref: *ast.Node, proto_a |
| 4173 | 4164 | .section_expr = null, |
| 4174 | 4165 | .callconv_expr = null, |
| 4175 | 4166 | }; |
| 4167 | mem.copy(ast.Node.FnProto.ParamDecl, fn_proto.params(), fn_params.items); |
| 4176 | 4168 | |
| 4177 | 4169 | const block = try transCreateNodeBlock(c, null); |
| 4178 | 4170 | var block_statements_it = &block.statements.first; |
| ... | ... | @@ -4182,13 +4174,10 @@ fn transCreateNodeMacroFn(c: *Context, name: []const u8, ref: *ast.Node, proto_a |
| 4182 | 4174 | const call_expr = try transCreateNodeFnCall(c, unwrap_expr); |
| 4183 | 4175 | var call_params_it = &call_expr.op.Call.params.first; |
| 4184 | 4176 | |
| 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) { |
| 4189 | 4179 | _ = try appendToken(c, .Comma, ","); |
| 4190 | 4180 | } |
| 4191 | | const param = pn.cast(ast.Node.ParamDecl).?; |
| 4192 | 4181 | call_params_it = try c.llpush(*ast.Node, call_params_it, try transCreateNodeIdentifier(c, tokenSlice(c, param.name_token.?)),); |
| 4193 | 4182 | } |
| 4194 | 4183 | call_expr.rtoken = try appendToken(c, .RParen, ")"); |
| ... | ... | @@ -4207,7 +4196,7 @@ fn transCreateNodeUnwrapNull(c: *Context, wrapped: *ast.Node) !*ast.Node { |
| 4207 | 4196 | const node = try c.arena.create(ast.Node.SuffixOp); |
| 4208 | 4197 | node.* = .{ |
| 4209 | 4198 | .op = .UnwrapOptional, |
| 4210 | | .lhs = .{ .node = wrapped }, |
| 4199 | .lhs = wrapped, |
| 4211 | 4200 | .rtoken = qm, |
| 4212 | 4201 | }; |
| 4213 | 4202 | return &node.base; |
| ... | ... | @@ -4697,9 +4686,10 @@ fn finishTransFnProto( |
| 4697 | 4686 | const name_tok = if (fn_decl_context) |ctx| try appendIdentifier(rp.c, ctx.fn_name) else null; |
| 4698 | 4687 | const lparen_tok = try appendToken(rp.c, .LParen, "("); |
| 4699 | 4688 | |
| 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(); |
| 4702 | 4691 | 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 |
| 4703 | 4693 | |
| 4704 | 4694 | var i: usize = 0; |
| 4705 | 4695 | while (i < param_count) : (i += 1) { |
| ... | ... | @@ -4723,15 +4713,13 @@ fn finishTransFnProto( |
| 4723 | 4713 | |
| 4724 | 4714 | const type_node = try transQualType(rp, param_qt, source_loc); |
| 4725 | 4715 | |
| 4726 | | const param_node = try rp.c.arena.create(ast.Node.ParamDecl); |
| 4727 | | param_node.* = .{ |
| 4716 | fn_params.addOneAssumeCapacity().* = .{ |
| 4728 | 4717 | .doc_comments = null, |
| 4729 | 4718 | .comptime_token = null, |
| 4730 | 4719 | .noalias_token = noalias_tok, |
| 4731 | 4720 | .name_token = param_name_tok, |
| 4732 | 4721 | .param_type = .{ .type_expr = type_node }, |
| 4733 | 4722 | }; |
| 4734 | | try fn_params_list.push(&param_node.base); |
| 4735 | 4723 | |
| 4736 | 4724 | if (i + 1 < param_count) { |
| 4737 | 4725 | _ = try appendToken(rp.c, .Comma, ","); |
| ... | ... | @@ -4743,15 +4731,13 @@ fn finishTransFnProto( |
| 4743 | 4731 | _ = try appendToken(rp.c, .Comma, ","); |
| 4744 | 4732 | } |
| 4745 | 4733 | |
| 4746 | | const var_arg_node = try rp.c.arena.create(ast.Node.ParamDecl); |
| 4747 | | var_arg_node.* = .{ |
| 4734 | fn_params.addOneAssumeCapacity().* = .{ |
| 4748 | 4735 | .doc_comments = null, |
| 4749 | 4736 | .comptime_token = null, |
| 4750 | 4737 | .noalias_token = null, |
| 4751 | 4738 | .name_token = null, |
| 4752 | 4739 | .param_type = .{ .var_args = try appendToken(rp.c, .Ellipsis3, "...") } |
| 4753 | 4740 | }; |
| 4754 | | try fn_params_list.push(&var_arg_node.base); |
| 4755 | 4741 | } |
| 4756 | 4742 | |
| 4757 | 4743 | const rparen_tok = try appendToken(rp.c, .RParen, ")"); |
| ... | ... | @@ -4818,13 +4804,13 @@ fn finishTransFnProto( |
| 4818 | 4804 | } |
| 4819 | 4805 | }; |
| 4820 | 4806 | |
| 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); |
| 4822 | 4808 | fn_proto.* = .{ |
| 4823 | 4809 | .doc_comments = null, |
| 4824 | 4810 | .visib_token = pub_tok, |
| 4825 | 4811 | .fn_token = fn_tok, |
| 4826 | 4812 | .name_token = name_tok, |
| 4827 | | .params = fn_params, |
| 4813 | .params_len = fn_params.items.len, |
| 4828 | 4814 | .return_type = .{ .Explicit = return_type_node }, |
| 4829 | 4815 | .var_args_token = null, // TODO this field is broken in the AST data model |
| 4830 | 4816 | .extern_export_inline_token = extern_export_inline_tok, |
| ... | ... | @@ -4834,6 +4820,7 @@ fn finishTransFnProto( |
| 4834 | 4820 | .section_expr = linksection_expr, |
| 4835 | 4821 | .callconv_expr = callconv_expr, |
| 4836 | 4822 | }; |
| 4823 | mem.copy(ast.Node.FnProto.ParamDecl, fn_proto.params(), fn_params.items); |
| 4837 | 4824 | return fn_proto; |
| 4838 | 4825 | } |
| 4839 | 4826 | |
| ... | ... | @@ -5130,8 +5117,10 @@ fn transMacroFnDefine(c: *Context, it: *CTokenList.Iterator, source: []const u8, |
| 5130 | 5117 | .{}, |
| 5131 | 5118 | ); |
| 5132 | 5119 | } |
| 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 | |
| 5135 | 5124 | while (true) { |
| 5136 | 5125 | const param_tok = it.next().?; |
| 5137 | 5126 | if (param_tok.id != .Identifier) { |
| ... | ... | @@ -5154,15 +5143,13 @@ fn transMacroFnDefine(c: *Context, it: *CTokenList.Iterator, source: []const u8, |
| 5154 | 5143 | .token = token_index, |
| 5155 | 5144 | }; |
| 5156 | 5145 | |
| 5157 | | const param_node = try c.arena.create(ast.Node.ParamDecl); |
| 5158 | | param_node.* = .{ |
| 5146 | (try fn_params.addOne()).* = .{ |
| 5159 | 5147 | .doc_comments = null, |
| 5160 | 5148 | .comptime_token = null, |
| 5161 | 5149 | .noalias_token = null, |
| 5162 | 5150 | .name_token = param_name_tok, |
| 5163 | 5151 | .param_type = .{ .type_expr = &identifier.base }, |
| 5164 | 5152 | }; |
| 5165 | | fn_params_it = try c.llpush(*ast.Node, fn_params_it, &param_node.base); |
| 5166 | 5153 | |
| 5167 | 5154 | if (it.peek().?.id != .Comma) |
| 5168 | 5155 | break; |
| ... | ... | @@ -5186,13 +5173,13 @@ fn transMacroFnDefine(c: *Context, it: *CTokenList.Iterator, source: []const u8, |
| 5186 | 5173 | type_of.rparen_token = try appendToken(c, .RParen, ")"); |
| 5187 | 5174 | var type_of_params = c.llpusher(&type_of.params); |
| 5188 | 5175 | |
| 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); |
| 5190 | 5177 | fn_proto.* = .{ |
| 5191 | 5178 | .visib_token = pub_tok, |
| 5192 | 5179 | .extern_export_inline_token = inline_tok, |
| 5193 | 5180 | .fn_token = fn_tok, |
| 5194 | 5181 | .name_token = name_tok, |
| 5195 | | .params = fn_params, |
| 5182 | .params_len = fn_params.items.len, |
| 5196 | 5183 | .return_type = .{ .Explicit = &type_of.base }, |
| 5197 | 5184 | .doc_comments = null, |
| 5198 | 5185 | .var_args_token = null, |
| ... | ... | @@ -5202,6 +5189,7 @@ fn transMacroFnDefine(c: *Context, it: *CTokenList.Iterator, source: []const u8, |
| 5202 | 5189 | .section_expr = null, |
| 5203 | 5190 | .callconv_expr = null, |
| 5204 | 5191 | }; |
| 5192 | mem.copy(ast.Node.FnProto.ParamDecl, fn_proto.params(), fn_params.items); |
| 5205 | 5193 | |
| 5206 | 5194 | const block = try transCreateNodeBlock(c, null); |
| 5207 | 5195 | var block_statements = c.llpusher(&block.statements); |