From c82b457febad4a02adaa7a751bf3bc7b24dc3458 Mon Sep 17 00:00:00 2001 From: Bas Leijdekkers Date: Thu, 17 Oct 2024 15:32:21 +0200 Subject: [PATCH] Java: sort imports correctly when "Layout static imports separately" is disabled (IDEA-298584) (cherry picked from commit 6656672e1ae56cffbc4f65cfbbd79d97004aef78) GitOrigin-RevId: a1065f373f4f8fa92e8f36564f6091fd99408e65 --- .../impl/source/codeStyle/ImportHelper.java | 7 ++- .../daemon/LightOptimizeImportsTest.java | 61 +++++++++++++++++++ 2 files changed, 66 insertions(+), 2 deletions(-) diff --git a/java/java-impl/src/com/intellij/psi/impl/source/codeStyle/ImportHelper.java b/java/java-impl/src/com/intellij/psi/impl/source/codeStyle/ImportHelper.java index 117a3a8d00fc..7edb877a0c75 100644 --- a/java/java-impl/src/com/intellij/psi/impl/source/codeStyle/ImportHelper.java +++ b/java/java-impl/src/com/intellij/psi/impl/source/codeStyle/ImportHelper.java @@ -175,7 +175,8 @@ public final class ImportHelper{ PackageEntry[] entries = settings.IMPORT_LAYOUT_TABLE.getEntries(); for (int i = 0; i < imports.size(); i++) { Import anImport = imports.get(i); - entryForName[i] = findEntryIndex(ImportUtils.getPackageOrClassName(anImport.name()), anImport.isStatic(), entries); + entryForName[i] = findEntryIndex(ImportUtils.getPackageOrClassName(anImport.name()), + settings.LAYOUT_STATIC_IMPORTS_SEPARATELY && anImport.isStatic(), entries); } List resultList = new ArrayList<>(imports.size()); @@ -841,7 +842,9 @@ public final class ImportHelper{ String className = ref.getCanonicalText(); packageName = ImportUtils.getPackageOrClassName(className); } - return findEntryIndex(packageName, statement instanceof PsiImportStaticStatement, mySettings.IMPORT_LAYOUT_TABLE.getEntries()); + return findEntryIndex(packageName, + mySettings.LAYOUT_STATIC_IMPORTS_SEPARATELY && statement instanceof PsiImportStaticStatement, + mySettings.IMPORT_LAYOUT_TABLE.getEntries()); } public static boolean hasConflictingOnDemandImport(@NotNull PsiJavaFile file, @NotNull PsiClass psiClass, @NotNull String referenceName) { diff --git a/java/java-tests/testSrc/com/intellij/java/codeInsight/daemon/LightOptimizeImportsTest.java b/java/java-tests/testSrc/com/intellij/java/codeInsight/daemon/LightOptimizeImportsTest.java index 9854f5256ca1..5f83d32774bc 100644 --- a/java/java-tests/testSrc/com/intellij/java/codeInsight/daemon/LightOptimizeImportsTest.java +++ b/java/java-tests/testSrc/com/intellij/java/codeInsight/daemon/LightOptimizeImportsTest.java @@ -6,11 +6,71 @@ import com.intellij.openapi.command.WriteCommandAction; import com.intellij.psi.codeStyle.JavaCodeStyleManager; import com.intellij.psi.codeStyle.JavaCodeStyleSettings; import com.intellij.psi.codeStyle.PackageEntry; +import com.intellij.psi.codeStyle.PackageEntryTable; import com.intellij.testFramework.fixtures.LightJavaCodeInsightFixtureTestCase; import org.intellij.lang.annotations.Language; @SuppressWarnings("ALL") public class LightOptimizeImportsTest extends LightJavaCodeInsightFixtureTestCase { + + public void testImportLayoutStaticAndNonStaticImportsTogether() { + myFixture.addClass("package aaa; public class AAA {}"); + myFixture.addClass("package aaa; public class BBB {" + + " public static void x() {}" + + "}"); + myFixture.addClass("package aaa; public class CCC {}"); + + @Language("JAVA") String text = """ + package main; + + import aaa.AAA; + import aaa.CCC; + import aaa.BBB; + import java.util.ArrayList; + import static aaa.BBB.x; + + public class Main { + void usage() { + new ArrayList<>(); + new AAA(); + new BBB(); + new CCC(); + x(); + } + } + """; + myFixture.configureByText(JavaFileType.INSTANCE, text); + + JavaCodeStyleSettings javaSettings = JavaCodeStyleSettings.getInstance(getProject()); + javaSettings.LAYOUT_STATIC_IMPORTS_SEPARATELY = false; + javaSettings.IMPORT_LAYOUT_TABLE = new PackageEntryTable(); + javaSettings.IMPORT_LAYOUT_TABLE.addEntry(PackageEntry.ALL_OTHER_IMPORTS_ENTRY); + javaSettings.IMPORT_LAYOUT_TABLE.addEntry(PackageEntry.BLANK_LINE_ENTRY); + javaSettings.IMPORT_LAYOUT_TABLE.addEntry(new PackageEntry(false, "aaa", true)); + WriteCommandAction.runWriteCommandAction(getProject(), () -> JavaCodeStyleManager.getInstance(getProject()).optimizeImports(getFile())); + + @Language("JAVA") String result = """ + package main; + + import java.util.ArrayList; + + import aaa.AAA; + import aaa.BBB; + import static aaa.BBB.x; + import aaa.CCC; + + public class Main { + void usage() { + new ArrayList<>(); + new AAA(); + new BBB(); + new CCC(); + x(); + } + } + """; + myFixture.checkResult(result); + } public void testImportLayoutWithoutSubpackages() { myFixture.addClass("package aaa; public class AAA {}"); @@ -81,6 +141,7 @@ public class LightOptimizeImportsTest extends LightJavaCodeInsightFixtureTestCas myFixture.configureByText(JavaFileType.INSTANCE, text); JavaCodeStyleSettings javaSettings = JavaCodeStyleSettings.getInstance(getProject()); + // default import layout table is at com.intellij.psi.codeStyle.JavaCodeStyleSettings.initImportsByDefault() javaSettings.CLASS_COUNT_TO_USE_IMPORT_ON_DEMAND = 2; WriteCommandAction.runWriteCommandAction(getProject(), () -> JavaCodeStyleManager.getInstance(getProject()).optimizeImports(getFile()));