if (callee->kind == Ast_Kind_Function) {
if (bh_arr_length(arg_arr) < bh_arr_length(callee->params)) {
- while (bh_arr_length(arg_arr) < bh_arr_length(callee->params) && callee->params[call->arg_count].default_value != NULL) {
- AstTyped* dv = callee->params[call->arg_count].default_value;
+ while (bh_arr_length(arg_arr) < bh_arr_length(callee->params)
+ && callee->params[bh_arr_length(arg_arr)].default_value != NULL) {
+ AstTyped* dv = callee->params[bh_arr_length(arg_arr)].default_value;
AstArgument* new_arg = make_argument(semstate.node_allocator, dv);
bh_arr_push(arg_arr, new_arg);
AstCall* implicit_call = onyx_ast_node_new(semstate.node_allocator, sizeof(AstCall), Ast_Kind_Call);
implicit_call->token = binop->token;
- implicit_call->arg_count = 2;
implicit_call->callee = overload;
implicit_call->va_kind = VA_Kind_Not_VA;
AstCall* call_node = make_node(AstCall, Ast_Kind_Call);
call_node->token = expect_token(parser, '(');
call_node->callee = retval;
- call_node->arg_count = 0;
bh_arr_new(global_heap_allocator, call_node->arg_arr, 2);
+ bh_arr_new(global_heap_allocator, call_node->named_args, 2);
- while (parser->curr->type != ')') {
- if (parser->hit_unexpected_token) return retval;
-
- AstArgument* arg = make_node(AstArgument, Ast_Kind_Argument);
- arg->token = parser->curr;
- arg->value = parse_expression(parser, 0);
-
- if (arg != NULL && arg->kind != Ast_Kind_Error) {
- bh_arr_push(call_node->arg_arr, arg);
- call_node->arg_count++;
- }
+ parse_values_and_named_values(parser, ')',
+ (bh_arr(AstNode *) *) &call_node->arg_arr,
+ &call_node->named_args);
- if (parser->curr->type != ')')
- expect_token(parser, ',');
- }
+ // Wrap expressions in AstArgument
+ bh_arr_each(AstArgument *, arg, call_node->arg_arr)
+ *arg = make_argument(parser->allocator, (AstTyped *) *arg);
- consume_token(parser);
+ bh_arr_each(AstNamedValue *, named_value, call_node->named_args)
+ (*named_value)->value = (AstNode *) make_argument(parser->allocator, (AstTyped *) (*named_value)->value);
retval = (AstTyped *) call_node;
break;
bh_arr_insertn(call_node->arg_arr, 0, 1);
call_node->arg_arr[0] = make_argument(semstate.node_allocator, (*pipe)->left);
- call_node->arg_count++;
call_node->next = (*pipe)->next;
// NOTE: Not a BinaryOp node