From 20cbb5ad6ff2ade3fbecc57372bb4674c1f308e9 Mon Sep 17 00:00:00 2001 From: Mikhail Pyltsin Date: Thu, 15 May 2025 14:23:56 +0200 Subject: [PATCH] [java-import] IDEA-369199 Preserve module imports even if they are not used - don't add implicit imports during migration from implicit classes GitOrigin-RevId: 335b3955f7088d67b4a59e922946257ed940ebd1 --- ...licitClassBackwardMigrationInspection.java | 27 +++++++++++++++---- .../afterAdjustComments.java | 2 -- .../afterConflictModuleImport.java | 1 - ...rConflictModuleImportDemandOverModule.java | 1 - .../afterSimple.java | 2 -- .../afterSimple2.java | 2 -- .../afterWithPrint.java | 2 -- 7 files changed, 22 insertions(+), 15 deletions(-) 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 88dcb73bc86f..00eb6c1beadc 100644 --- a/java/java-impl-inspections/src/com/intellij/codeInspection/ImplicitToExplicitClassBackwardMigrationInspection.java +++ b/java/java-impl-inspections/src/com/intellij/codeInspection/ImplicitToExplicitClassBackwardMigrationInspection.java @@ -1,4 +1,4 @@ -// Copyright 2000-2024 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license. +// 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.codeInspection.wrongPackageStatement.AdjustPackageNameFix; @@ -7,16 +7,19 @@ import com.intellij.modcommand.ModPsiUpdater; import com.intellij.modcommand.PsiUpdateModCommandQuickFix; import com.intellij.openapi.project.Project; import com.intellij.openapi.roots.SingleFileSourcesTracker; +import com.intellij.openapi.util.Predicates; import com.intellij.openapi.util.TextRange; import com.intellij.pom.java.JavaFeature; import com.intellij.profile.codeInspection.InspectionProjectProfileManager; import com.intellij.psi.*; -import com.intellij.psi.codeStyle.JavaCodeStyleManager; +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.PsiMethodUtil; import com.intellij.psi.util.PsiTreeUtil; import com.intellij.util.containers.ContainerUtil; +import com.siyeh.ig.psiutils.CommentTracker; import org.jetbrains.annotations.Nls; import org.jetbrains.annotations.NotNull; @@ -117,7 +120,21 @@ public final class ImplicitToExplicitClassBackwardMigrationInspection extends Ab addImplicitStaticImports(project, staticImports, implicitClass, importList); addImplicitJavaModuleImports(project, moduleImports, importList); addPackageStatement(newPsiJavaFile, originalFile); - JavaCodeStyleManager.getInstance(project).optimizeImports(newPsiJavaFile); + optimizeImport(newPsiJavaFile); + } + + private static void optimizeImport(@NotNull PsiJavaFile newPsiJavaFile) { + JavaCodeStyleSettings original = JavaCodeStyleSettings.getInstance(newPsiJavaFile); + JavaCodeStyleSettings clone = (JavaCodeStyleSettings)original.clone(); + clone.setDeleteUnusedModuleImports(true); + PsiImportList newList = new ImportHelper(clone).prepareOptimizeImportsResult(newPsiJavaFile, Predicates.alwaysTrue()); + if (newList != null) { + final PsiImportList newImportList = newPsiJavaFile.getImportList(); + if (newImportList != null) { + newImportList.getParent().addRangeAfter(newList.getParent().getFirstChild(), newList.getParent().getLastChild(), newImportList); + new CommentTracker().deleteAndRestoreComments(newImportList); + } + } } private static void addPackageStatement(@NotNull PsiJavaFile javaFile, PsiFile originalFile) { @@ -131,8 +148,8 @@ public final class ImplicitToExplicitClassBackwardMigrationInspection extends Ab SingleFileSourcesTracker singleFileSourcesTracker = SingleFileSourcesTracker.getInstance(originalFile.getProject()); String singleFileSourcePackageName = singleFileSourcesTracker.getPackageNameForSingleFileSource(originalFile.getVirtualFile()); if (singleFileSourcePackageName != null) packageName = singleFileSourcePackageName; - if(packageName.isEmpty()) return; - if(!PsiDirectoryFactory.getInstance(javaFile.getProject()).isValidPackageName(packageName)) return; + if (packageName.isEmpty()) return; + if (!PsiDirectoryFactory.getInstance(javaFile.getProject()).isValidPackageName(packageName)) return; AdjustPackageNameFix.applyFix(javaFile, originalFile, originalFile.getContainingDirectory()); } diff --git a/java/java-tests/testData/inspection/implicitToExplicitClassBackwardMigration/afterAdjustComments.java b/java/java-tests/testData/inspection/implicitToExplicitClassBackwardMigration/afterAdjustComments.java index e166972a6b1e..e76194be9904 100644 --- a/java/java-tests/testData/inspection/implicitToExplicitClassBackwardMigration/afterAdjustComments.java +++ b/java/java-tests/testData/inspection/implicitToExplicitClassBackwardMigration/afterAdjustComments.java @@ -1,5 +1,3 @@ -import module java.base; - public class beforeAdjustComments { //many comments private final String field = "field"; diff --git a/java/java-tests/testData/inspection/implicitToExplicitClassBackwardMigration/afterConflictModuleImport.java b/java/java-tests/testData/inspection/implicitToExplicitClassBackwardMigration/afterConflictModuleImport.java index c5085666085e..2cea7f3cc493 100644 --- a/java/java-tests/testData/inspection/implicitToExplicitClassBackwardMigration/afterConflictModuleImport.java +++ b/java/java-tests/testData/inspection/implicitToExplicitClassBackwardMigration/afterConflictModuleImport.java @@ -1,4 +1,3 @@ -import module java.base; import test.List; public class beforeConflictModuleImport { diff --git a/java/java-tests/testData/inspection/implicitToExplicitClassBackwardMigration/afterConflictModuleImportDemandOverModule.java b/java/java-tests/testData/inspection/implicitToExplicitClassBackwardMigration/afterConflictModuleImportDemandOverModule.java index 4dfbe5ccb296..2df4f291df15 100644 --- a/java/java-tests/testData/inspection/implicitToExplicitClassBackwardMigration/afterConflictModuleImportDemandOverModule.java +++ b/java/java-tests/testData/inspection/implicitToExplicitClassBackwardMigration/afterConflictModuleImportDemandOverModule.java @@ -1,4 +1,3 @@ -import module java.base; import test.List; public class beforeConflictModuleImportDemandOverModule { diff --git a/java/java-tests/testData/inspection/implicitToExplicitClassBackwardMigration/afterSimple.java b/java/java-tests/testData/inspection/implicitToExplicitClassBackwardMigration/afterSimple.java index b903cc5b7f1c..f45176c2b199 100644 --- a/java/java-tests/testData/inspection/implicitToExplicitClassBackwardMigration/afterSimple.java +++ b/java/java-tests/testData/inspection/implicitToExplicitClassBackwardMigration/afterSimple.java @@ -1,5 +1,3 @@ -import module java.base; - public class beforeSimple { private final String field = "field"; diff --git a/java/java-tests/testData/inspection/implicitToExplicitClassBackwardMigration/afterSimple2.java b/java/java-tests/testData/inspection/implicitToExplicitClassBackwardMigration/afterSimple2.java index da855e5f42e9..8b242dad09bc 100644 --- a/java/java-tests/testData/inspection/implicitToExplicitClassBackwardMigration/afterSimple2.java +++ b/java/java-tests/testData/inspection/implicitToExplicitClassBackwardMigration/afterSimple2.java @@ -1,5 +1,3 @@ -import module java.base; - public class beforeSimple2 { private final String field = "field"; diff --git a/java/java-tests/testData/inspection/implicitToExplicitClassBackwardMigration/afterWithPrint.java b/java/java-tests/testData/inspection/implicitToExplicitClassBackwardMigration/afterWithPrint.java index 94835e7c20f2..20a1aa579e4c 100644 --- a/java/java-tests/testData/inspection/implicitToExplicitClassBackwardMigration/afterWithPrint.java +++ b/java/java-tests/testData/inspection/implicitToExplicitClassBackwardMigration/afterWithPrint.java @@ -1,5 +1,3 @@ -import module java.base; - import static java.io.IO.println; public class beforeWithPrint {