diff --git a/java/java-impl/src/com/intellij/codeInsight/intention/impl/SortContentAction.java b/java/java-impl/src/com/intellij/codeInsight/intention/impl/SortContentAction.java index e310b96544f2..35078ab5a724 100644 --- a/java/java-impl/src/com/intellij/codeInsight/intention/impl/SortContentAction.java +++ b/java/java-impl/src/com/intellij/codeInsight/intention/impl/SortContentAction.java @@ -195,56 +195,41 @@ public class SortContentAction extends PsiElementBaseIntentionAction { myAfterSeparator = afterSeparator; } - void generate(StringBuilder sb, boolean isLastInRow, boolean isLastInList) { + /** + * @return true iff eol required + */ + boolean generate(StringBuilder sb, boolean isLastInList) { sb.append(myElement.getText()); - handleElementsBeforeSeparator(sb, isLastInList); + + boolean newLineNeed = generateComments(sb, myBeforeSeparator); + if (newLineNeed) { + if (isLastInList && myAfterSeparator.isEmpty()) { + return true; + } else { + sb.append("\n"); + } + } + if (!isLastInList) { sb.append(","); - } else { - // last position, when before separator EOL comments and after separator some element present, we should place \n between then - // to avoid accidental commenting - if (!myBeforeSeparator.isEmpty()) { - PsiComment maybeComment = myBeforeSeparator.get(myBeforeSeparator.size() - 1); - if (maybeComment.getTokenType() == JavaTokenType.END_OF_LINE_COMMENT) { - if (!myAfterSeparator.isEmpty()) { - sb.append("\n"); - } - } - } - } - boolean newLineSet = false; - for (PsiComment comment : myAfterSeparator) { - sb.append(" ") - .append(comment.getText()); - if (comment.getTokenType() == JavaTokenType.END_OF_LINE_COMMENT) { - sb.append("\n"); - newLineSet = true; - } - else { - newLineSet = false; - } - } - if (isLastInRow && !newLineSet && !isLastInList) { - sb.append("\n"); } + return generateComments(sb, myAfterSeparator); } - - private void handleElementsBeforeSeparator(StringBuilder sb, boolean isLast) { + private static boolean generateComments(StringBuilder sb, List comments) { boolean newLineNeed = false; - for (PsiElement element : myBeforeSeparator) { + for (PsiComment element : comments) { if (newLineNeed) { sb.append('\n'); newLineNeed = false; } + sb.append(" "); sb.append(element.getText()); - if (element instanceof PsiComment && ((PsiComment)element).getTokenType() == JavaTokenType.END_OF_LINE_COMMENT) { + if (element.getTokenType() == JavaTokenType.END_OF_LINE_COMMENT) { newLineNeed = true; } } - if (!isLast && newLineNeed) { - sb.append('\n'); - } + return newLineNeed; } SortableEntry copy() { @@ -270,11 +255,14 @@ public class SortContentAction extends PsiElementBaseIntentionAction { myBeforeFirstElements = beforeFirstElements; } - void generate(StringBuilder sb) { + /** + * @return true iff eol required + */ + boolean generate(StringBuilder sb) { for (PsiElement beforeFirstElement : myBeforeFirstElements) { sb.append(beforeFirstElement.getText()); } - myLineLayout.generate(sb, myEntries); + return myLineLayout.generate(sb, myEntries); } void sort() { @@ -528,24 +516,35 @@ public class SortContentAction extends PsiElementBaseIntentionAction { myEntryCountOnLines.set(myCurrent, myEntryCountOnLines.get(myCurrent) + 1); } - private void generate(StringBuilder sb, List entries) { + /** + * @return true iff eol required + */ + private boolean generate(StringBuilder sb, List entries) { int entryIndex = 0; int lines = myEntryCountOnLines.size(); int currentEntryIndex = 0; int entryCount = entries.size(); + boolean eolRequired = false; for (int rowIndex = 0; rowIndex < lines; rowIndex++) { int entryCountOnRow = myEntryCountOnLines.get(rowIndex); if (entryCountOnRow == 0) { sb.append("\n"); + eolRequired = false; continue; } for (int rowPosition = 0; rowPosition < entryCountOnRow; rowPosition++) { currentEntryIndex++; boolean isLastInRow = rowPosition + 1 == entryCountOnRow && rowIndex + 1 != lines; - entries.get(entryIndex).generate(sb, isLastInRow, currentEntryIndex == entryCount); + boolean isLastInList = currentEntryIndex == entryCount; + eolRequired = entries.get(entryIndex).generate(sb, isLastInList); + if (!isLastInList && (isLastInRow || eolRequired)) { + sb.append("\n"); + eolRequired = false; + } entryIndex++; } } + return eolRequired; } } @@ -623,7 +622,10 @@ public class SortContentAction extends PsiElementBaseIntentionAction { @Override String generateReplacementText(@NotNull SortableList list, @NotNull PsiArrayInitializerExpression elementToSort) { StringBuilder sb = new StringBuilder(); - list.generate(sb); + boolean eolReuqired = list.generate(sb); + if (eolReuqired) { + sb.append("\n"); + } sb.append("}"); return sb.toString(); } diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/sortContent/afterEnumComments.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/sortContent/afterEnumComments.java index b619ccbe8b19..4a63a9adf733 100644 --- a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/sortContent/afterEnumComments.java +++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/sortContent/afterEnumComments.java @@ -1,13 +1,13 @@ // "Sort content" "true" public enum OSType { - LINUX// linux + LINUX // linux , - MAC//mac + MAC //mac , - WIN//after win -// win + WIN //after win + // win ; diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/sortContent/afterEnumComments2.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/sortContent/afterEnumComments2.java index 19b2c3101fc0..e1af0ebb337a 100644 --- a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/sortContent/afterEnumComments2.java +++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/sortContent/afterEnumComments2.java @@ -4,6 +4,6 @@ public enum Enum { A, B, - C// foo + C // foo ; } \ No newline at end of file diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/sortContent/afterMultipleOnLineComments.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/sortContent/afterMultipleOnLineComments.java index cd83468782d4..ad547efe8740 100644 --- a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/sortContent/afterMultipleOnLineComments.java +++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/sortContent/afterMultipleOnLineComments.java @@ -7,8 +7,8 @@ public class Main { new String[]{ "aaa", // a "bbb", - "ccc"/* c */, "dd", // d - "ff"// f + "ccc" /* c */, "dd", // d + "ff" // f }; } } diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/sortContent/afterStringArrayComments.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/sortContent/afterStringArrayComments.java index 32b856ab433e..7efeac9fe624 100644 --- a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/sortContent/afterStringArrayComments.java +++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/sortContent/afterStringArrayComments.java @@ -7,7 +7,7 @@ public class Main { new String[]{ "aaa", // a "bbb", // b - "ccc"/* c */ + "ccc" /* c */ }; } } diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/sortContent/afterStringArrayComments2.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/sortContent/afterStringArrayComments2.java new file mode 100644 index 000000000000..268aea336647 --- /dev/null +++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/sortContent/afterStringArrayComments2.java @@ -0,0 +1,11 @@ +// "Sort content" "true" + +import java.util.*; + +public class Main { + private void test() { + String[] s = new String[]{"a", "b", + "c" //simple end comment + }; + } +} diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/sortContent/afterStringArrayCommentsLast.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/sortContent/afterStringArrayCommentsLast.java index 0a9a214530c6..8f436e0ba245 100644 --- a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/sortContent/afterStringArrayCommentsLast.java +++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/sortContent/afterStringArrayCommentsLast.java @@ -7,6 +7,6 @@ public class Main { new String[]{ "aaa", // a "bbb", // b - "ccc"/* c */}; + "ccc" /* c */}; } } diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/sortContent/afterStringArrayCommentsLayout.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/sortContent/afterStringArrayCommentsLayout.java index 4c362fcef33a..b0c5902ee02a 100644 --- a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/sortContent/afterStringArrayCommentsLayout.java +++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/sortContent/afterStringArrayCommentsLayout.java @@ -11,7 +11,7 @@ public class Main { "Martinez", "Miller", "Moore", "Robinson", "Rodriguez", "Smith", "Taylor", "Thomas", "Thompson", "Walker", "White", //B - "Williams", "Wilson", "Young"//Z + "Williams", "Wilson", "Young" //Z }; } diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/sortContent/afterStringComments.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/sortContent/afterStringComments.java index b3d925dd6b0c..2b611631909f 100644 --- a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/sortContent/afterStringComments.java +++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/sortContent/afterStringComments.java @@ -10,8 +10,7 @@ public class Test { "100+10", "100+3..999", - "100..999"//simple end comment + "100..999" //simple end comment //simple end comment - }; } \ No newline at end of file diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/sortContent/afterStringVarargComments.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/sortContent/afterStringVarargComments.java index 48c31c21084c..dd82b60eca19 100644 --- a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/sortContent/afterStringVarargComments.java +++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/sortContent/afterStringVarargComments.java @@ -10,10 +10,10 @@ public class Main { // 4 "bar", - "baz"// 7 -// 8 + "baz" // 7 + // 8 , - "foo"/*3*/ // 2 + "foo" /*3*/ // 2 // 5 diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/sortContent/afterStringVarargComments2.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/sortContent/afterStringVarargComments2.java index b2b1db9b54b4..a26bd0d0e4d0 100644 --- a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/sortContent/afterStringVarargComments2.java +++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/sortContent/afterStringVarargComments2.java @@ -10,7 +10,7 @@ public class Main { "aaa", "bbb", - "ccc"//comment + "ccc" //comment ); } } diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/sortContent/beforeStringArrayComments2.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/sortContent/beforeStringArrayComments2.java new file mode 100644 index 000000000000..9d422fb70930 --- /dev/null +++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/sortContent/beforeStringArrayComments2.java @@ -0,0 +1,10 @@ +// "Sort content" "true" + +import java.util.*; + +public class Main { + private void test() { + String[] s = new String[]{"a", "c"//simple end comment + , "b"}; + } +}