From 19bfb9be67778a3c42b79a88e4687fc6f8ad9051 Mon Sep 17 00:00:00 2001 From: "Roman.Ivanov" Date: Thu, 21 Jun 2018 11:52:42 +0700 Subject: [PATCH] SortContentAction: prevent sorting when enum entries have dependencies --- .../intention/impl/SortContentAction.java | 18 ++++++++++++++---- .../sortContent/beforeEnumDependants.java | 11 +++++++++++ 2 files changed, 25 insertions(+), 4 deletions(-) create mode 100644 java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/sortContent/beforeEnumDependants.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 8fb4e23bf46d..7584480800e6 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 @@ -20,10 +20,7 @@ import org.jetbrains.annotations.Nls; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.Comparator; -import java.util.List; +import java.util.*; import java.util.stream.Collectors; import static com.intellij.util.ObjectUtils.tryCast; @@ -163,6 +160,19 @@ public class SortContentAction extends PsiElementBaseIntentionAction { public Comparator getComparator() { return Comparator.comparing(el -> ((PsiEnumConstant)el).getName()); } + + @Override + public boolean isSuitableElements(List elements) { + Set names = elements.stream().map(element -> ((PsiEnumConstant)element).getName()).collect(Collectors.toSet()); + for (PsiElement element: elements) { + PsiEnumConstant enumConstant = (PsiEnumConstant)element; + if(StreamEx.ofTree((PsiElement)enumConstant.getArgumentList(), el -> StreamEx.of(el.getChildren())) + .select(PsiReferenceExpression.class) + .map(ref -> ref.getReferenceName()) + .anyMatch(refName -> names.contains(refName))) return false; + } + return true; + } } private static class SortableEntry { diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/sortContent/beforeEnumDependants.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/sortContent/beforeEnumDependants.java new file mode 100644 index 000000000000..f751d9a73310 --- /dev/null +++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/sortContent/beforeEnumDependants.java @@ -0,0 +1,11 @@ +// "Sort content" "false" + +enum E { + Foo(null), + Bar(Foo), + Baz(null); + + E(E e) { + + } +}