aboutsummaryrefslogtreecommitdiff
path: root/src/parser.cpp
diff options
context:
space:
mode:
authorGinger Bill <bill@gingerbill.org>2017-07-10 23:15:41 +0100
committerGinger Bill <bill@gingerbill.org>2017-07-10 23:15:41 +0100
commit3868a9a0f00185b6f8f587f67a62cbd12a215336 (patch)
tree70cb3e1b28ace5e2770f4b8747071b3eab24032d /src/parser.cpp
parentba5050ac7c2eb116b8989b7d387e67eb79eec62a (diff)
Clean up _preload.odin types
Diffstat (limited to 'src/parser.cpp')
-rw-r--r--src/parser.cpp25
1 files changed, 17 insertions, 8 deletions
diff --git a/src/parser.cpp b/src/parser.cpp
index ef4c9809b..8a55a31ea 100644
--- a/src/parser.cpp
+++ b/src/parser.cpp
@@ -4134,20 +4134,29 @@ AstNode *parse_match_stmt(AstFile *f) {
if (f->curr_token.kind != Token_OpenBrace) {
isize prev_level = f->expr_level;
f->expr_level = -1;
+ defer (f->expr_level = prev_level);
+
+ if (allow_token(f, Token_in)) {
+ Array<AstNode *> lhs = {};
+ Array<AstNode *> rhs = make_ast_node_array(f, 1);
+ array_add(&rhs, parse_expr(f, false));
- tag = parse_simple_stmt(f, StmtAllowFlag_In);
- if (tag->kind == AstNode_AssignStmt && tag->AssignStmt.op.kind == Token_in) {
+ tag = ast_assign_stmt(f, token, lhs, rhs);
is_type_match = true;
} else {
- if (allow_token(f, Token_Semicolon)) {
- init = tag;
- tag = nullptr;
- if (f->curr_token.kind != Token_OpenBrace) {
- tag = parse_simple_stmt(f, StmtAllowFlag_None);
+ tag = parse_simple_stmt(f, StmtAllowFlag_In);
+ if (tag->kind == AstNode_AssignStmt && tag->AssignStmt.op.kind == Token_in) {
+ is_type_match = true;
+ } else {
+ if (allow_token(f, Token_Semicolon)) {
+ init = tag;
+ tag = nullptr;
+ if (f->curr_token.kind != Token_OpenBrace) {
+ tag = parse_simple_stmt(f, StmtAllowFlag_None);
+ }
}
}
}
- f->expr_level = prev_level;
}
open = expect_token(f, Token_OpenBrace);