aboutsummaryrefslogtreecommitdiff
path: root/src/parser.cpp
diff options
context:
space:
mode:
authorgingerBill <bill@gingerbill.org>2018-06-02 19:44:34 +0100
committergingerBill <bill@gingerbill.org>2018-06-02 19:44:34 +0100
commit6202fb83738027a312c88f544c121b65823313c1 (patch)
treedc1d34551ce29eb3186849abf020d54f122e2150 /src/parser.cpp
parentced818ad5401270441106c58658e6ea5683d3faa (diff)
Re-allow `when` statements at the file scope
Diffstat (limited to 'src/parser.cpp')
-rw-r--r--src/parser.cpp29
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);
}
}
}