diff options
| author | gingerBill <bill@gingerbill.org> | 2018-06-02 19:44:34 +0100 |
|---|---|---|
| committer | gingerBill <bill@gingerbill.org> | 2018-06-02 19:44:34 +0100 |
| commit | 6202fb83738027a312c88f544c121b65823313c1 (patch) | |
| tree | dc1d34551ce29eb3186849abf020d54f122e2150 /src/parser.cpp | |
| parent | ced818ad5401270441106c58658e6ea5683d3faa (diff) | |
Re-allow `when` statements at the file scope
Diffstat (limited to 'src/parser.cpp')
| -rw-r--r-- | src/parser.cpp | 29 |
1 files changed, 27 insertions, 2 deletions
diff --git a/src/parser.cpp b/src/parser.cpp index 697ccb2ec..98e3bc3c9 100644 --- a/src/parser.cpp +++ b/src/parser.cpp @@ -4162,10 +4162,33 @@ bool determine_path_from_string(Parser *p, AstNode *node, String base_dir, Strin } -void parse_setup_file_decls(Parser *p, AstFile *f, String base_dir, Array<AstNode *> decls) { + +void parse_setup_file_decls(Parser *p, AstFile *f, String base_dir, Array<AstNode *> &decls); + +void parse_setup_file_when_stmt(Parser *p, AstFile *f, String base_dir, AstNodeWhenStmt *ws) { + if (ws->body != nullptr) { + auto stmts = ws->body->BlockStmt.stmts; + parse_setup_file_decls(p, f, base_dir, stmts); + } + + if (ws->else_stmt != nullptr) { + switch (ws->else_stmt->kind) { + case AstNode_BlockStmt: { + auto stmts = ws->else_stmt->BlockStmt.stmts; + parse_setup_file_decls(p, f, base_dir, stmts); + } break; + case AstNode_WhenStmt: + parse_setup_file_when_stmt(p, f, base_dir, &ws->else_stmt->WhenStmt); + break; + } + } +} + +void parse_setup_file_decls(Parser *p, AstFile *f, String base_dir, Array<AstNode *> &decls) { for_array(i, decls) { AstNode *node = decls[i]; if (!is_ast_node_decl(node) && + node->kind != AstNode_WhenStmt && node->kind != AstNode_BadStmt && node->kind != AstNode_EmptyStmt) { // NOTE(bill): Sanity check @@ -4212,7 +4235,9 @@ void parse_setup_file_decls(Parser *p, AstFile *f, String base_dir, Array<AstNod } fl->fullpath = foreign_path; } - + } else if (node->kind == AstNode_WhenStmt) { + ast_node(ws, WhenStmt, node); + parse_setup_file_when_stmt(p, f, base_dir, ws); } } } |