From f9a382a2a51159d7e854bcbc0a3f0ae3909e5517 Mon Sep 17 00:00:00 2001 From: Mikhail Pyltsin Date: Mon, 19 Jan 2026 16:46:30 +0100 Subject: [PATCH] [java-inspection] IDEA-382937 "Static import can be used" leads to compile error due to conflict with interface method GitOrigin-RevId: d1e2afc5c36577deead95a4252fbbaf7aed46799 --- .../impl/AddOnDemandStaticImportAction.java | 12 ++++++-- .../DoubleTheSameMethod.java | 15 ++++++++++ .../StaticImportCanBeUsedInspectionTest.java | 28 +++++++++++++++++++ 3 files changed, 53 insertions(+), 2 deletions(-) create mode 100644 java/java-tests/testData/inspection/staticImportCanBeUsed/DoubleTheSameMethod.java diff --git a/java/java-impl/src/com/intellij/codeInsight/intention/impl/AddOnDemandStaticImportAction.java b/java/java-impl/src/com/intellij/codeInsight/intention/impl/AddOnDemandStaticImportAction.java index b2c2054c8e8d..7772ea5a9847 100644 --- a/java/java-impl/src/com/intellij/codeInsight/intention/impl/AddOnDemandStaticImportAction.java +++ b/java/java-impl/src/com/intellij/codeInsight/intention/impl/AddOnDemandStaticImportAction.java @@ -29,6 +29,7 @@ import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import java.util.ArrayList; +import java.util.Arrays; import java.util.List; import java.util.Objects; @@ -81,8 +82,15 @@ public final class AddOnDemandStaticImportAction extends PsiUpdateModCommandActi final PsiElement qualifier = call.getMethodExpression().getQualifier(); if (qualifier == null) return null; qualifier.delete(); - final PsiMethod method = call.resolveMethod(); - if (method != null && method.getContainingClass() != psiClass) return null; + JavaResolveResult[] results = call.multiResolve(false); + if (Arrays.stream(results) + .filter(Objects::nonNull) + .map(ResolveResult::getElement) + .anyMatch(psiElement -> + psiElement instanceof PsiMethod psiMethod && + psiMethod.getContainingClass() != psiClass)) { + return null; + } } else { PsiElement refNameElement = parentRef.getReferenceNameElement(); diff --git a/java/java-tests/testData/inspection/staticImportCanBeUsed/DoubleTheSameMethod.java b/java/java-tests/testData/inspection/staticImportCanBeUsed/DoubleTheSameMethod.java new file mode 100644 index 000000000000..a8f3b4af9593 --- /dev/null +++ b/java/java-tests/testData/inspection/staticImportCanBeUsed/DoubleTheSameMethod.java @@ -0,0 +1,15 @@ +package staticImportCanBeUsed; + +import java.util.Locale; + +@SuppressWarnings("unused") +final class ExampleImpls { + + record ExampleImpl(String translationKey) implements Example { + + @Override + public String localize(Locale locale) { + return StaticMethod.localize(locale, translationKey); + } + } +} \ No newline at end of file diff --git a/java/java-tests/testSrc/com/intellij/codeInsight/daemon/impl/quickfix/StaticImportCanBeUsedInspectionTest.java b/java/java-tests/testSrc/com/intellij/codeInsight/daemon/impl/quickfix/StaticImportCanBeUsedInspectionTest.java index fb9c2d5fa287..985899359aeb 100644 --- a/java/java-tests/testSrc/com/intellij/codeInsight/daemon/impl/quickfix/StaticImportCanBeUsedInspectionTest.java +++ b/java/java-tests/testSrc/com/intellij/codeInsight/daemon/impl/quickfix/StaticImportCanBeUsedInspectionTest.java @@ -303,6 +303,34 @@ public class StaticImportCanBeUsedInspectionTest extends LightJavaInspectionTest } } + public void testDoubleTheSameMethod() { + try { + myFixture.addClass(""" + package staticImportCanBeUsed; + import java.util.Locale; + public interface Example { + default String localize() { + return localize(Locale.getDefault()); + } + String localize(Locale locale); + }"""); + + myFixture.addClass(""" + package staticImportCanBeUsed; + import java.util.Locale; + public class StaticMethod { + public static String localize(Locale locale, String translationKey) { + return translationKey; + } + }"""); + addStaticAutoImportToProject("staticImportCanBeUsed.StaticMethod.localize"); + doTest(); + } + finally { + cleanTable(); + } + } + private void cleanupTest() { IntentionAction intention = myFixture.getAvailableIntention(AnalysisBundle.message("cleanup.in.file")); myFixture.launchAction(intention);