diff --git a/java/java-impl/src/com/intellij/codeInsight/intention/impl/AddOnDemandStaticImportToAutoImportAction.java b/java/java-impl/src/com/intellij/codeInsight/intention/impl/AddOnDemandStaticImportToAutoImportAction.java index f63a415951df..9e60e4879983 100644 --- a/java/java-impl/src/com/intellij/codeInsight/intention/impl/AddOnDemandStaticImportToAutoImportAction.java +++ b/java/java-impl/src/com/intellij/codeInsight/intention/impl/AddOnDemandStaticImportToAutoImportAction.java @@ -2,20 +2,21 @@ package com.intellij.codeInsight.intention.impl; import com.intellij.java.JavaBundle; +import com.intellij.lang.jvm.JvmModifier; import com.intellij.modcommand.ActionContext; import com.intellij.modcommand.ModCommand; import com.intellij.modcommand.Presentation; import com.intellij.modcommand.PsiBasedModCommandAction; -import com.intellij.psi.PsiImportStaticStatement; -import com.intellij.psi.PsiJavaCodeReferenceElement; +import com.intellij.psi.*; import com.intellij.psi.codeStyle.JavaCodeStyleManager; +import com.intellij.psi.util.PsiTreeUtil; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; -public final class AddOnDemandStaticImportToAutoImportAction extends PsiBasedModCommandAction { +public final class AddOnDemandStaticImportToAutoImportAction extends PsiBasedModCommandAction { private AddOnDemandStaticImportToAutoImportAction() { - super(PsiImportStaticStatement.class); + super(PsiElement.class); } @Override @@ -24,14 +25,14 @@ public final class AddOnDemandStaticImportToAutoImportAction extends PsiBasedMod } @Override - protected @Nullable Presentation getPresentation(@NotNull ActionContext context, @NotNull PsiImportStaticStatement element) { + protected @Nullable Presentation getPresentation(@NotNull ActionContext context, @NotNull PsiElement element) { String nameToImport = getNameToImport(element); if (nameToImport == null) return null; return Presentation.of(JavaBundle.message("intention.add.on.demand.static.import.to.auto.import.text", nameToImport)); } @Override - protected @NotNull ModCommand perform(@NotNull ActionContext context, @NotNull PsiImportStaticStatement element) { + protected @NotNull ModCommand perform(@NotNull ActionContext context, @NotNull PsiElement element) { String nameToImport = getNameToImport(element); if (nameToImport == null) return ModCommand.nop(); return ModCommand.updateOptionList(context.file(), "JavaProjectCodeInsightSettings.includedAutoStaticNames", @@ -39,11 +40,53 @@ public final class AddOnDemandStaticImportToAutoImportAction extends PsiBasedMod } @Nullable - private static String getNameToImport(@NotNull PsiImportStaticStatement element) { - if (!element.isOnDemand()) return null; - PsiJavaCodeReferenceElement importReference = element.getImportReference(); - if (importReference == null) return null; - String name = importReference.getCanonicalText(); + private static String getNameToImport(@NotNull PsiElement element) { + String name = null; + PsiImportStaticStatement statement = PsiTreeUtil.getParentOfType(element, PsiImportStaticStatement.class); + if (statement != null && statement.isOnDemand()) { + PsiJavaCodeReferenceElement importReference = statement.getImportReference(); + if (importReference == null) return null; + name = importReference.getCanonicalText(); + } + + if (element.getParent() instanceof PsiReferenceExpression referenceExpression && + referenceExpression.getParent() instanceof PsiMethodCallExpression methodCallExpression) { + PsiFile file = element.getContainingFile(); + if (!(file instanceof PsiJavaFile javaFile)) return null; + PsiImportList importList = javaFile.getImportList(); + if (importList == null) return null; + PsiReferenceExpression methodExpression = methodCallExpression.getMethodExpression(); + if (!(methodExpression.resolve() instanceof PsiMethod method)) { + return null; + } + if (!method.hasModifier(JvmModifier.STATIC)) { + return null; + } + PsiExpression qualifier = methodExpression.getQualifierExpression(); + if (qualifier == null) { + PsiClass containingClass = method.getContainingClass(); + if (containingClass == null) return null; + String classQualifiedName = containingClass.getQualifiedName(); + if (classQualifiedName == null) { + return null; + } + for (PsiImportStaticStatement staticStatement : importList.getImportStaticStatements()) { + PsiJavaCodeReferenceElement importReference = staticStatement.getImportReference(); + if (importReference == null) continue; + if (staticStatement.isOnDemand() && + classQualifiedName.equals(importReference.getQualifiedName())) { + name = classQualifiedName; + break; + } + if (!staticStatement.isOnDemand() && + (classQualifiedName + "." + methodExpression.getReferenceName()).equals(importReference.getQualifiedName())) { + name = classQualifiedName; + break; + } + } + } + } + if (name == null) return null; if (JavaCodeStyleManager.getInstance(element.getProject()).isStaticAutoImportClass(name)) return null; return name; } diff --git a/java/java-tests/testSrc/com/intellij/java/codeInsight/intention/AddOnDemandStaticImportToAutoImportActionTest.java b/java/java-tests/testSrc/com/intellij/java/codeInsight/intention/AddOnDemandStaticImportToAutoImportActionTest.java index ea0ef12235ea..fa2e4533b401 100644 --- a/java/java-tests/testSrc/com/intellij/java/codeInsight/intention/AddOnDemandStaticImportToAutoImportActionTest.java +++ b/java/java-tests/testSrc/com/intellij/java/codeInsight/intention/AddOnDemandStaticImportToAutoImportActionTest.java @@ -18,9 +18,41 @@ public class AddOnDemandStaticImportToAutoImportActionTest extends LightJavaCode } public void testAddedDefault() { + doTest(() -> { + myFixture.configureByText("a.java", """ + import static java.util.Objects.*; + """); + assertTrue(tryToAddToAutoImport("java.util.Objects")); + assertTrue(tableContains("java.util.Objects")); + }); + } + + public void testAddFromCallOnDemand() { doTest(() -> { myFixture.configureByText("a.java", """ import static java.util.Objects.*; + + public class Favorite { + public static void a() { + requireNonNull("a"); + } + } + """); + assertTrue(tryToAddToAutoImport("java.util.Objects")); + assertTrue(tableContains("java.util.Objects")); + }); + } + + public void testAddFromCall() { + doTest(() -> { + myFixture.configureByText("a.java", """ + import static java.util.Objects.requireNonNull; + + public class Favorite { + public static void a() { + requireNonNull("a"); + } + } """); assertTrue(tryToAddToAutoImport("java.util.Objects")); assertTrue(tableContains("java.util.Objects")); @@ -33,7 +65,7 @@ public class AddOnDemandStaticImportToAutoImportActionTest extends LightJavaCode JavaProjectCodeInsightSettings codeInsightSettings = JavaProjectCodeInsightSettings.getSettings(getProject()); codeInsightSettings.includedAutoStaticNames = List.of("java.util.Objects"); myFixture.configureByText("a.java", """ - import static java.util.Objects.*; + import static java.util.Objects.*; """); assertFalse(tryToAddToAutoImport("java.util.Objects")); });