diff --git a/core/src/main/java/com/google/googlejavaformat/java/RemoveUnusedImports.java b/core/src/main/java/com/google/googlejavaformat/java/RemoveUnusedImports.java index b2b484adc..c2d625348 100644 --- a/core/src/main/java/com/google/googlejavaformat/java/RemoveUnusedImports.java +++ b/core/src/main/java/com/google/googlejavaformat/java/RemoveUnusedImports.java @@ -56,6 +56,7 @@ import java.io.IOError; import java.io.IOException; import java.net.URI; +import java.util.Iterator; import java.util.LinkedHashSet; import java.util.Map; import java.util.Set; @@ -241,9 +242,11 @@ private static RangeMap buildReplacements( Set usedNames, Multimap> usedInJavadoc) { RangeMap replacements = TreeRangeMap.create(); + boolean isAllUnused = true; for (JCImport importTree : unit.getImports()) { String simpleName = getSimpleName(importTree); if (!isUnused(unit, usedNames, usedInJavadoc, importTree, simpleName)) { + isAllUnused = false; continue; } // delete the import @@ -256,6 +259,36 @@ private static RangeMap buildReplacements( } replacements.put(Range.closedOpen(importTree.getStartPosition(), endPosition), ""); } + + // If after deleting all import statements, there are blank lines before or after, + // delete one blank line. + if (isAllUnused && replacements.asMapOfRanges().size() > 0) { + Iterator> iterator = replacements.asMapOfRanges().keySet().iterator(); + Range range = iterator.next(); + int startPosition = range.lowerEndpoint(); + int endPosition; + boolean isDuplicateRange = true; + while (iterator.hasNext()) { + int endPositionOfPrevious = range.upperEndpoint(); + range = iterator.next(); + if (endPositionOfPrevious != range.lowerEndpoint()) { + isDuplicateRange = false; + break; + } + } + endPosition = range.upperEndpoint(); + if (isDuplicateRange) { + String sep = Newlines.guessLineSeparator(contents); + if (startPosition - sep.length() * 2 >= 0 + && contents.subSequence(startPosition - sep.length(), startPosition).toString().equals(sep) + && contents.subSequence(startPosition - sep.length() * 2, startPosition - sep.length()).toString().equals(sep)) { + replacements.put(Range.closedOpen(startPosition - sep.length(), startPosition), ""); + } else if (endPosition + sep.length() < contents.length() + && contents.subSequence(endPosition, endPosition + sep.length()).toString().equals(sep)) { + replacements.put(Range.closedOpen(endPosition, endPosition + sep.length()), ""); + } + } + } return replacements; } diff --git a/core/src/test/java/com/google/googlejavaformat/java/RemoveUnusedImportsTest.java b/core/src/test/java/com/google/googlejavaformat/java/RemoveUnusedImportsTest.java index 675bc8884..a60e7b0f3 100644 --- a/core/src/test/java/com/google/googlejavaformat/java/RemoveUnusedImportsTest.java +++ b/core/src/test/java/com/google/googlejavaformat/java/RemoveUnusedImportsTest.java @@ -255,6 +255,72 @@ public static Collection parameters() { "interface Test { private static void foo() {} }", }, }, + { + { + "package com.foo;", + "", + "import com.bar.A;", + "", + "class Test {", + "}", + }, + { + "package com.foo;", + "", + "class Test {", + "}", + }, + }, + { + { + "package com.sun.something;", + "", + "import com.x;", + "import com.y;", + "import com.z;", + "", + "class Test {", + "}", + }, + { + "package com.sun.something;", + "", + "class Test {", + "}", + }, + }, + { + { + "package com.foo;", + "// hello", + "import com.bar.A;", + "", + "class Test {", + "}", + }, + { + "package com.foo;", + "// hello", + "class Test {", + "}", + }, + }, + { + { + "package com.foo;", + "", + "import com.bar.A;", + "// hello", + "class Test {", + "}" + }, + { + "package com.foo;", + "// hello", + "class Test {", + "}" + }, + } }; ImmutableList.Builder builder = ImmutableList.builder(); for (String[][] inputAndOutput : inputsOutputs) {