X-Git-Url: http://git.tdb.fi/?p=libs%2Fgl.git;a=blobdiff_plain;f=source%2Fprogramcompiler.cpp;h=5a17a9ed3857bf969005e57a73ebe94d01b9ec20;hp=88ec6e59d88054480457be91cd0da9e14f201f02;hb=9d1fa012a23693768bbe287371e97751c03acc50;hpb=9339ae44a89f295523b6c25681d87642767864c4 diff --git a/source/programcompiler.cpp b/source/programcompiler.cpp index 88ec6e59..5a17a9ed 100644 --- a/source/programcompiler.cpp +++ b/source/programcompiler.cpp @@ -543,24 +543,40 @@ void ProgramCompiler::Formatter::visit(Conditional &cond) void ProgramCompiler::Formatter::visit(Iteration &iter) { - formatted += "for("; - if(iter.init_statement) - iter.init_statement->visit(*this); - else - formatted += ';'; - if(iter.condition) + if(!iter.init_statement && iter.condition && !iter.loop_expression) { - formatted += ' '; + formatted += "while("; iter.condition->visit(*this); + formatted += ')'; } - formatted += ';'; - if(iter.loop_expression) + else { - formatted += ' '; - iter.loop_expression->visit(*this); + 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); } - formatted += ')'; - iter.body.visit(*this); } void ProgramCompiler::Formatter::visit(Return &ret) @@ -1207,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); @@ -1658,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 &) {