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("\"");
}
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;
}
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;
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;
}
}
//
// 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;
}