From: Brendan Hansen Date: Fri, 25 Feb 2022 21:12:30 +0000 (-0600) Subject: better method call support; method calls with blocks X-Git-Url: https://git.brendanfh.com/?a=commitdiff_plain;h=12a75877d35970a9f327ea0db80f45cdf18dca82;p=onyx.git better method call support; method calls with blocks --- diff --git a/core/conv.onyx b/core/conv.onyx index a076f0de..db154b29 100644 --- a/core/conv.onyx +++ b/core/conv.onyx @@ -521,8 +521,15 @@ format_any :: (output: ^Format_Output, formatting: ^Format, v: any) { case str { if formatting.quote_strings do output->write("\""); + width := formatting.minimum_width; + to_output := *cast(^str) v.data; + @Todo // escape '"' when quote_strings is enabled. - output->write(*(cast(^str) v.data)); + output->write(to_output); + if to_output.count < width && !formatting.quote_strings { + for width - to_output.count do output->write(#char " "); + } + if formatting.quote_strings do output->write("\""); } diff --git a/src/checker.c b/src/checker.c index 876576a7..eea13f55 100644 --- a/src/checker.c +++ b/src/checker.c @@ -1680,13 +1680,13 @@ CheckStatus check_method_call(AstBinaryOp** pmcall) { bh_arr_insertn(call_node->args.values, 0, 1); call_node->args.values[0] = implicit_argument; + + *pmcall = (AstBinaryOp *) mcall->right; + mcall->right->next = mcall->next; } mcall->flags |= Ast_Flag_Has_Been_Checked; - CHECK(call, &call_node); - call_node->next = mcall->next; - - *pmcall = (AstBinaryOp *) call_node; + CHECK(call, (AstCall **) pmcall); return Check_Success; } diff --git a/src/parser.c b/src/parser.c index 11f6ae53..fe4cff22 100644 --- a/src/parser.c +++ b/src/parser.c @@ -1411,7 +1411,7 @@ static AstNode* parse_statement(OnyxParser* parser) { case Token_Type_Literal_Float: case Token_Type_Literal_String: retval = (AstNode *) parse_compound_expression(parser, 1); - if (retval->kind == Ast_Kind_Call) { + if (retval->kind == Ast_Kind_Call || retval->kind == Ast_Kind_Method_Call) { if (parser->curr->type == '{') { AstCodeBlock* code_block = make_node(AstCodeBlock, Ast_Kind_Code_Block); code_block->token = parser->curr; @@ -1420,7 +1420,17 @@ static AstNode* parse_statement(OnyxParser* parser) { code_block->code = (AstNode *) parse_block(parser, 1, NULL); ((AstBlock *) code_block->code)->rules = Block_Rule_Code_Block; - bh_arr_push(((AstCall *) retval)->args.values, (AstTyped *) make_argument(context.ast_alloc, (AstTyped *) code_block)); + AstCall *dest = (AstCall *) retval; + if (dest->kind == Ast_Kind_Method_Call) { + dest = (AstCall *) ((AstBinaryOp *) dest)->right; + if (dest->kind != Ast_Kind_Call) { + onyx_report_error(retval->token->pos, Error_Critical, "Expected function call on right side of '->'."); + needs_semicolon = 0; + break; + } + } + + bh_arr_push(dest->args.values, (AstTyped *) make_argument(context.ast_alloc, (AstTyped *) code_block)); needs_semicolon = 0; } } diff --git a/src/symres.c b/src/symres.c index 9fdd9bfb..092f85d2 100644 --- a/src/symres.c +++ b/src/symres.c @@ -381,24 +381,24 @@ static SymresStatus symres_pipe(AstBinaryOp** pipe) { // // foo->member_function(...) static SymresStatus symres_method_call(AstBinaryOp** mcall) { - AstCall* call_node = (AstCall *) (*mcall)->right; - if (call_node->kind != Ast_Kind_Call) { - onyx_report_error((*mcall)->token->pos, Error_Critical, "'->' expected procedure call on right side."); - return Symres_Error; - } - SYMRES(expression, &(*mcall)->left); if ((*mcall)->left == NULL) return Symres_Error; // :EliminatingSymres if (((*mcall)->flags & Ast_Flag_Has_Been_Symres) == 0) { + if ((*mcall)->right->kind != Ast_Kind_Call) { + onyx_report_error((*mcall)->token->pos, Error_Critical, "'->' expected procedure call on right side."); + return Symres_Error; + } + AstFieldAccess* implicit_field_access = make_field_access(context.ast_alloc, (*mcall)->left, NULL); - implicit_field_access->token = call_node->callee->token; - call_node->callee = (AstTyped *) implicit_field_access; + implicit_field_access->token = ((AstCall *) (*mcall)->right)->callee->token; + ((AstCall *) (*mcall)->right)->callee = (AstTyped *) implicit_field_access; (*mcall)->flags |= Ast_Flag_Has_Been_Symres; } - SYMRES(expression, (AstTyped **) &call_node); + assert((*mcall)->right->kind == Ast_Kind_Call); + SYMRES(expression, (AstTyped **) &(*mcall)->right); return Symres_Success; }