X-Git-Url: http://git.tdb.fi/?a=blobdiff_plain;f=source%2Fprogramcompiler.cpp;h=a730f74348f072fab4edd1398835b380b4295af4;hb=f9b23e69b63cbbeed8eeb605c0dc491002a4c23b;hp=fdbc83c7d4be404d7f07fe5a7c4757ac74596926;hpb=2b073e0a3808f8ece4b93669395e4b812214cf5d;p=libs%2Fgl.git diff --git a/source/programcompiler.cpp b/source/programcompiler.cpp index fdbc83c7..a730f743 100644 --- a/source/programcompiler.cpp +++ b/source/programcompiler.cpp @@ -171,7 +171,7 @@ void ProgramCompiler::Visitor::apply(Stage &s) ProgramCompiler::Formatter::Formatter(): indent(0), parameter_list(false), - else_if(false) + else_if(0) { } void ProgramCompiler::Formatter::visit(Literal &literal) @@ -241,31 +241,27 @@ void ProgramCompiler::Formatter::visit(ExpressionStatement &expr) void ProgramCompiler::Formatter::visit(Block &block) { - if(block.use_braces) - { - if(else_if) - { - formatted += '\n'; - else_if = false; - } - formatted += format("%s{\n", string(indent*2, ' ')); - } + if(else_if) + --else_if; + + unsigned brace_indent = indent; + bool use_braces = (block.use_braces || (indent && block.body.size()!=1)); + if(use_braces) + formatted += format("%s{\n", string(brace_indent*2, ' ')); - bool change_indent = (!formatted.empty() && !else_if); - indent += change_indent; + SetForScope set(indent, indent+!formatted.empty()); string spaces(indent*2, ' '); for(list >::iterator i=block.body.begin(); i!=block.body.end(); ++i) { if(i!=block.body.begin()) formatted += '\n'; - if(!else_if) - formatted += spaces; + formatted += spaces; (*i)->visit(*this); + else_if = 0; } - indent -= change_indent; - if(block.use_braces) - formatted += format("\n%s}", string(indent*2, ' ')); + if(use_braces) + formatted += format("\n%s}", string(brace_indent*2, ' ')); } void ProgramCompiler::Formatter::visit(Layout &layout) @@ -345,10 +341,9 @@ void ProgramCompiler::Formatter::visit(FunctionDeclaration &func) void ProgramCompiler::Formatter::visit(Conditional &cond) { if(else_if) - { - formatted += ' '; - else_if = false; - } + formatted.replace(formatted.rfind('\n'), string::npos, 1, ' '); + + indent -= else_if; formatted += "if("; cond.condition->visit(*this); @@ -357,8 +352,8 @@ void ProgramCompiler::Formatter::visit(Conditional &cond) cond.body.visit(*this); if(!cond.else_body.body.empty()) { - formatted += format("\n%selse", string(indent*2, ' ')); - SetFlag set(else_if); + formatted += format("\n%selse\n", string(indent*2, ' ')); + SetForScope set(else_if, 2); cond.else_body.visit(*this); } }