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 5d30acb51d2c..b733aa11971a 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 @@ -16,7 +16,6 @@ import com.intellij.codeInsight.intention.IntentionAction; import com.intellij.codeInsight.intention.QuickFixFactory; import com.intellij.codeInsight.intention.impl.PriorityIntentionActionWrapper; import com.intellij.codeInsight.quickfix.UnresolvedReferenceQuickFixUpdater; -import com.intellij.codeInspection.LocalQuickFixOnPsiElementAsIntentionAdapter; import com.intellij.codeInspection.dataFlow.fix.RedundantInstanceofFix; import com.intellij.core.JavaPsiBundle; import com.intellij.ide.IdeBundle; @@ -2232,7 +2231,7 @@ public final class HighlightUtil { arrayTypeFixChecked = true; } if (fix != null) { - info.registerFix(new LocalQuickFixOnPsiElementAsIntentionAdapter(fix), null, null, null, null); + info.registerFix(fix, null, null, null, null); } holder.add(info.create()); } diff --git a/java/java-analysis-impl/src/com/intellij/codeInsight/daemon/impl/quickfix/VariableArrayTypeFix.java b/java/java-analysis-impl/src/com/intellij/codeInsight/daemon/impl/quickfix/VariableArrayTypeFix.java index 8f0c472c7a6e..13965a945f59 100644 --- a/java/java-analysis-impl/src/com/intellij/codeInsight/daemon/impl/quickfix/VariableArrayTypeFix.java +++ b/java/java-analysis-impl/src/com/intellij/codeInsight/daemon/impl/quickfix/VariableArrayTypeFix.java @@ -1,28 +1,25 @@ // Copyright 2000-2023 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license. package com.intellij.codeInsight.daemon.impl.quickfix; -import com.intellij.codeInsight.FileModificationService; import com.intellij.codeInsight.daemon.QuickFixBundle; -import com.intellij.codeInsight.intention.FileModifier; import com.intellij.codeInsight.intention.impl.BaseIntentionAction; -import com.intellij.codeInspection.LocalQuickFixOnPsiElement; +import com.intellij.codeInspection.EditorUpdater; +import com.intellij.codeInspection.PsiUpdateModCommandAction; import com.intellij.codeInspection.util.IntentionFamilyName; import com.intellij.codeInspection.util.IntentionName; -import com.intellij.openapi.application.WriteAction; -import com.intellij.openapi.command.undo.UndoUtil; import com.intellij.openapi.project.Project; import com.intellij.psi.*; import com.intellij.psi.codeStyle.JavaCodeStyleManager; import com.intellij.psi.util.JavaElementKind; -import com.intellij.psi.util.PsiTreeUtil; import com.intellij.util.ObjectUtils; import org.jetbrains.annotations.NonNls; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; -public final class VariableArrayTypeFix extends LocalQuickFixOnPsiElement { - @NotNull - private final PsiArrayType myTargetType; +import java.util.Objects; + +public final class VariableArrayTypeFix extends PsiUpdateModCommandAction { + private final @NotNull PsiArrayType myTargetType; private final @IntentionName String myName; private final @IntentionFamilyName String myFamilyName; @@ -39,16 +36,6 @@ public final class VariableArrayTypeFix extends LocalQuickFixOnPsiElement { : "fix.variable.type.family"); } - private VariableArrayTypeFix(@NotNull PsiArrayInitializerExpression initializer, - @NotNull PsiArrayType targetType, - @IntentionName String name, - @IntentionFamilyName String familyName) { - super(initializer); - myTargetType = targetType; - myName = name; - myFamilyName = familyName; - } - @Nullable public static VariableArrayTypeFix createFix(PsiArrayInitializerExpression initializer, @NotNull PsiType componentType) { PsiArrayType arrayType = new PsiArrayType(componentType); @@ -108,12 +95,6 @@ public final class VariableArrayTypeFix extends LocalQuickFixOnPsiElement { return newText; } - @NotNull - @Override - public String getText() { - return myName; - } - @Override @NotNull public String getFamilyName() { @@ -121,74 +102,35 @@ public final class VariableArrayTypeFix extends LocalQuickFixOnPsiElement { } @Override - public boolean isAvailable(@NotNull Project project, - @NotNull PsiFile file, - @NotNull PsiElement startElement, - @NotNull PsiElement endElement) { - final PsiArrayInitializerExpression myInitializer = (PsiArrayInitializerExpression)startElement; - final PsiVariable myVariable = getVariableLocal(myInitializer); - - return myVariable != null - && myVariable.isValid() - && BaseIntentionAction.canModify(myVariable) - && myTargetType.isValid(); + protected @Nullable Presentation getPresentation(@NotNull ActionContext context, @NotNull PsiArrayInitializerExpression element) { + final PsiVariable variable = getVariableLocal(element); + if (variable == null || !BaseIntentionAction.canModify(variable) || !myTargetType.isValid()) return null; + return Presentation.of(myName); } @Override - public boolean startInWriteAction() { - PsiFile file = myStartElement.getContainingFile(); - return file != null && !file.isPhysical(); // for preview - } - - @Override - public @Nullable FileModifier getFileModifierForPreview(@NotNull PsiFile target) { - PsiArrayInitializerExpression initializer = ObjectUtils.tryCast(getStartElement(), PsiArrayInitializerExpression.class); - if (initializer == null) return null; - return new VariableArrayTypeFix(PsiTreeUtil.findSameElementInCopy(initializer, target), myTargetType, myName, myFamilyName); - } - - @Override - public void invoke(@NotNull Project project, @NotNull PsiFile file, @NotNull PsiElement startElement, @NotNull PsiElement endElement) { - final PsiArrayInitializerExpression myInitializer = (PsiArrayInitializerExpression)startElement; - final PsiVariable myVariable = getVariableLocal(myInitializer); - if (myVariable == null) return; + protected void invoke(@NotNull ActionContext context, @NotNull PsiArrayInitializerExpression initializer, @NotNull EditorUpdater updater) { + PsiVariable variable = getVariableLocal(initializer); + if (variable == null) return; + variable = updater.getWritable(variable); /* only for the case when in same statement with initialization */ - final PsiNewExpression myNewExpression = getNewExpressionLocal(myInitializer); + final PsiNewExpression myNewExpression = getNewExpressionLocal(initializer); - if (!file.isPhysical()) { - if (!myTargetType.equals(myVariable.getType()) && myVariable.getContainingFile().equals(file)) { - fixVariableType(project, file, myVariable); - } - - if (myNewExpression != null) { - fixArrayInitializer(myInitializer, myNewExpression); - } - return; - } - - if (!FileModificationService.getInstance().prepareFileForWrite(myVariable.getContainingFile())) return; - - if (! myTargetType.equals(myVariable.getType())) { - WriteAction.run(() -> fixVariableType(project, file, myVariable)); + if (!myTargetType.equals(variable.getType())) { + fixVariableType(context.project(), variable); } if (myNewExpression != null) { - if (!FileModificationService.getInstance().prepareFileForWrite(file)) return; - - WriteAction.run(() -> fixArrayInitializer(myInitializer, myNewExpression)); + fixArrayInitializer(initializer, myNewExpression); } } - private void fixVariableType(@NotNull Project project, @NotNull PsiFile file, PsiVariable myVariable) { + private void fixVariableType(@NotNull Project project, PsiVariable myVariable) { myVariable.normalizeDeclaration(); - myVariable.getTypeElement().replace(JavaPsiFacade.getElementFactory(project).createTypeElement(myTargetType)); + Objects.requireNonNull(myVariable.getTypeElement()).replace(JavaPsiFacade.getElementFactory(project).createTypeElement(myTargetType)); JavaCodeStyleManager.getInstance(project).shortenClassReferences(myVariable); - - if (! myVariable.getContainingFile().equals(file)) { - UndoUtil.markPsiFileForUndo(myVariable.getContainingFile()); - } } private void fixArrayInitializer(PsiArrayInitializerExpression myInitializer, PsiNewExpression myNewExpression) { diff --git a/java/java-impl-inspections/src/com/intellij/codeInspection/uncheckedWarnings/UncheckedWarningLocalInspection.java b/java/java-impl-inspections/src/com/intellij/codeInspection/uncheckedWarnings/UncheckedWarningLocalInspection.java index 7b06e7e62fc5..28ea16f7630e 100644 --- a/java/java-impl-inspections/src/com/intellij/codeInspection/uncheckedWarnings/UncheckedWarningLocalInspection.java +++ b/java/java-impl-inspections/src/com/intellij/codeInspection/uncheckedWarnings/UncheckedWarningLocalInspection.java @@ -336,10 +336,8 @@ public class UncheckedWarningLocalInspection extends AbstractBaseJavaLocalInspec public void visitArrayInitializerExpression(@NotNull PsiArrayInitializerExpression arrayInitializer) { super.visitArrayInitializerExpression(arrayInitializer); if (IGNORE_UNCHECKED_ASSIGNMENT) return; - final PsiType type = arrayInitializer.getType(); - if (!(type instanceof PsiArrayType)) return; - final PsiType componentType = ((PsiArrayType)type).getComponentType(); - + if (!(arrayInitializer.getType() instanceof PsiArrayType arrayType)) return; + final PsiType componentType = arrayType.getComponentType(); boolean arrayTypeFixChecked = false; VariableArrayTypeFix fix = null; @@ -361,7 +359,7 @@ public class UncheckedWarningLocalInspection extends AbstractBaseJavaLocalInspec } if (fix != null) { - registerProblem(description, null, expression, new LocalQuickFix[]{fix}); + registerProblem(description, null, expression, new LocalQuickFix[]{fix.asQuickFix()}); } } }