SortContentAction: support annotation array sorting

This commit is contained in:
Roman.Ivanov
2018-03-19 12:58:12 +07:00
parent 61a1b2eba6
commit 4b0eec673a
3 changed files with 54 additions and 1 deletions
@@ -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<PsiElement> 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<PsiArrayInitializerMemberValue> {
@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<PsiElement> getElements(@NotNull PsiArrayInitializerMemberValue elementToSort) {
return Arrays.asList(elementToSort.getInitializers());
}
}
private static class VarargSortable extends Sortable<VarargSortable.VarargContext> {
static class VarargContext {
private final @NotNull PsiExpressionList myExpressionList;
@@ -0,0 +1,5 @@
// "Sort content" "true"
@SuppressWarnings({"a", "b", "c", "d"})
public class Main {
}
@@ -0,0 +1,5 @@
// "Sort content" "true"
@SuppressWarnings({"c", "b", "d",<caret> "a"})
public class Main {
}