mirror of
https://gitflic.ru/project/openide/openide.git
synced 2026-09-27 10:03:11 +07:00
AnnotateIntentionAction: support Unmodifiable(View) annotations in internal mode
Part of IDEA-182125
This commit is contained in:
@@ -14,6 +14,9 @@ import java.util.Collections;
|
||||
public enum Mutability {
|
||||
UNKNOWN, MUTABLE, UNMODIFIABLE, UNMODIFIABLE_VIEW;
|
||||
|
||||
public static final String UNMODIFIABLE_ANNOTATION = "org.jetbrains.annotations.Unmodifiable";
|
||||
public static final String UNMODIFIABLE_VIEW_ANNOTATION = "org.jetbrains.annotations.UnmodifiableView";
|
||||
|
||||
public boolean isUnmodifiable() {
|
||||
return this == UNMODIFIABLE || this == UNMODIFIABLE_VIEW;
|
||||
}
|
||||
@@ -37,13 +40,13 @@ public enum Mutability {
|
||||
return UNKNOWN;
|
||||
}
|
||||
}
|
||||
if (AnnotationUtil.isAnnotated(owner, Collections.singleton("org.jetbrains.annotations.Unmodifiable"),
|
||||
if (AnnotationUtil.isAnnotated(owner, Collections.singleton(UNMODIFIABLE_ANNOTATION),
|
||||
AnnotationUtil.CHECK_HIERARCHY |
|
||||
AnnotationUtil.CHECK_EXTERNAL |
|
||||
AnnotationUtil.CHECK_INFERRED)) {
|
||||
return UNMODIFIABLE;
|
||||
}
|
||||
if (AnnotationUtil.isAnnotated(owner, Collections.singleton("org.jetbrains.annotations.UnmodifiableView"),
|
||||
if (AnnotationUtil.isAnnotated(owner, Collections.singleton(UNMODIFIABLE_VIEW_ANNOTATION),
|
||||
AnnotationUtil.CHECK_HIERARCHY |
|
||||
AnnotationUtil.CHECK_EXTERNAL |
|
||||
AnnotationUtil.CHECK_INFERRED)) {
|
||||
|
||||
+51
-5
@@ -9,18 +9,18 @@ import com.intellij.codeInsight.NullableNotNullManager;
|
||||
import com.intellij.codeInsight.intention.AddAnnotationFix;
|
||||
import com.intellij.codeInsight.intention.AddAnnotationPsiFix;
|
||||
import com.intellij.codeInsight.intention.LowPriorityAction;
|
||||
import com.intellij.codeInspection.dataFlow.Mutability;
|
||||
import com.intellij.openapi.application.ex.ApplicationManagerEx;
|
||||
import com.intellij.openapi.editor.Editor;
|
||||
import com.intellij.openapi.project.Project;
|
||||
import com.intellij.openapi.ui.popup.JBPopupFactory;
|
||||
import com.intellij.openapi.ui.popup.PopupStep;
|
||||
import com.intellij.openapi.ui.popup.util.BaseListPopupStep;
|
||||
import com.intellij.openapi.util.text.StringUtil;
|
||||
import com.intellij.psi.CommonClassNames;
|
||||
import com.intellij.psi.PsiAnnotation;
|
||||
import com.intellij.psi.PsiFile;
|
||||
import com.intellij.psi.PsiModifierListOwner;
|
||||
import com.intellij.psi.*;
|
||||
import com.intellij.util.ArrayUtil;
|
||||
import com.intellij.util.IncorrectOperationException;
|
||||
import com.siyeh.ig.psiutils.ClassUtils;
|
||||
import one.util.streamex.MoreCollectors;
|
||||
import one.util.streamex.StreamEx;
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
@@ -34,7 +34,9 @@ public class AnnotateIntentionAction extends BaseIntentionAction implements LowP
|
||||
private static final AnnotationProvider[] PROVIDERS = {
|
||||
new DeprecationAnnotationProvider(),
|
||||
new NullableAnnotationProvider(),
|
||||
new NotNullAnnotationProvider()
|
||||
new NotNullAnnotationProvider(),
|
||||
new UnmodifiableAnnotationProvider(),
|
||||
new UnmodifiableViewAnnotationProvider()
|
||||
};
|
||||
private AnnotationProvider myAnnotationProvider;
|
||||
private boolean mySingleMode;
|
||||
@@ -203,4 +205,48 @@ public class AnnotateIntentionAction extends BaseIntentionAction implements LowP
|
||||
return NullableNotNullManager.getInstance(project).getNullables().toArray(ArrayUtil.EMPTY_STRING_ARRAY);
|
||||
}
|
||||
}
|
||||
|
||||
static class UnmodifiableAnnotationProvider implements AnnotationProvider {
|
||||
|
||||
@NotNull
|
||||
@Override
|
||||
public String getName(Project project) {
|
||||
return Mutability.UNMODIFIABLE_ANNOTATION;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isAvailable(PsiModifierListOwner owner) {
|
||||
return ApplicationManagerEx.getApplicationEx().isInternal() &&
|
||||
owner instanceof PsiMethod &&
|
||||
!ClassUtils.isImmutable(((PsiMethod)owner).getReturnType());
|
||||
}
|
||||
|
||||
@NotNull
|
||||
@Override
|
||||
public String[] getAnnotationsToRemove(Project project) {
|
||||
return new String[]{Mutability.UNMODIFIABLE_VIEW_ANNOTATION};
|
||||
}
|
||||
}
|
||||
|
||||
static class UnmodifiableViewAnnotationProvider implements AnnotationProvider {
|
||||
|
||||
@NotNull
|
||||
@Override
|
||||
public String getName(Project project) {
|
||||
return Mutability.UNMODIFIABLE_VIEW_ANNOTATION;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isAvailable(PsiModifierListOwner owner) {
|
||||
return ApplicationManagerEx.getApplicationEx().isInternal() &&
|
||||
owner instanceof PsiMethod &&
|
||||
!ClassUtils.isImmutable(((PsiMethod)owner).getReturnType());
|
||||
}
|
||||
|
||||
@NotNull
|
||||
@Override
|
||||
public String[] getAnnotationsToRemove(Project project) {
|
||||
return new String[]{Mutability.UNMODIFIABLE_ANNOTATION};
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user