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 dc638659cb3e..3df133ee6e19 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 @@ -38,7 +38,8 @@ public class SortContentAction extends PsiElementBaseIntentionAction { private static final Sortable[] OUR_SORTABLES = new Sortable[]{ new ArrayInitializerSortable(), new VarargSortable(), - new EnumConstantDeclarationSortable() + new EnumConstantDeclarationSortable(), + new AnnotationArraySortable() }; @@ -527,6 +528,9 @@ public class SortContentAction extends PsiElementBaseIntentionAction { } } + /** + * Generates replacement for elementToSort + */ abstract String generateReplacementText(@NotNull SortableList list, T elementToSort); @Override @@ -548,8 +552,14 @@ public class SortContentAction extends PsiElementBaseIntentionAction { return getElements(context.myElement); } + /** + * Returns only elements to sort. It may be simpler than iterating over all and creating {@link SortableList}. + */ abstract List getElements(@NotNull T elementToSort); + /** + * Return element, which children will be sorted. This element will be replaced with new one. + */ @Nullable abstract T getElementToSort(@NotNull PsiElement origin); @@ -600,6 +610,39 @@ public class SortContentAction extends PsiElementBaseIntentionAction { } } + private static class AnnotationArraySortable extends ElementBasedSortable { + @Override + boolean isEnd(@NotNull PsiElement element) { + return element instanceof PsiJavaToken && ((PsiJavaToken)element).getTokenType() == JavaTokenType.RBRACE; + } + + @NotNull + @Override + SortingStrategy[] sortStrategies() { + return EXPRESSION_SORTING_STRATEGIES; + } + + + @Override + String generateReplacementText(@NotNull SortableList list, @NotNull PsiArrayInitializerMemberValue elementToSort) { + StringBuilder sb = new StringBuilder(); + list.generate(sb); + sb.append("}"); + return sb.toString(); + } + + @Nullable + @Override + PsiArrayInitializerMemberValue getElementToSort(@NotNull PsiElement origin) { + return PsiTreeUtil.getParentOfType(origin, PsiArrayInitializerMemberValue.class); + } + + @Override + List getElements(@NotNull PsiArrayInitializerMemberValue elementToSort) { + return Arrays.asList(elementToSort.getInitializers()); + } + } + private static class VarargSortable extends Sortable { static class VarargContext { private final @NotNull PsiExpressionList myExpressionList; diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/sortContent/afterAnnotation.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/sortContent/afterAnnotation.java new file mode 100644 index 000000000000..91701e11eb84 --- /dev/null +++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/sortContent/afterAnnotation.java @@ -0,0 +1,5 @@ +// "Sort content" "true" + +@SuppressWarnings({"a", "b", "c", "d"}) +public class Main { +} diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/sortContent/beforeAnnotation.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/sortContent/beforeAnnotation.java new file mode 100644 index 000000000000..6648a0bf4d85 --- /dev/null +++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/sortContent/beforeAnnotation.java @@ -0,0 +1,5 @@ +// "Sort content" "true" + +@SuppressWarnings({"c", "b", "d", "a"}) +public class Main { +}