void NodeRemover::visit(StructDeclaration &strct)
{
if(to_remove->count(&strct))
- remove_from_map(current_block->types, strct.name, strct);
+ remove_from_map(stage->types, strct.name, strct);
}
void NodeRemover::visit(VariableDeclaration &var)
{
if(to_remove->count(&iface))
{
- remove_from_map(current_block->interfaces, iface.name, iface);
+ remove_from_map(stage->interface_blocks, iface.name, iface);
if(!iface.instance_name.empty())
- remove_from_map(current_block->interfaces, iface.instance_name, iface);
+ remove_from_map(stage->interface_blocks, iface.instance_name, iface);
}
SetFlag set_recursive(recursive_remove, recursive_remove || to_remove->count(&iface));
TraversingVisitor::visit(iface);
}
+void NodeRemover::visit(FunctionDeclaration &func)
+{
+ if(to_remove->count(&func))
+ remove_from_map(stage->functions, func.name+func.signature, func);
+ TraversingVisitor::visit(func);
+}
+
void NodeRemover::visit(Iteration &iter)
{
if(to_remove->count(iter.init_statement.get()))
TraversingVisitor::visit(iter);
}
+
+NodeReorderer::NodeReorderer():
+ reorder_before(0),
+ to_reorder(0)
+{ }
+
+void NodeReorderer::apply(Stage &stage, Node &before, const set<Node *> &tr)
+{
+ reorder_before = &before;
+ to_reorder = &tr;
+ stage.content.visit(*this);
+}
+
+void NodeReorderer::visit(Block &block)
+{
+ NodeList<Statement>::iterator insert_point = block.body.end();
+ for(NodeList<Statement>::iterator i=block.body.begin(); i!=block.body.end(); )
+ {
+ (*i)->visit(*this);
+ if(insert_point!=block.body.end() && to_reorder->count(i->get()))
+ {
+ NodeList<Statement>::iterator j = i++;
+ block.body.splice(insert_point, block.body, j);
+ }
+ else
+ {
+ if(i->get()==reorder_before)
+ insert_point = i;
+ ++i;
+ }
+ }
+}
+
} // namespace SL
} // namespace GL
} // namespace Msp