[java-inspections] DeleteRepeatedInterfaceFix, AddTypeArgumentsConditionalFix: preview-friendly

GitOrigin-RevId: b8dc793c45a508402f15d8c48bc654caf0bef10d
This commit is contained in:
Tagir Valeev
2022-07-01 15:34:54 +00:00
committed by intellij-monorepo-bot
parent b6747215db
commit 63dac115ae
3 changed files with 26 additions and 10 deletions
@@ -274,7 +274,7 @@ public final class HighlightUtil {
HighlightInfo highlightInfo = HighlightInfo.newHighlightInfo(HighlightInfoType.ERROR)
.range(conjunct)
.descriptionAndTooltip(JavaErrorBundle.message("repeated.interface")).create();
QuickFixAction.registerQuickFixAction(highlightInfo, new DeleteRepeatedInterfaceFix(conjunct, conjList), null);
QuickFixAction.registerQuickFixAction(highlightInfo, new DeleteRepeatedInterfaceFix(conjunct), null);
return highlightInfo;
}
}
@@ -16,6 +16,7 @@
package com.intellij.codeInsight.daemon.impl.quickfix;
import com.intellij.codeInsight.daemon.impl.HighlightInfo;
import com.intellij.codeInsight.intention.FileModifier;
import com.intellij.codeInsight.intention.HighPriorityAction;
import com.intellij.codeInsight.intention.IntentionAction;
import com.intellij.java.analysis.JavaAnalysisBundle;
@@ -25,6 +26,7 @@ import com.intellij.openapi.project.Project;
import com.intellij.openapi.util.text.StringUtil;
import com.intellij.psi.*;
import com.intellij.psi.impl.source.resolve.DefaultParameterTypeInferencePolicy;
import com.intellij.psi.util.PsiTreeUtil;
import com.intellij.psi.util.PsiUtil;
import com.intellij.psi.util.TypeConversionUtil;
import com.intellij.util.IncorrectOperationException;
@@ -44,6 +46,11 @@ public class AddTypeArgumentsConditionalFix implements IntentionAction, HighPrio
myMethod = method;
}
@Override
public @Nullable FileModifier getFileModifierForPreview(@NotNull PsiFile target) {
return new AddTypeArgumentsConditionalFix(mySubstitutor, PsiTreeUtil.findSameElementInCopy(myExpression, target), myMethod);
}
@NotNull
@Override
public String getText() {
@@ -15,6 +15,7 @@
*/
package com.intellij.codeInsight.daemon.impl.quickfix;
import com.intellij.codeInsight.intention.FileModifier;
import com.intellij.codeInsight.intention.IntentionAction;
import com.intellij.java.analysis.JavaAnalysisBundle;
import com.intellij.openapi.editor.Editor;
@@ -25,17 +26,27 @@ import com.intellij.psi.codeStyle.CodeStyleManager;
import com.intellij.psi.util.PsiTreeUtil;
import com.intellij.util.IncorrectOperationException;
import com.intellij.util.containers.ContainerUtil;
import one.util.streamex.StreamEx;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import java.util.Arrays;
import java.util.List;
import java.util.Objects;
public class DeleteRepeatedInterfaceFix implements IntentionAction {
private final PsiTypeElement myConjunct;
private final List<? extends PsiTypeElement> myConjList;
private final PsiTypeElement[] myConjList;
public DeleteRepeatedInterfaceFix(PsiTypeElement conjunct, List<? extends PsiTypeElement> conjList) {
public DeleteRepeatedInterfaceFix(PsiTypeElement conjunct) {
myConjunct = conjunct;
myConjList = conjList;
PsiTypeElement[] elements = PsiTreeUtil.getChildrenOfType(myConjunct.getParent(), PsiTypeElement.class);
myConjList = elements == null ? PsiTypeElement.EMPTY_ARRAY : elements;
}
@Override
public @Nullable FileModifier getFileModifierForPreview(@NotNull PsiFile target) {
return new DeleteRepeatedInterfaceFix(PsiTreeUtil.findSameElementInCopy(myConjunct, target));
}
@NotNull
@@ -52,10 +63,8 @@ public class DeleteRepeatedInterfaceFix implements IntentionAction {
@Override
public boolean isAvailable(@NotNull Project project, Editor editor, PsiFile file) {
for (PsiTypeElement element : myConjList) {
if (!element.isValid()) return false;
}
return true;
if (myConjList.length == 0) return false;
return ContainerUtil.and(myConjList, PsiElement::isValid);
}
@Override
@@ -66,10 +75,10 @@ public class DeleteRepeatedInterfaceFix implements IntentionAction {
if (castType != null) {
final PsiType type = castType.getType();
if (type instanceof PsiIntersectionType) {
final String typeText = StringUtil.join(ContainerUtil.filter(myConjList, element -> element != myConjunct), element -> element.getText(), " & ");
final String typeText = StreamEx.of(myConjList).without(myConjunct).map(PsiElement::getText).joining(" & ");
final PsiTypeCastExpression newCastExpr =
(PsiTypeCastExpression)JavaPsiFacade.getElementFactory(project).createExpressionFromText("(" + typeText + ")a", castType);
CodeStyleManager.getInstance(project).reformat(castType.replace(newCastExpr.getCastType()));
CodeStyleManager.getInstance(project).reformat(castType.replace(Objects.requireNonNull(newCastExpr.getCastType())));
}
}
}