Index: src/Boo.Lang.Compiler/Ast/Visitors/BooPrinterVisitor.cs =================================================================== --- src/Boo.Lang.Compiler/Ast/Visitors/BooPrinterVisitor.cs (revision 2712) +++ src/Boo.Lang.Compiler/Ast/Visitors/BooPrinterVisitor.cs (working copy) @@ -1050,21 +1050,16 @@ WriteConditionalBlock("while", node.Condition, node.Block); } - override public void OnIfStatement(IfStatement ifs) - { - WriteIndented(); - WriteKeyword("if "); - Visit(ifs.Condition); - WriteLine(":"); - Indent(); - WriteBlockStatements(ifs.TrueBlock); - Dedent(); - if (null != ifs.FalseBlock) + override public void OnIfStatement(IfStatement node) + { + WriteIfBlock("if ", node); + Block elseBlock = WriteElifs(node); + if (null != elseBlock) { WriteIndented(); WriteKeyword("else:"); WriteLine(); - WriteBlock(ifs.FalseBlock); + WriteBlock(elseBlock); } else { @@ -1073,8 +1068,38 @@ WriteEnd(); } } + } + + private Block WriteElifs(IfStatement node) + { + Block falseBlock = node.FalseBlock; + while (IsElif(falseBlock)) + { + IfStatement stmt = (IfStatement) falseBlock.Statements[0]; + WriteIfBlock("elif ", stmt); + falseBlock = stmt.FalseBlock; + } + return falseBlock; + } + + private void WriteIfBlock(string keyword, IfStatement ifs) + { + WriteIndented(); + WriteKeyword(keyword); + Visit(ifs.Condition); + WriteLine(":"); + Indent(); + WriteBlockStatements(ifs.TrueBlock); + Dedent(); + } + + private static bool IsElif(Block block) + { + if (block == null) return false; + if (block.Statements.Count != 1) return false; + return block.Statements[0] is IfStatement; } - + override public void OnDeclarationStatement(DeclarationStatement d) { WriteIndented(); Index: tests/Boo.Lang.Parser.Tests/WSABooParserTestCase.cs =================================================================== --- tests/Boo.Lang.Parser.Tests/WSABooParserTestCase.cs (revision 2712) +++ tests/Boo.Lang.Parser.Tests/WSABooParserTestCase.cs (working copy) @@ -76,11 +76,10 @@ print 'foo' if bar: print 'bar' + elif foo: + print 'foo' else: - if foo: - print 'foo' - else: - print 'uops...' + print 'uops...' print 'foo again' item[key]: Index: tests/testcases/parser/roundtrip/elif-1.boo =================================================================== --- tests/testcases/parser/roundtrip/elif-1.boo (revision 2712) +++ tests/testcases/parser/roundtrip/elif-1.boo (working copy) @@ -2,14 +2,12 @@ i = int.Parse(prompt('i: ')) if i > 5: print('i > 5') +elif i < 3: + print('i < 3') +elif i > 3: + print('4') else: - if i < 3: - print('i < 3') - else: - if i > 3: - print('4') - else: - print('3') + print('3') """ i = int.Parse(prompt('i: ')) if i > 5: Index: tests/testcases/parser/wsa/elif-1.boo =================================================================== --- tests/testcases/parser/wsa/elif-1.boo (revision 2712) +++ tests/testcases/parser/wsa/elif-1.boo (working copy) @@ -2,14 +2,12 @@ i = int.Parse(prompt('i: ')) if i > 5: print('i > 5') +elif i < 3: + print('i < 3') +elif i > 3: + print('4') else: - if i < 3: - print('i < 3') - else: - if i > 3: - print('4') - else: - print('3') + print('3') """ i = int.Parse(prompt('i: ')) if i > 5: