From 57db570c30a65381dd9349a076bd951c20606772 Mon Sep 17 00:00:00 2001 From: Mikhail Pyltsin Date: Mon, 2 Feb 2026 11:06:45 +0100 Subject: [PATCH] [java-inspection] IDEA-382122 IJ-CR-189661 Convert from compact source file - reuse holder.problem().fix().register() GitOrigin-RevId: ebbcc1c2b00b2dcfe58926ed973c303fed5dc950 --- .../AdditionalJavaErrorFixProvider.java | 34 +--------------- ...licitClassBackwardMigrationInspection.java | 38 +++++++++++++++--- .../MigrateFromJavaLangIoInspection.java | 39 +++++++++++++++---- .../MigrateFromJavaLangIoInspectionTest.java | 2 +- 4 files changed, 68 insertions(+), 45 deletions(-) diff --git a/java/java-impl-inspections/src/com/intellij/codeInspection/AdditionalJavaErrorFixProvider.java b/java/java-impl-inspections/src/com/intellij/codeInspection/AdditionalJavaErrorFixProvider.java index 7b4f42d950f4..293b0a54bcf9 100644 --- a/java/java-impl-inspections/src/com/intellij/codeInspection/AdditionalJavaErrorFixProvider.java +++ b/java/java-impl-inspections/src/com/intellij/codeInspection/AdditionalJavaErrorFixProvider.java @@ -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()); }); } diff --git a/java/java-impl-inspections/src/com/intellij/codeInspection/ImplicitToExplicitClassBackwardMigrationInspection.java b/java/java-impl-inspections/src/com/intellij/codeInspection/ImplicitToExplicitClassBackwardMigrationInspection.java index ddf798c2347d..b0c549a408cb 100644 --- a/java/java-impl-inspections/src/com/intellij/codeInspection/ImplicitToExplicitClassBackwardMigrationInspection.java +++ b/java/java-impl-inspections/src/com/intellij/codeInspection/ImplicitToExplicitClassBackwardMigrationInspection.java @@ -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 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 { - protected ReplaceWithExplicitClassFix(@NotNull PsiImplicitClass element) { + private ReplaceWithExplicitClassFix(@NotNull PsiImplicitClass element) { super(element); } diff --git a/java/java-impl-inspections/src/com/intellij/codeInspection/MigrateFromJavaLangIoInspection.java b/java/java-impl-inspections/src/com/intellij/codeInspection/MigrateFromJavaLangIoInspection.java index 9dc97d6e230e..b6ef575d6a62 100644 --- a/java/java-impl-inspections/src/com/intellij/codeInspection/MigrateFromJavaLangIoInspection.java +++ b/java/java-impl-inspections/src/com/intellij/codeInspection/MigrateFromJavaLangIoInspection.java @@ -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 { - 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()); } diff --git a/java/java-tests/testSrc/com/intellij/java/codeInspection/MigrateFromJavaLangIoInspectionTest.java b/java/java-tests/testSrc/com/intellij/java/codeInspection/MigrateFromJavaLangIoInspectionTest.java index 55f89024bd14..bbf66a64d07b 100644 --- a/java/java-tests/testSrc/com/intellij/java/codeInspection/MigrateFromJavaLangIoInspectionTest.java +++ b/java/java-tests/testSrc/com/intellij/java/codeInspection/MigrateFromJavaLangIoInspectionTest.java @@ -25,7 +25,7 @@ public class MigrateFromJavaLangIoInspectionTest extends LightJavaCodeInsightFix } public void testPrintlnResolved() { - doTest("Replace with 'System.out' method"); + doTest("Replace with 'System.out.println()'"); } public void testPrintArrayChar() {