[java-inspection] IDEA-382122 IJ-CR-189661 Convert from compact source file

- reuse holder.problem().fix().register()

GitOrigin-RevId: ebbcc1c2b00b2dcfe58926ed973c303fed5dc950
This commit is contained in:
Mikhail Pyltsin
2026-02-02 14:22:38 +00:00
committed by intellij-monorepo-bot
parent 3ffc1737dc
commit 57db570c30
4 changed files with 68 additions and 45 deletions
@@ -9,25 +9,19 @@ import com.intellij.codeInsight.daemon.impl.quickfix.InsertMissingTokenFix;
import com.intellij.codeInsight.daemon.impl.quickfix.RenameUnderscoreFix;
import com.intellij.codeInsight.daemon.impl.quickfix.VariableAccessFromInnerClassJava10Fix;
import com.intellij.codeInsight.intention.CommonIntentionAction;
import com.intellij.codeInsight.intention.PriorityAction;
import com.intellij.codeInspection.streamMigration.SimplifyForEachInspection;
import com.intellij.core.JavaPsiBundle;
import com.intellij.java.codeserver.highlighting.errors.JavaErrorKinds;
import com.intellij.pom.java.JavaFeature;
import com.intellij.psi.PsiElement;
import com.intellij.psi.PsiErrorElement;
import com.intellij.psi.PsiImplicitClass;
import com.intellij.psi.PsiJavaCodeReferenceElement;
import com.intellij.psi.PsiMember;
import com.intellij.psi.PsiMethod;
import com.intellij.psi.PsiMethodCallExpression;
import com.intellij.psi.PsiReferenceExpression;
import com.intellij.psi.PsiSwitchBlock;
import com.intellij.psi.PsiSwitchLabelStatement;
import com.intellij.psi.PsiSwitchLabelStatementBase;
import com.intellij.psi.PsiSwitchLabeledRuleStatement;
import com.intellij.psi.PsiTryStatement;
import com.intellij.psi.util.JvmMainMethodSearcher;
import com.intellij.psi.util.PsiTreeUtil;
import com.intellij.psi.util.PsiUtil;
import org.jetbrains.annotations.NotNull;
@@ -48,36 +42,12 @@ public final class AdditionalJavaErrorFixProvider extends AbstractJavaErrorFixPr
new RenameUnderscoreFix(ref) : null);
fix(JavaErrorKinds.UNSUPPORTED_FEATURE, error -> {
if (error.context() != JavaFeature.IMPLICIT_CLASSES) return null;
PsiMember member = PsiTreeUtil.getNonStrictParentOfType(error.psi(), PsiMember.class);
if (!(member instanceof PsiMethod)) return null;
if (!(member.getContainingClass() instanceof PsiImplicitClass implicitClass)) return null;
boolean hasMainMethod = new JvmMainMethodSearcher() {
@Override
public boolean instanceMainMethodsEnabled(@NotNull PsiElement psiElement) {
return true;
}
@Override
protected boolean inheritedStaticMainEnabled(@NotNull PsiElement psiElement) {
return true;
}
}.hasMainMethod(implicitClass);
if (!hasMainMethod) return null;
if (PsiTreeUtil.hasErrorElements(implicitClass)) {
return null;
}
return new ImplicitToExplicitClassBackwardMigrationInspection.ReplaceWithExplicitClassFix(implicitClass);
return ImplicitToExplicitClassBackwardMigrationInspection.createFix(error.psi());
});
fix(JavaErrorKinds.REFERENCE_UNRESOLVED, error -> {
PsiJavaCodeReferenceElement psi = error.psi();
if (PsiUtil.isAvailable(JavaFeature.IMPLICIT_CLASSES, psi)) return null;
if (!(psi instanceof PsiReferenceExpression)) return null;
if (!(psi.getParent() instanceof PsiReferenceExpression parentReference)) return null;
if (!(parentReference.getParent() instanceof PsiMethodCallExpression methodCallExpression)) return null;
if (!MigrateFromJavaLangIoInspection.canBeIOPrint(methodCallExpression)) return null;
return new MigrateFromJavaLangIoInspection.ConvertIOToSystemOutFix(methodCallExpression)
.withPresentation(presentation -> presentation.withPriority(PriorityAction.Priority.HIGH));
return MigrateFromJavaLangIoInspection.createCanBeIOFix(error.psi());
});
}
@@ -4,7 +4,6 @@ package com.intellij.codeInspection;
import com.intellij.codeInspection.wrongPackageStatement.AdjustPackageNameFix;
import com.intellij.java.JavaBundle;
import com.intellij.modcommand.ActionContext;
import com.intellij.modcommand.ModCommandService;
import com.intellij.modcommand.ModPsiUpdater;
import com.intellij.modcommand.PsiUpdateModCommandAction;
import com.intellij.openapi.project.Project;
@@ -30,6 +29,7 @@ import com.intellij.psi.PsiImplicitClass;
import com.intellij.psi.PsiImportList;
import com.intellij.psi.PsiImportModuleStatement;
import com.intellij.psi.PsiJavaFile;
import com.intellij.psi.PsiMember;
import com.intellij.psi.PsiMethod;
import com.intellij.psi.PsiModifier;
import com.intellij.psi.PsiModifierList;
@@ -39,11 +39,13 @@ import com.intellij.psi.codeStyle.JavaCodeStyleSettings;
import com.intellij.psi.impl.file.PsiDirectoryFactory;
import com.intellij.psi.impl.source.codeStyle.ImportHelper;
import com.intellij.psi.impl.source.tree.java.PsiReferenceExpressionImpl;
import com.intellij.psi.util.JvmMainMethodSearcher;
import com.intellij.psi.util.PsiMethodUtil;
import com.intellij.psi.util.PsiTreeUtil;
import com.intellij.util.containers.ContainerUtil;
import org.jetbrains.annotations.Nls;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import java.util.List;
import java.util.Set;
@@ -79,22 +81,48 @@ public final class ImplicitToExplicitClassBackwardMigrationInspection extends Ab
return;
}
ReplaceWithExplicitClassFix fix = new ReplaceWithExplicitClassFix(aClass);
LocalQuickFix localQuickFix = ModCommandService.getInstance().wrapToQuickFix(fix);
if (InspectionProjectProfileManager.isInformationLevel(getShortName(), identifier)) {
TextRange textRange =
TextRange.create(0, method.getParameterList().getTextRange().getEndOffset() - method.getTextRange().getStartOffset());
holder.registerProblem(method, textRange, message, localQuickFix);
holder.problem(method, message)
.range(textRange)
.fix(fix)
.register();
}
else {
holder.registerProblem(identifier, message, localQuickFix);
holder.problem(identifier, message)
.fix(fix)
.register();
}
}
};
}
public static @Nullable PsiUpdateModCommandAction<PsiImplicitClass> createFix(@NotNull PsiElement psiElement) {
PsiMember member = PsiTreeUtil.getNonStrictParentOfType(psiElement, PsiMember.class);
if (!(member instanceof PsiMethod)) return null;
if (!(member.getContainingClass() instanceof PsiImplicitClass implicitClass)) return null;
boolean hasMainMethod = new JvmMainMethodSearcher() {
@Override
public boolean instanceMainMethodsEnabled(@NotNull PsiElement psiElement) {
return true;
}
@Override
protected boolean inheritedStaticMainEnabled(@NotNull PsiElement psiElement) {
return true;
}
}.hasMainMethod(implicitClass);
if (!hasMainMethod) return null;
if (PsiTreeUtil.hasErrorElements(implicitClass)) {
return null;
}
return new ImplicitToExplicitClassBackwardMigrationInspection.ReplaceWithExplicitClassFix(implicitClass);
}
public static class ReplaceWithExplicitClassFix extends PsiUpdateModCommandAction<PsiImplicitClass> {
protected ReplaceWithExplicitClassFix(@NotNull PsiImplicitClass element) {
private ReplaceWithExplicitClassFix(@NotNull PsiImplicitClass element) {
super(element);
}
@@ -1,10 +1,12 @@
// Copyright 2000-2025 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license.
package com.intellij.codeInspection;
import com.intellij.codeInsight.intention.PriorityAction;
import com.intellij.java.JavaBundle;
import com.intellij.modcommand.ActionContext;
import com.intellij.modcommand.ModCommandService;
import com.intellij.modcommand.ModCommandAction;
import com.intellij.modcommand.ModPsiUpdater;
import com.intellij.modcommand.Presentation;
import com.intellij.modcommand.PsiUpdateModCommandAction;
import com.intellij.psi.JavaElementVisitor;
import com.intellij.psi.PsiElement;
@@ -15,6 +17,7 @@ import com.intellij.psi.codeStyle.JavaCodeStyleManager;
import com.siyeh.ig.callMatcher.CallMatcher;
import com.siyeh.ig.psiutils.CommentTracker;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import static com.intellij.psi.CommonClassNames.JAVA_LANG_IO;
@@ -47,17 +50,34 @@ public final class MigrateFromJavaLangIoInspection extends AbstractBaseJavaLocal
if (!isIOPrint(expression)) return;
PsiReferenceExpression methodExpression = expression.getMethodExpression();
ConvertIOToSystemOutFix fix = new ConvertIOToSystemOutFix(expression);
LocalQuickFix localQuickFix = ModCommandService.getInstance().wrapToQuickFix(fix);
holder.registerProblem(methodExpression, JavaBundle.message("inspection.migrate.from.java.lang.io.name"), localQuickFix);
ConvertIOToSystemOutFix fix = new ConvertIOToSystemOutFix(expression, referenceName);
holder.problem(methodExpression, JavaBundle.message("inspection.migrate.from.java.lang.io.name"))
.fix(fix)
.register();
}
};
}
public static @Nullable ModCommandAction createCanBeIOFix(@NotNull PsiElement psi) {
if (!(psi instanceof PsiReferenceExpression)) return null;
if (!(psi.getParent() instanceof PsiReferenceExpression parentReference)) return null;
if (!(parentReference.getParent() instanceof PsiMethodCallExpression methodCallExpression)) return null;
if (!canBeIOPrint(methodCallExpression)) return null;
String referenceName = methodCallExpression.getMethodExpression().getReferenceName();
if (referenceName == null) return null;
return new MigrateFromJavaLangIoInspection.ConvertIOToSystemOutFix(methodCallExpression, referenceName)
.withPresentation(presentation -> presentation.withPriority(PriorityAction.Priority.HIGH));
}
public static class ConvertIOToSystemOutFix extends PsiUpdateModCommandAction<PsiMethodCallExpression> {
public ConvertIOToSystemOutFix(@NotNull PsiMethodCallExpression expression) {
@NotNull
private final String methodName;
private ConvertIOToSystemOutFix(@NotNull PsiMethodCallExpression expression,
@NotNull String name) {
super(expression);
methodName = name;
}
@Override
@@ -65,6 +85,11 @@ public final class MigrateFromJavaLangIoInspection extends AbstractBaseJavaLocal
return JavaBundle.message("inspection.migrate.from.java.lang.io.fix.family");
}
@Override
protected @Nullable Presentation getPresentation(@NotNull ActionContext context, @NotNull PsiMethodCallExpression element) {
return Presentation.of(JavaBundle.message("inspection.migrate.from.java.lang.io.fix.name", "System.out." + methodName + "()"));
}
@Override
protected void invoke(@NotNull ActionContext context, @NotNull PsiMethodCallExpression element, @NotNull ModPsiUpdater updater) {
replaceToSystemOut(element);
@@ -81,12 +106,12 @@ public final class MigrateFromJavaLangIoInspection extends AbstractBaseJavaLocal
}
}
public static boolean isIOPrint(@NotNull PsiMethodCallExpression expression) {
private static boolean isIOPrint(@NotNull PsiMethodCallExpression expression) {
if (!IO_PRINT.test(expression)) return false;
return MigrateToJavaLangIoInspection.callIOAndSystemIdentical(expression.getArgumentList());
}
public static boolean canBeIOPrint(@NotNull PsiMethodCallExpression expression) {
private static boolean canBeIOPrint(@NotNull PsiMethodCallExpression expression) {
if (!CAN_BE_IO_PRINT.test(expression)) return false;
return MigrateToJavaLangIoInspection.callIOAndSystemIdentical(expression.getArgumentList());
}