From 13177e391128d2edda6da2f2a88d346c1821d6e9 Mon Sep 17 00:00:00 2001 From: moraispgsi Date: Sun, 3 Mar 2019 22:36:17 +0000 Subject: [PATCH] Accounting for trailing new lines (should not indent) --- .../TransformationsTest.java | 34 +++++++++++++++++-- .../lexicalpreservation/Difference.java | 12 ++++--- 2 files changed, 40 insertions(+), 6 deletions(-) diff --git a/javaparser-core-testing/src/test/java/com/github/javaparser/printer/lexicalpreservation/TransformationsTest.java b/javaparser-core-testing/src/test/java/com/github/javaparser/printer/lexicalpreservation/TransformationsTest.java index d18ea5d286..f36feb32b7 100644 --- a/javaparser-core-testing/src/test/java/com/github/javaparser/printer/lexicalpreservation/TransformationsTest.java +++ b/javaparser-core-testing/src/test/java/com/github/javaparser/printer/lexicalpreservation/TransformationsTest.java @@ -200,7 +200,7 @@ void issue2099AddingStatementAfterTraillingComment2() { @Test - void AddingStatement1() { + void addingStatement1() { Statement statement = LexicalPreservingPrinter.setup(StaticJavaParser.parseStatement( " if(value != null) {" + EOL + " value.value();" + EOL + @@ -230,7 +230,7 @@ void AddingStatement1() { } @Test - void AddingStatement2() { + void addingStatement2() { Statement statement = LexicalPreservingPrinter.setup(StaticJavaParser.parseStatement( " if(value != null) {" + EOL + " value.value();" + EOL + @@ -258,4 +258,34 @@ void AddingStatement2() { "}"; assertEqualsNoEol(expected, s); } + + @Test + void addingStatement3() { + Statement statement = LexicalPreservingPrinter.setup(StaticJavaParser.parseStatement( + " if(value != null) {" + EOL + + " value.value();" + EOL + + " }")); + + CompilationUnit compilationUnit = LexicalPreservingPrinter.setup(StaticJavaParser.parse("public class Test {" + EOL + + " public void method() {" + EOL + + " value1();" + EOL + + " value2();" + EOL + EOL + + " }" + EOL + + "}")); + ClassOrInterfaceDeclaration classOrInterfaceDeclaration = (ClassOrInterfaceDeclaration)compilationUnit.getChildNodes().get(0); + MethodDeclaration methodDeclaration = (MethodDeclaration)classOrInterfaceDeclaration.getChildNodes().get(2); + methodDeclaration.getBody().get().addStatement(statement); + + String s = LexicalPreservingPrinter.print(compilationUnit); + String expected = "public class Test {\n" + + " public void method() {\n" + + " value1();\n" + + " value2();\n" + + " if(value != null) {\n" + + " value.value();\n" + + " }\n\n" + + " }\n" + + "}"; + assertEqualsNoEol(expected, s); + } } diff --git a/javaparser-core/src/main/java/com/github/javaparser/printer/lexicalpreservation/Difference.java b/javaparser-core/src/main/java/com/github/javaparser/printer/lexicalpreservation/Difference.java index 710010159b..9ce2f7dd61 100644 --- a/javaparser-core/src/main/java/com/github/javaparser/printer/lexicalpreservation/Difference.java +++ b/javaparser-core/src/main/java/com/github/javaparser/printer/lexicalpreservation/Difference.java @@ -518,8 +518,8 @@ private int rewindSpace(int index) { } } - private boolean nextIsRightBrace() { - List elements = originalElements.subList(originalIndex, originalElements.size()); + private boolean nextIsRightBrace(int index) { + List elements = originalElements.subList(index, originalElements.size()); for(TextElement element : elements) { if (!element.isSpaceOrTab()) { return element.isToken(RBRACE); @@ -550,7 +550,7 @@ private void applyAddedDiffElement(Added added) { boolean used = false; if (originalIndex > 0 && originalElements.get(originalIndex - 1).isNewline()) { List elements = processIndentation(indentation, originalElements.subList(0, originalIndex - 1)); - boolean nextIsRightBrace = nextIsRightBrace(); + boolean nextIsRightBrace = nextIsRightBrace(originalIndex); for (TextElement e : elements) { if (!nextIsRightBrace && e instanceof TokenTextElement @@ -606,7 +606,11 @@ private void applyAddedDiffElement(Added added) { if (addedTextElement.isNewline()) { boolean followedByUnindent = isFollowedByUnindent(diffElements, diffIndex); - originalIndex = adjustIndentation(indentation, nodeText, originalIndex, followedByUnindent); + boolean nextIsRightBrace = nextIsRightBrace(originalIndex); + boolean nextIsNewLine = nodeText.getTextElement(originalIndex).isNewline(); + if ((!nextIsNewLine && !nextIsRightBrace) || followedByUnindent) { + originalIndex = adjustIndentation(indentation, nodeText, originalIndex, followedByUnindent); + } } diffIndex++;