better method call support; method calls with blocks
authorBrendan Hansen <brendan.f.hansen@gmail.com>
Fri, 25 Feb 2022 21:12:30 +0000 (15:12 -0600)
committerBrendan Hansen <brendan.f.hansen@gmail.com>
Fri, 25 Feb 2022 21:12:30 +0000 (15:12 -0600)
core/conv.onyx
src/checker.c
src/parser.c
src/symres.c

index a076f0de1b8256fa4b3d4add442c6a1fc0b6fb0b..db154b290b34071a97b4682647ed7620fe0f9177 100644 (file)
@@ -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("\"");
         }
 
index 876576a733d5c022013bff2a82d6b2df8fb5dcde..eea13f55f65b1c8436041979674eeb170c0999a5 100644 (file)
@@ -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;
 }
 
index 11f6ae53ee917595a92844baf11b1fea5b589817..fe4cff224bb96a4f7f52424e3b57891f2babfe06 100644 (file)
@@ -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;
                 }
             }
index 9fdd9bfbacd9bbddb6a19a92028571f79bc69166..092f85d2434024ee22473a40337a1cc29a23ba3b 100644 (file)
@@ -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;
 }