[java-intentions] VariableArrayTypeFix: ModCommand migration

GitOrigin-RevId: 024cf2846d3810e1124fa17671b13982842483b1
This commit is contained in:
Tagir Valeev
2023-06-16 20:28:58 +00:00
committed by intellij-monorepo-bot
parent 1dd7941c30
commit 91522732c3
3 changed files with 24 additions and 85 deletions
@@ -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());
}
@@ -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<PsiArrayInitializerExpression> {
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) {
@@ -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()});
}
}
}