|
@@ -25,6 +25,11 @@ Token ast_token(Ast *node) {
|
|
return ast_token(node->SelectorExpr.selector);
|
|
return ast_token(node->SelectorExpr.selector);
|
|
}
|
|
}
|
|
return node->SelectorExpr.token;
|
|
return node->SelectorExpr.token;
|
|
|
|
+ case Ast_ImplicitSelectorExpr:
|
|
|
|
+ if (node->ImplicitSelectorExpr.selector != nullptr) {
|
|
|
|
+ return ast_token(node->ImplicitSelectorExpr.selector);
|
|
|
|
+ }
|
|
|
|
+ return node->ImplicitSelectorExpr.token;
|
|
case Ast_IndexExpr: return node->IndexExpr.open;
|
|
case Ast_IndexExpr: return node->IndexExpr.open;
|
|
case Ast_SliceExpr: return node->SliceExpr.open;
|
|
case Ast_SliceExpr: return node->SliceExpr.open;
|
|
case Ast_Ellipsis: return node->Ellipsis.token;
|
|
case Ast_Ellipsis: return node->Ellipsis.token;
|
|
@@ -165,6 +170,9 @@ Ast *clone_ast(Ast *node) {
|
|
n->SelectorExpr.expr = clone_ast(n->SelectorExpr.expr);
|
|
n->SelectorExpr.expr = clone_ast(n->SelectorExpr.expr);
|
|
n->SelectorExpr.selector = clone_ast(n->SelectorExpr.selector);
|
|
n->SelectorExpr.selector = clone_ast(n->SelectorExpr.selector);
|
|
break;
|
|
break;
|
|
|
|
+ case Ast_ImplicitSelectorExpr:
|
|
|
|
+ n->ImplicitSelectorExpr.selector = clone_ast(n->ImplicitSelectorExpr.selector);
|
|
|
|
+ break;
|
|
case Ast_IndexExpr:
|
|
case Ast_IndexExpr:
|
|
n->IndexExpr.expr = clone_ast(n->IndexExpr.expr);
|
|
n->IndexExpr.expr = clone_ast(n->IndexExpr.expr);
|
|
n->IndexExpr.index = clone_ast(n->IndexExpr.index);
|
|
n->IndexExpr.index = clone_ast(n->IndexExpr.index);
|
|
@@ -504,11 +512,20 @@ Ast *ast_call_expr(AstFile *f, Ast *proc, Array<Ast *> args, Token open, Token c
|
|
|
|
|
|
Ast *ast_selector_expr(AstFile *f, Token token, Ast *expr, Ast *selector) {
|
|
Ast *ast_selector_expr(AstFile *f, Token token, Ast *expr, Ast *selector) {
|
|
Ast *result = alloc_ast_node(f, Ast_SelectorExpr);
|
|
Ast *result = alloc_ast_node(f, Ast_SelectorExpr);
|
|
|
|
+ result->SelectorExpr.token = token;
|
|
result->SelectorExpr.expr = expr;
|
|
result->SelectorExpr.expr = expr;
|
|
result->SelectorExpr.selector = selector;
|
|
result->SelectorExpr.selector = selector;
|
|
return result;
|
|
return result;
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+Ast *ast_implicit_selector_expr(AstFile *f, Token token, Ast *selector) {
|
|
|
|
+ Ast *result = alloc_ast_node(f, Ast_ImplicitSelectorExpr);
|
|
|
|
+ result->ImplicitSelectorExpr.token = token;
|
|
|
|
+ result->ImplicitSelectorExpr.selector = selector;
|
|
|
|
+ return result;
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+
|
|
Ast *ast_index_expr(AstFile *f, Ast *expr, Ast *index, Token open, Token close) {
|
|
Ast *ast_index_expr(AstFile *f, Ast *expr, Ast *index, Token open, Token close) {
|
|
Ast *result = alloc_ast_node(f, Ast_IndexExpr);
|
|
Ast *result = alloc_ast_node(f, Ast_IndexExpr);
|
|
result->IndexExpr.expr = expr;
|
|
result->IndexExpr.expr = expr;
|
|
@@ -1612,7 +1629,6 @@ Ast *parse_operand(AstFile *f, bool lhs) {
|
|
case Token_offset_of:
|
|
case Token_offset_of:
|
|
return parse_call_expr(f, ast_implicit(f, advance_token(f)));
|
|
return parse_call_expr(f, ast_implicit(f, advance_token(f)));
|
|
|
|
|
|
-
|
|
|
|
case Token_String:
|
|
case Token_String:
|
|
return ast_basic_lit(f, advance_token(f));
|
|
return ast_basic_lit(f, advance_token(f));
|
|
|
|
|
|
@@ -2277,6 +2293,12 @@ Ast *parse_unary_expr(AstFile *f, bool lhs) {
|
|
Ast *expr = parse_unary_expr(f, lhs);
|
|
Ast *expr = parse_unary_expr(f, lhs);
|
|
return ast_unary_expr(f, token, expr);
|
|
return ast_unary_expr(f, token, expr);
|
|
}
|
|
}
|
|
|
|
+
|
|
|
|
+ case Token_Period: {
|
|
|
|
+ Token token = expect_token(f, Token_Period);
|
|
|
|
+ Ast *ident = parse_ident(f);
|
|
|
|
+ return ast_implicit_selector_expr(f, token, ident);
|
|
|
|
+ }
|
|
}
|
|
}
|
|
|
|
|
|
return parse_atom_expr(f, parse_operand(f, lhs), lhs);
|
|
return parse_atom_expr(f, parse_operand(f, lhs), lhs);
|