From 1d230ce29f09b47362363b8cb94be57ec53a9a78 Mon Sep 17 00:00:00 2001 From: Brendan Hansen Date: Fri, 2 Sep 2022 23:39:28 -0500 Subject: [PATCH] BREAKING CHANGE: changed method parsing to allow for a->b()->c()... --- core/net/tcp.onyx | 2 +- src/checker.c | 1 + src/parser.c | 29 +++++++---------------------- src/symres.c | 5 ----- tests/aoc-2021/day15.onyx | 2 +- 5 files changed, 10 insertions(+), 29 deletions(-) diff --git a/core/net/tcp.onyx b/core/net/tcp.onyx index f57da68d..ced09615 100644 --- a/core/net/tcp.onyx +++ b/core/net/tcp.onyx @@ -183,7 +183,7 @@ tcp_server_make :: (max_clients := 32, allocator := context.allocator) -> ^TCP_S tcp_server_listen :: (use server: ^TCP_Server, port: u16) -> bool { sa: Socket_Address; make_ipv4_address(^sa, 0x00000000, port); - if !socket->bind(^sa) do return false; + if !(socket->bind(^sa)) do return false; socket->listen(); thread.spawn(^listener_thread, server, tcp_server_listener); diff --git a/src/checker.c b/src/checker.c index fb544399..333e331c 100644 --- a/src/checker.c +++ b/src/checker.c @@ -1726,6 +1726,7 @@ CheckStatus check_method_call(AstBinaryOp** pmcall) { CHECK(expression, &mcall->left); if (mcall->left->type == NULL) YIELD(mcall->token->pos, "Trying to resolve type of left hand side."); + mcall->type = mcall->left->type; AstTyped* implicit_argument = mcall->left; // Symbol resolution should have ensured that this is call node. diff --git a/src/parser.c b/src/parser.c index 7050bf65..1ccf7521 100644 --- a/src/parser.c +++ b/src/parser.c @@ -825,25 +825,6 @@ static AstTyped* parse_factor(OnyxParser* parser) { break; } - case Token_Type_Right_Arrow: { - AstBinaryOp* method_call = make_node(AstBinaryOp, Ast_Kind_Method_Call); - method_call->token = expect_token(parser, Token_Type_Right_Arrow); - method_call->left = retval; - method_call->right = parse_factor(parser); - - if (method_call->right && method_call->right->kind == Ast_Kind_Method_Call) { - AstBinaryOp *inner_method_call = (AstBinaryOp *) method_call->right; - method_call->right = inner_method_call->left; - inner_method_call->left = (AstTyped *) method_call; - - retval = (AstTyped *) inner_method_call; - - } else { - retval = (AstTyped *) method_call; - } - break; - } - case Token_Type_Keyword_If: { AstIfExpression* if_expression = make_node(AstIfExpression, Ast_Kind_If_Expression); if_expression->token = expect_token(parser, Token_Type_Keyword_If); @@ -909,6 +890,8 @@ static inline i32 get_precedence(BinaryOp kind) { case Binary_Op_Divide: return 8; case Binary_Op_Modulus: return 9; + + case Binary_Op_Method_Call: return 10; default: return -1; } @@ -955,6 +938,7 @@ static BinaryOp binary_op_from_token_type(TokenType t) { case Token_Type_Pipe: return Binary_Op_Pipe; case Token_Type_Dot_Dot: return Binary_Op_Range; case '[': return Binary_Op_Subscript; + case Token_Type_Right_Arrow: return Binary_Op_Method_Call; default: return Binary_Op_Count; } } @@ -1023,9 +1007,10 @@ static AstTyped* parse_expression(OnyxParser* parser, b32 assignment_allowed) { consume_token(parser); AstBinaryOp* bin_op; - if (bin_op_kind == Binary_Op_Pipe) bin_op = make_node(AstBinaryOp, Ast_Kind_Pipe); - else if (bin_op_kind == Binary_Op_Range) bin_op = (AstBinaryOp *) make_node(AstRangeLiteral, Ast_Kind_Range_Literal); - else bin_op = make_node(AstBinaryOp, Ast_Kind_Binary_Op); + if (bin_op_kind == Binary_Op_Pipe) bin_op = make_node(AstBinaryOp, Ast_Kind_Pipe); + else if (bin_op_kind == Binary_Op_Method_Call) bin_op = make_node(AstBinaryOp, Ast_Kind_Method_Call); + else if (bin_op_kind == Binary_Op_Range) bin_op = (AstBinaryOp *) make_node(AstRangeLiteral, Ast_Kind_Range_Literal); + else bin_op = make_node(AstBinaryOp, Ast_Kind_Binary_Op); bin_op->token = bin_op_tok; bin_op->operation = bin_op_kind; diff --git a/src/symres.c b/src/symres.c index ea2c400b..4410bb62 100644 --- a/src/symres.c +++ b/src/symres.c @@ -430,11 +430,6 @@ static SymresStatus symres_method_call(AstBinaryOp** mcall) { return Symres_Error; } - // AstAlias *left_alias = onyx_ast_node_new(context.ast_alloc, sizeof(AstAlias), Ast_Kind_Alias); - // left_alias->token = (*mcall)->left->token; - // left_alias->alias = (*mcall)->left; - // (*mcall)->left = (AstTyped *) left_alias; - AstFieldAccess* implicit_field_access = make_field_access(context.ast_alloc, (*mcall)->left, NULL); implicit_field_access->token = ((AstCall *) (*mcall)->right)->callee->token; ((AstCall *) (*mcall)->right)->callee = (AstTyped *) implicit_field_access; diff --git a/tests/aoc-2021/day15.onyx b/tests/aoc-2021/day15.onyx index 4fc704ab..86866002 100644 --- a/tests/aoc-2021/day15.onyx +++ b/tests/aoc-2021/day15.onyx @@ -46,7 +46,7 @@ main :: (args) => { attempt_add :: macro (cond: Code, dx, dy: i32) { if #unquote cond { - if !tried->has(.{try.x + dx, try.y + dy}) { + if !(tried->has(.{try.x + dx, try.y + dy})) { if found := array.find_ptr(to_try.data, .{try.x + dx, try.y + dy, 0}); found != null { found.cost = math.min(cell_value, found.cost); } else { -- 2.25.1