From c32067bfb34b14073fc7f61eb7dd4ad60607f081 Mon Sep 17 00:00:00 2001 From: Mikhail Pyltsin Date: Fri, 20 Dec 2024 18:12:02 +0100 Subject: [PATCH] [java-inspections] IDEA-365059 Support JEP 494: Fix expand module imports - modules shouldn't add implicitly imported classes GitOrigin-RevId: d18b9bc7783a478cec3e75f95542c410ae78acd8 --- .../ipp/imports/ReplaceOnDemandImportIntention.java | 10 ++++++++-- .../siyeh/ipp/imports/ModuleImportImplicitImport.java | 7 +++++++ .../ipp/imports/ModuleImportImplicitImport_after.java | 8 ++++++++ .../imports/ReplaceOnDemandImportIntentionTest.java | 1 + 4 files changed, 24 insertions(+), 2 deletions(-) create mode 100644 java/java-tests/testData/ipp/com/siyeh/ipp/imports/ModuleImportImplicitImport.java create mode 100644 java/java-tests/testData/ipp/com/siyeh/ipp/imports/ModuleImportImplicitImport_after.java diff --git a/java/java-impl/src/com/siyeh/ipp/imports/ReplaceOnDemandImportIntention.java b/java/java-impl/src/com/siyeh/ipp/imports/ReplaceOnDemandImportIntention.java index 2b814bf4856d..935847639b4d 100644 --- a/java/java-impl/src/com/siyeh/ipp/imports/ReplaceOnDemandImportIntention.java +++ b/java/java-impl/src/com/siyeh/ipp/imports/ReplaceOnDemandImportIntention.java @@ -7,6 +7,7 @@ import com.intellij.psi.util.ClassUtil; import com.intellij.psi.util.ImportsUtil; import com.siyeh.IntentionPowerPackBundle; import com.siyeh.ig.psiutils.CommentTracker; +import com.siyeh.ig.psiutils.ImportUtils; import com.siyeh.ipp.base.MCIntention; import com.siyeh.ipp.base.PsiElementPredicate; import org.jetbrains.annotations.NotNull; @@ -52,8 +53,13 @@ public final class ReplaceOnDemandImportIntention extends MCIntention { for (PsiClass aClass : classes) { aClass.accept(visitor); } - final PsiClass[] importedClasses = visitor.getImportedClasses(); - Arrays.sort(importedClasses, new PsiClassComparator()); + ImportUtils.ImplicitImportChecker checker = ImportUtils.createImplicitImportChecker(javaFile); + final PsiClass[] importedClasses = Arrays.stream(visitor.getImportedClasses()) + .filter( + cl -> !(importStatementBase instanceof PsiImportModuleStatement) || + !checker.isImplicitlyImported(cl.getQualifiedName(), false)) + .sorted(new PsiClassComparator()) + .toArray(PsiClass[]::new); createImportStatements(importStatementBase, importedClasses, factory::createImportStatement); } else if (importStatementBase instanceof PsiImportStaticStatement) { diff --git a/java/java-tests/testData/ipp/com/siyeh/ipp/imports/ModuleImportImplicitImport.java b/java/java-tests/testData/ipp/com/siyeh/ipp/imports/ModuleImportImplicitImport.java new file mode 100644 index 000000000000..20a5f2404650 --- /dev/null +++ b/java/java-tests/testData/ipp/com/siyeh/ipp/imports/ModuleImportImplicitImport.java @@ -0,0 +1,7 @@ +import module java.base; + +public class ModuleImport { + public static void main(String[] args) { + List a = new ArrayList<>(); + } +} \ No newline at end of file diff --git a/java/java-tests/testData/ipp/com/siyeh/ipp/imports/ModuleImportImplicitImport_after.java b/java/java-tests/testData/ipp/com/siyeh/ipp/imports/ModuleImportImplicitImport_after.java new file mode 100644 index 000000000000..43c6ed17c219 --- /dev/null +++ b/java/java-tests/testData/ipp/com/siyeh/ipp/imports/ModuleImportImplicitImport_after.java @@ -0,0 +1,8 @@ +import java.util.ArrayList; +import java.util.List; + +public class ModuleImport { + public static void main(String[] args) { + List a = new ArrayList<>(); + } +} \ No newline at end of file diff --git a/java/java-tests/testSrc/com/siyeh/ipp/imports/ReplaceOnDemandImportIntentionTest.java b/java/java-tests/testSrc/com/siyeh/ipp/imports/ReplaceOnDemandImportIntentionTest.java index c19db2dfc765..66b507cc274b 100644 --- a/java/java-tests/testSrc/com/siyeh/ipp/imports/ReplaceOnDemandImportIntentionTest.java +++ b/java/java-tests/testSrc/com/siyeh/ipp/imports/ReplaceOnDemandImportIntentionTest.java @@ -15,6 +15,7 @@ public class ReplaceOnDemandImportIntentionTest extends IPPTestCase { public void testStaticImport() { doTest(); } public void testModuleImport() { doTest(); } + public void testModuleImportImplicitImport() { doTest(); } @Override protected String getIntentionName() {