diff --git a/java/java-analysis-impl/src/com/intellij/codeInsight/daemon/impl/analysis/HighlightUtil.java b/java/java-analysis-impl/src/com/intellij/codeInsight/daemon/impl/analysis/HighlightUtil.java index 2d71b7b19ac6..8c3e4c86d632 100644 --- a/java/java-analysis-impl/src/com/intellij/codeInsight/daemon/impl/analysis/HighlightUtil.java +++ b/java/java-analysis-impl/src/com/intellij/codeInsight/daemon/impl/analysis/HighlightUtil.java @@ -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; } } diff --git a/java/java-analysis-impl/src/com/intellij/codeInsight/daemon/impl/quickfix/AddTypeArgumentsConditionalFix.java b/java/java-analysis-impl/src/com/intellij/codeInsight/daemon/impl/quickfix/AddTypeArgumentsConditionalFix.java index f91408bacf00..6fc7d3c50d7c 100644 --- a/java/java-analysis-impl/src/com/intellij/codeInsight/daemon/impl/quickfix/AddTypeArgumentsConditionalFix.java +++ b/java/java-analysis-impl/src/com/intellij/codeInsight/daemon/impl/quickfix/AddTypeArgumentsConditionalFix.java @@ -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() { diff --git a/java/java-analysis-impl/src/com/intellij/codeInsight/daemon/impl/quickfix/DeleteRepeatedInterfaceFix.java b/java/java-analysis-impl/src/com/intellij/codeInsight/daemon/impl/quickfix/DeleteRepeatedInterfaceFix.java index 7e5c32f3293e..98c19cbf1cdd 100644 --- a/java/java-analysis-impl/src/com/intellij/codeInsight/daemon/impl/quickfix/DeleteRepeatedInterfaceFix.java +++ b/java/java-analysis-impl/src/com/intellij/codeInsight/daemon/impl/quickfix/DeleteRepeatedInterfaceFix.java @@ -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 myConjList; + private final PsiTypeElement[] myConjList; - public DeleteRepeatedInterfaceFix(PsiTypeElement conjunct, List 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()))); } } }