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