10 #include <unordered_set>
23 std::unordered_set<ast::LocalVar*> local_variables_to_remove;
24 std::unordered_set<ast::Node*> local_nodes_to_remove;
25 std::shared_ptr<ast::AssignedBlock> assigned_block;
27 const auto& top_level_nodes = node.
get_blocks();
30 for (
auto& top_level_node: top_level_nodes) {
32 if (top_level_node->is_assigned_block()) {
33 assigned_block = std::static_pointer_cast<ast::AssignedBlock>(top_level_node);
37 if (!top_level_node->is_local_list_statement()) {
41 const auto& local_list_statement = std::static_pointer_cast<ast::LocalListStatement>(
44 for (
const auto& local_variable: local_list_statement->get_variables()) {
45 const auto& variable_name = local_variable->get_node_name();
47 if (symbol_table->lookup(variable_name)->get_write_count() > 0) {
48 assigned_variables.emplace_back(
49 std::make_shared<ast::AssignedDefinition>(local_variable->get_name(),
56 local_variables_to_remove.insert(local_variable.get());
61 local_list_statement->erase_local_var(local_variables_to_remove);
65 if (local_list_statement->get_variables().empty()) {
66 local_nodes_to_remove.insert(top_level_node.get());
74 if (assigned_block ==
nullptr) {
75 assigned_block = std::make_shared<ast::AssignedBlock>(assigned_variables);
78 for (
const auto& assigned_variable: assigned_variables) {
79 assigned_block->emplace_back_assigned_definition(assigned_variable);