mirror of
https://github.com/odin-lang/Odin.git
synced 2025-12-30 18:02:02 +00:00
Procedure grouping foo :: proc[foo16, foo32];
This commit is contained in:
@@ -164,6 +164,12 @@ Array<AstNode *> make_ast_node_array(AstFile *f, isize init_capacity = 8) {
|
||||
Token token; \
|
||||
AstNode *expr; \
|
||||
}) \
|
||||
AST_NODE_KIND(ProcGrouping, "procedure grouping", struct { \
|
||||
Token token; \
|
||||
Token open; \
|
||||
Token close; \
|
||||
Array<AstNode *> args; \
|
||||
}) \
|
||||
AST_NODE_KIND(ProcLit, "procedure literal", struct { \
|
||||
AstNode *type; \
|
||||
AstNode *body; \
|
||||
@@ -534,6 +540,7 @@ Token ast_node_token(AstNode *node) {
|
||||
case AstNode_Undef: return node->Undef;
|
||||
case AstNode_BasicLit: return node->BasicLit;
|
||||
case AstNode_BasicDirective: return node->BasicDirective.token;
|
||||
case AstNode_ProcGrouping: return node->ProcGrouping.token;
|
||||
case AstNode_ProcLit: return ast_node_token(node->ProcLit.type);
|
||||
case AstNode_CompoundLit:
|
||||
if (node->CompoundLit.type != nullptr) {
|
||||
@@ -662,6 +669,9 @@ AstNode *clone_ast_node(gbAllocator a, AstNode *node) {
|
||||
case AstNode_Ellipsis:
|
||||
n->Ellipsis.expr = clone_ast_node(a, n->Ellipsis.expr);
|
||||
break;
|
||||
case AstNode_ProcGrouping:
|
||||
n->ProcGrouping.args = clone_ast_node_array(a, n->ProcGrouping.args);
|
||||
break;
|
||||
case AstNode_ProcLit:
|
||||
n->ProcLit.type = clone_ast_node(a, n->ProcLit.type);
|
||||
n->ProcLit.body = clone_ast_node(a, n->ProcLit.body);
|
||||
@@ -1111,6 +1121,15 @@ AstNode *ast_ellipsis(AstFile *f, Token token, AstNode *expr) {
|
||||
}
|
||||
|
||||
|
||||
AstNode *ast_proc_grouping(AstFile *f, Token token, Token open, Token close, Array<AstNode *> args) {
|
||||
AstNode *result = make_ast_node(f, AstNode_ProcGrouping);
|
||||
result->ProcGrouping.token = token;
|
||||
result->ProcGrouping.open = open;
|
||||
result->ProcGrouping.close = close;
|
||||
result->ProcGrouping.args = args;
|
||||
return result;
|
||||
}
|
||||
|
||||
AstNode *ast_proc_lit(AstFile *f, AstNode *type, AstNode *body, u64 tags) {
|
||||
AstNode *result = make_ast_node(f, AstNode_ProcLit);
|
||||
result->ProcLit.type = type;
|
||||
@@ -2247,9 +2266,35 @@ AstNode *parse_operand(AstFile *f, bool lhs) {
|
||||
return expr;
|
||||
} break;
|
||||
|
||||
// Parse Procedure Type or Literal
|
||||
// Parse Procedure Type or Literal or Grouping
|
||||
case Token_proc: {
|
||||
Token token = expect_token(f, Token_proc);
|
||||
|
||||
if (f->curr_token.kind == Token_OpenBracket) { // ProcGrouping
|
||||
Token open = expect_token(f, Token_OpenBracket);
|
||||
|
||||
Array<AstNode *> args = {};
|
||||
array_init(&args, heap_allocator());
|
||||
|
||||
while (f->curr_token.kind != Token_CloseBracket &&
|
||||
f->curr_token.kind != Token_EOF) {
|
||||
AstNode *elem = parse_expr(f, false);
|
||||
array_add(&args, elem);
|
||||
|
||||
if (!allow_token(f, Token_Comma)) {
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
Token close = expect_token(f, Token_CloseBracket);
|
||||
|
||||
if (args.count == 0) {
|
||||
syntax_error(token, "Expected a least 1 argument in a procedure grouping");
|
||||
}
|
||||
|
||||
return ast_proc_grouping(f, token, open, close, args);
|
||||
}
|
||||
|
||||
AstNode *type = parse_proc_type(f, token);
|
||||
|
||||
if (f->allow_type && f->expr_level < 0) {
|
||||
|
||||
Reference in New Issue
Block a user