Selector Call Expressions: x->y(123) == x.y(x, 123)

This commit is contained in:
gingerBill
2020-05-22 14:54:30 +01:00
parent 76a230372f
commit 7bd1039a49
7 changed files with 244 additions and 2023 deletions

View File

@@ -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;
}