Skip to content

Commit

Permalink
fix(if): print the else body when the body is not a block
Browse files Browse the repository at this point in the history
  • Loading branch information
tdurieux committed Oct 11, 2016
1 parent 2949d6c commit 49b9613
Show file tree
Hide file tree
Showing 4 changed files with 59 additions and 32 deletions.
44 changes: 17 additions & 27 deletions src/main/java/spoon/reflect/visitor/DefaultJavaPrettyPrinter.java
Original file line number Diff line number Diff line change
Expand Up @@ -16,16 +16,6 @@
*/
package spoon.reflect.visitor;

import java.lang.annotation.Annotation;
import java.util.ArrayDeque;
import java.util.Collection;
import java.util.Collections;
import java.util.Deque;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
import java.util.Objects;

import spoon.compiler.Environment;
import spoon.reflect.code.CtAnnotationFieldAccess;
import spoon.reflect.code.CtArrayAccess;
Expand Down Expand Up @@ -116,6 +106,16 @@
import spoon.reflect.visitor.printer.ElementPrinterHelper;
import spoon.reflect.visitor.printer.PrinterHelper;

import java.lang.annotation.Annotation;
import java.util.ArrayDeque;
import java.util.Collection;
import java.util.Collections;
import java.util.Deque;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
import java.util.Objects;

/**
* A visitor for generating Java code from the program compile-time model.
*/
Expand Down Expand Up @@ -618,7 +618,7 @@ public void visitCtContinue(CtContinue continueStatement) {
public void visitCtDo(CtDo doLoop) {
enterCtStatement(doLoop);
printer.write("do");
elementPrinterHelper.writeIfOrLoopBlock(doLoop.getBody(), this);
elementPrinterHelper.writeIfOrLoopBlock(doLoop.getBody());
printer.write("while (");
scan(doLoop.getLoopingExpression());
printer.write(" )");
Expand Down Expand Up @@ -940,7 +940,7 @@ public void visitCtFor(CtFor forLoop) {
printer.removeLastChar();
}
printer.write(")");
elementPrinterHelper.writeIfOrLoopBlock(forLoop.getBody(), this);
elementPrinterHelper.writeIfOrLoopBlock(forLoop.getBody());
}

@Override
Expand All @@ -951,7 +951,7 @@ public void visitCtForEach(CtForEach foreach) {
printer.write(" : ");
scan(foreach.getExpression());
printer.write(")");
elementPrinterHelper.writeIfOrLoopBlock(foreach.getBody(), this);
elementPrinterHelper.writeIfOrLoopBlock(foreach.getBody());
}

@Override
Expand All @@ -960,7 +960,7 @@ public void visitCtIf(CtIf ifElement) {
printer.write("if (");
scan(ifElement.getCondition());
printer.write(")");
elementPrinterHelper.writeIfOrLoopBlock(ifElement.getThenStatement(), this);
elementPrinterHelper.writeIfOrLoopBlock(ifElement.getThenStatement());
if (ifElement.getElseStatement() != null) {
List<CtComment> comments = elementPrinterHelper.getComments(ifElement, CommentOffset.INSIDE);
for (CtComment comment : comments) {
Expand All @@ -970,18 +970,8 @@ public void visitCtIf(CtIf ifElement) {
elementPrinterHelper.writeComment(comment);
}
}
printer.write(" else");
if (ifElement.getElseStatement() instanceof CtIf) {
if (!ifElement.getElseStatement().isImplicit()) {
printer.write(" ");
}
scan((CtStatement) ifElement.getElseStatement());
} else if (ifElement.getElseStatement() instanceof CtBlock) {
if (!ifElement.getElseStatement().isImplicit()) {
printer.write(" ");
}
scan((CtStatement) ifElement.getElseStatement());
}
printer.write("else");
elementPrinterHelper.writeIfOrLoopBlock(ifElement.getElseStatement());
}
}

Expand Down Expand Up @@ -1673,7 +1663,7 @@ public void visitCtWhile(CtWhile whileLoop) {
scan(whileLoop.getLoopingExpression());
printer.write(")");

elementPrinterHelper.writeIfOrLoopBlock(whileLoop.getBody(), this);
elementPrinterHelper.writeIfOrLoopBlock(whileLoop.getBody());
}

@Override
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -330,12 +330,19 @@ public List<CtComment> getComments(CtElement element, CommentOffset offset) {
return commentsToPrint;
}

public void writeIfOrLoopBlock(CtStatement block, DefaultJavaPrettyPrinter defaultJavaPrettyPrinter) {
public void writeIfOrLoopBlock(CtStatement block) {
if (block != null) {
if (!block.isImplicit()) {
if (!block.isImplicit() && (block instanceof CtBlock || block instanceof CtIf)) {
printer.write(" ");
}
defaultJavaPrettyPrinter.scan((CtStatement) block);
if (!(block instanceof CtBlock) && !(block instanceof CtIf)) {
printer.incTab();
printer.writeln().writeTabs();
}
writeStatement(block);
if (!(block instanceof CtBlock) && !(block instanceof CtIf)) {
printer.decTab().writeln().writeTabs();
}
if (!block.isImplicit()) {
if (!block.isParentInitialized() || (!(block.getParent() instanceof CtFor) && !(block.getParent() instanceof CtForEach) && !(block.getParent() instanceof CtIf))) {
printer.write(" ");
Expand Down
30 changes: 30 additions & 0 deletions src/test/java/spoon/test/condition/ConditionalTest.java
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,8 @@
import spoon.reflect.code.CtBlock;
import spoon.reflect.code.CtConditional;
import spoon.reflect.code.CtIf;
import spoon.reflect.code.CtStatement;
import spoon.reflect.declaration.CtMethod;
import spoon.reflect.declaration.CtType;
import spoon.reflect.visitor.filter.TypeFilter;
import spoon.test.condition.testclasses.Foo;
Expand Down Expand Up @@ -41,4 +43,32 @@ public void testBlockInConditionAndLoop() throws Exception {
}
}
}

@Test
public void testNoBlockInConditionAndLoop() throws Exception {
String newLine = System.getProperty("line.separator");

final CtType<Foo> aFoo = ModelUtils.buildClass(Foo.class);
CtMethod<Object> method = aFoo.getMethod("m3");
final List<CtIf> conditions = method.getElements(new TypeFilter<CtIf>(CtIf.class));
for (int i = 0; i < conditions.size(); i++) {
CtIf ctIf = conditions.get(i);

// replace the block to a statement
CtStatement then = ((CtBlock) ctIf.getThenStatement()).getStatement(0);
ctIf.setThenStatement(then);
if (ctIf.getElseStatement() != null) {
CtStatement elseStatement = ((CtBlock) ctIf.getElseStatement()).getStatement(0);
ctIf.setElseStatement(elseStatement);
}
}

assertEquals("if (true)" + newLine
+ " java.lang.System.out.println();" + newLine
+ "else if (true)" + newLine
+ " java.lang.System.out.println();" + newLine
+ "else" + newLine
+ " java.lang.System.out.println();" + newLine,
method.getBody().getStatement(0).toString());
}
}
4 changes: 2 additions & 2 deletions src/test/java/spoon/test/intercession/IntercessionTest.java
Original file line number Diff line number Diff line change
Expand Up @@ -120,7 +120,7 @@ public void test_setThrownExpression() {

@Test
public void testInsertIfIntercession() {
String ifCode = "if (1 == 0)\n" + " return 1;\n" + " else\n"
String ifCode = "if (1 == 0)\n" + " return 1;\n" + "else\n"
+ " return 0;\n" + "";
CtClass<?> clazz = factory
.Code()
Expand All @@ -147,7 +147,7 @@ public void testInsertIfIntercession() {
assertSame(r1, ifStmt.getElseStatement());

s = ifStmt.toString().replace("\r", "");
String ifCodeNew = "if (1 == 0)\n" + " return 0;\n" + " else\n"
String ifCodeNew = "if (1 == 0)\n" + " return 0;\n" + "else\n"
+ " return 1;\n" + "";
assertEquals(ifCodeNew, s);
}
Expand Down

0 comments on commit 49b9613

Please sign in to comment.