diff --git a/stdlib/obj_lower.krak b/stdlib/obj_lower.krak index 5cf0fd6..ad509c1 100644 --- a/stdlib/obj_lower.krak +++ b/stdlib/obj_lower.krak @@ -19,6 +19,7 @@ import hash_set:* have a code block to insert them into that makes sure that they get run. 1 we also make a set of all type_defs for pass 4 + PASS TWO THROUGH name_ast_map 2 in another pass (more complicated because different children have different parent scopes) we transform the short circuit operators @@ -26,7 +27,7 @@ import hash_set:* temporaries. Also, pull out init method calls. 3 this is also when we add in defer destructs for function parameters (inside the function) and declaration statements - PASS TWO THROUGH name_ast_map + PASS THREE THROUGH name_ast_map 4 change all methods to take in self, change all method calls to pass in self, change all in method references to be explicit */ fun obj_lower(name_ast_map: *map,*ast_node>>, ast_to_syntax: *map<*ast_node, *tree>) { @@ -45,6 +46,8 @@ fun obj_lower(name_ast_map: *map,*ast_node>>, ast_to_ add_to_scope("~enclosing_scope", node, backing.body_statement) if (!is_code_block(backing.body_statement)) error("BUT EXTRA WHY") + if (!is_code_block(node->function.body_statement)) + error("BUT EXTRA WHY - now with more") } ast_node::if_statement(backing) { if (!is_code_block(backing.then_part)) { @@ -132,9 +135,28 @@ fun obj_lower(name_ast_map: *map,*ast_node>>, ast_to_ } } run_on_tree(ensure_block_and_munge, empty_pass_second_half(), syntax_ast_pair.second, &visited1) + }) + // make sure all blockes munged before we move ahead + name_ast_map->for_each(fun(name: string, syntax_ast_pair: pair<*tree,*ast_node>) { + var visit = hash_set<*ast_node>() + var short_check: fun(*ast_node,*stack<*ast_node>,*hash_set<*ast_node>): bool = fun(node: *ast_node, parent_chain: *stack<*ast_node>, visited: *hash_set<*ast_node>): bool { + match(*node) { + ast_node::function(backing) { + if (backing.body_statement && !is_code_block(backing.body_statement)) + error("Bad in short chec") + } + } + return true + } + run_on_tree(short_check, empty_pass_second_half(), syntax_ast_pair.second, &visit) + // Pass 2 var short_circut_op: fun(*ast_node,*stack<*ast_node>,*hash_set<*ast_node>): bool = fun(node: *ast_node, parent_chain: *stack<*ast_node>, visited: *hash_set<*ast_node>): bool { match(*node) { + ast_node::function(backing) { + if (backing.body_statement && !is_code_block(backing.body_statement)) + error("Bad in 2") + } ast_node::function_call(backing) { var func_name = string() if (is_function(backing.func)) {