using namespace ProgramSyntax;
+// XXX For some reason global declarations are emitted for otherwise undeclared local variables
+
ProgramCompiler::ProgramCompiler():
resources(0),
module(0)
void ProgramCompiler::append_module(ProgramSyntax::Module &mod)
{
- list<Import *> imports = apply<NodeGatherer<Import> >(mod.shared);
- for(list<Import *>::iterator i=imports.begin(); i!=imports.end(); ++i)
+ vector<Import *> imports = apply<NodeGatherer<Import> >(mod.shared);
+ for(vector<Import *>::iterator i=imports.begin(); i!=imports.end(); ++i)
import((*i)->module);
apply<NodeRemover>(mod.shared, set<Node *>(imports.begin(), imports.end()));
apply<VariableResolver>(stage);
apply<InterfaceGenerator>(stage);
apply<VariableResolver>(stage);
- apply<VariableRenamer>(stage);
apply<DeclarationReorderer>(stage);
apply<LegacyConverter>(stage);
}
ExpressionStatement *stmt = new ExpressionStatement;
stmt->expression = assign;
+ stmt->visit(*this);
insert_nodes.push_back(stmt);
}
if(i==prev_out.end())
i = prev_out.find(in_prefix+var.name);
if(i!=prev_out.end())
- generate_interface(*i->second, "in", var.name);
+ {
+ generate_interface(*i->second, "in", i->second->name);
+ var.name = i->second->name;
+ }
}
void ProgramCompiler::InterfaceGenerator::visit(VariableDeclaration &var)
{
remove_node = true;
if(var.init_expression)
+ {
insert_assignment(var.name, var.init_expression->clone());
+ return;
+ }
}
}
else if(var.interface=="in")
}
-void ProgramCompiler::VariableRenamer::visit(VariableReference &var)
-{
- if(var.declaration)
- var.name = var.declaration->name;
-}
-
-void ProgramCompiler::VariableRenamer::visit(VariableDeclaration &var)
-{
- if(var.linked_declaration)
- var.name = var.linked_declaration->name;
- TraversingVisitor::visit(var);
-}
-
-
ProgramCompiler::DeclarationReorderer::DeclarationReorderer():
kind(NO_DECLARATION)
{ }