From f7bbc47fe8e9406411d6e20ef029a0c17ac50962 Mon Sep 17 00:00:00 2001 From: Artemiy Sartakov Date: Wed, 29 May 2019 16:48:39 +0700 Subject: [PATCH] SortContentAction: consider error element as separator between sortable entries (IDEA-214843) GitOrigin-RevId: cda0be0ead288decd24b5dffe9ed00c327e7b14e --- .../intention/impl/SortContentAction.java | 15 ++++++++++++++- .../quickFix/sortContent/afterEnumComments7.java | 16 ++++++++++++++++ .../sortContent/beforeEnumComments7.java | 15 +++++++++++++++ 3 files changed, 45 insertions(+), 1 deletion(-) create mode 100644 java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/sortContent/afterEnumComments7.java create mode 100644 java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/sortContent/beforeEnumComments7.java 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 7ecb2806c05f..a45a5a6ba4e7 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 @@ -333,6 +333,13 @@ public class SortContentAction extends PsiElementBaseIntentionAction { List entryElements = ContainerUtil.map(entries, e -> e.myElement); if (entryElements.size() < MIN_ELEMENTS_COUNT) return null; if (!strategy.isSuitableElements(entryElements)) return null; + // in case when element after last sortable entry is an error element + // all comments until the end were glued to this entry, + // so now we need to remove them in order to avoid duplication + SortableEntry last = entries.get(entries.size() - 1); + if (last.myElement.getNextSibling() instanceof PsiErrorElement) { + last.myAfterSeparator.clear(); + } return new SortableList(entries, strategy, sm.myLineLayout, beforeFirst); } @@ -362,6 +369,10 @@ public class SortContentAction extends PsiElementBaseIntentionAction { return element instanceof PsiJavaToken && ((PsiJavaToken)element).getTokenType() == JavaTokenType.COMMA; } + boolean isError(@NotNull PsiElement element) { + return element instanceof PsiErrorElement; + } + private enum State { Element, @@ -425,7 +436,9 @@ public class SortContentAction extends PsiElementBaseIntentionAction { } return false; } - boolean isSeparator = mySortable.isSeparator(next); + boolean isSeparator = mySortable.isSeparator(next) || + // we assume that user forgot to add separator, so we consider error element as separator + ((myState == State.Element || myState == State.BetweenElementAndSeparator) && mySortable.isError(next)); switch (myState) { case Element: myEntryElement = myCurrent; diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/sortContent/afterEnumComments7.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/sortContent/afterEnumComments7.java new file mode 100644 index 000000000000..d3e26af59db9 --- /dev/null +++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/sortContent/afterEnumComments7.java @@ -0,0 +1,16 @@ +// "Sort content" "true" + +enum Colors { + CLUBS, + DIAMOND, + HEARTS, + SPADES + + + public enum Direction { + UP, DOWN + } + + //1 + + } \ No newline at end of file diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/sortContent/beforeEnumComments7.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/sortContent/beforeEnumComments7.java new file mode 100644 index 000000000000..66845859bdde --- /dev/null +++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/sortContent/beforeEnumComments7.java @@ -0,0 +1,15 @@ +// "Sort content" "true" + +enum Colors { + SPADES, + DIAMOND, + HEARTS, + CLUBS + + public enum Direction { + UP,DOWN + } + + //1 + +} \ No newline at end of file