aboutsummaryrefslogtreecommitdiff
path: root/src/parser.cpp
diff options
context:
space:
mode:
authorgingerBill <bill@gingerbill.org>2020-05-22 14:54:30 +0100
committergingerBill <bill@gingerbill.org>2020-05-22 14:54:30 +0100
commit7bd1039a49e5fd771569cd1b5bca5b076d464a5f (patch)
tree06382e3a2cf5bb813981faac87086d4c736b1664 /src/parser.cpp
parent76a230372f59e873b09ce333fd466b433697b936 (diff)
Selector Call Expressions: `x->y(123) == x.y(x, 123)`
Diffstat (limited to 'src/parser.cpp')
-rw-r--r--src/parser.cpp24
1 files changed, 22 insertions, 2 deletions
diff --git a/src/parser.cpp b/src/parser.cpp
index 664aeb56d..8bde4a403 100644
--- a/src/parser.cpp
+++ b/src/parser.cpp
@@ -24,6 +24,11 @@ Token ast_token(Ast *node) {
return ast_token(node->SelectorExpr.selector);
}
return node->SelectorExpr.token;
+ case Ast_SelectorCallExpr:
+ if (node->SelectorCallExpr.expr != nullptr) {
+ return ast_token(node->SelectorCallExpr.expr);
+ }
+ return node->SelectorCallExpr.token;
case Ast_ImplicitSelectorExpr:
if (node->ImplicitSelectorExpr.selector != nullptr) {
return ast_token(node->ImplicitSelectorExpr.selector);
@@ -174,6 +179,10 @@ Ast *clone_ast(Ast *node) {
case Ast_ImplicitSelectorExpr:
n->ImplicitSelectorExpr.selector = clone_ast(n->ImplicitSelectorExpr.selector);
break;
+ case Ast_SelectorCallExpr:
+ n->SelectorCallExpr.expr = clone_ast(n->SelectorCallExpr.expr);
+ n->SelectorCallExpr.call = clone_ast(n->SelectorCallExpr.call);
+ break;
case Ast_IndexExpr:
n->IndexExpr.expr = clone_ast(n->IndexExpr.expr);
n->IndexExpr.index = clone_ast(n->IndexExpr.index);
@@ -546,6 +555,14 @@ Ast *ast_implicit_selector_expr(AstFile *f, Token token, Ast *selector) {
return result;
}
+Ast *ast_selector_call_expr(AstFile *f, Token token, Ast *expr, Ast *call) {
+ Ast *result = alloc_ast_node(f, Ast_SelectorCallExpr);
+ result->SelectorCallExpr.token = token;
+ result->SelectorCallExpr.expr = expr;
+ result->SelectorCallExpr.call = call;
+ return result;
+}
+
Ast *ast_index_expr(AstFile *f, Ast *expr, Ast *index, Token open, Token close) {
Ast *result = alloc_ast_node(f, Ast_IndexExpr);
@@ -2417,8 +2434,11 @@ Ast *parse_atom_expr(AstFile *f, Ast *operand, bool lhs) {
case Token_ArrowRight: {
Token token = advance_token(f);
- syntax_error(token, "Selector expressions use '.' rather than '->'");
- operand = ast_selector_expr(f, token, operand, parse_ident(f));
+ // syntax_error(token, "Selector expressions use '.' rather than '->'");
+
+ Ast *sel = ast_selector_expr(f, token, operand, parse_ident(f));
+ Ast *call = parse_call_expr(f, sel);
+ operand = ast_selector_call_expr(f, token, sel, call);
break;
}