]> git.tdb.fi Git - libs/gl.git/blobdiff - source/programcompiler.cpp
Better naming algorithm for objects in scene export
[libs/gl.git] / source / programcompiler.cpp
index 1f014f72c654d3e678f706cfff28f9d5173407f4..5a17a9ed3857bf969005e57a73ebe94d01b9ec20 100644 (file)
@@ -35,8 +35,6 @@ namespace GL {
 
 using namespace ProgramSyntax;
 
-// XXX For some reason global declarations are emitted for otherwise undeclared local variables
-
 ProgramCompiler::ProgramCompiler():
        resources(0),
        module(0)
@@ -545,14 +543,40 @@ void ProgramCompiler::Formatter::visit(Conditional &cond)
 
 void ProgramCompiler::Formatter::visit(Iteration &iter)
 {
-       formatted += "for(";
-       iter.init_statement->visit(*this);
-       formatted += ' ';
-       iter.condition->visit(*this);
-       formatted += "; ";
-       iter.loop_expression->visit(*this);
-       formatted += ")\n";
-       iter.body.visit(*this);
+       if(!iter.init_statement && iter.condition && !iter.loop_expression)
+       {
+               formatted += "while(";
+               iter.condition->visit(*this);
+               formatted += ')';
+       }
+       else
+       {
+               formatted += "for(";
+               if(iter.init_statement)
+                       iter.init_statement->visit(*this);
+               else
+                       formatted += ';';
+               if(iter.condition)
+               {
+                       formatted += ' ';
+                       iter.condition->visit(*this);
+               }
+               formatted += ';';
+               if(iter.loop_expression)
+               {
+                       formatted += ' ';
+                       iter.loop_expression->visit(*this);
+               }
+               formatted += ')';
+       }
+
+       if(iter.body.body.empty())
+               formatted += " { }";
+       else
+       {
+               formatted += '\n';
+               iter.body.visit(*this);
+       }
 }
 
 void ProgramCompiler::Formatter::visit(Return &ret)
@@ -1199,6 +1223,13 @@ void ProgramCompiler::FunctionInliner::visit(FunctionCall &call)
                inline_result = 0;
 }
 
+void ProgramCompiler::FunctionInliner::visit(VariableDeclaration &var)
+{
+       if(var.init_expression)
+               visit_and_inline(var.init_expression);
+       inline_result = 0;
+}
+
 void ProgramCompiler::FunctionInliner::visit(Return &ret)
 {
        TraversingVisitor::visit(ret);
@@ -1650,6 +1681,12 @@ void ProgramCompiler::NodeRemover::visit(VariableDeclaration &var)
                var.init_expression = 0;
 }
 
+void ProgramCompiler::NodeRemover::visit(Iteration &iter)
+{
+       if(to_remove.count(iter.init_statement.get()))
+               iter.init_statement = 0;
+}
+
 
 void ProgramCompiler::PrecisionRemover::visit(Precision &)
 {