[java-imports] IDEA-368382 incorrect place for module import

- support editorconfig
- more tests


(cherry picked from commit d7fd604e95b1dd197a3efbdbfcd54e81564b2490)

IJ-CR-156496

GitOrigin-RevId: 141bae22ad1f263d06b28618bf425a68e8d3cac6
This commit is contained in:
Mikhail Pyltsin
2025-03-02 08:03:13 +01:00
committed by intellij-monorepo-bot
parent f82340ac1c
commit 3a00f15d33
10 changed files with 165 additions and 7 deletions

View File

@@ -2,6 +2,7 @@
package com.intellij.psi.codeStyle;
import com.intellij.application.options.codeStyle.properties.ValueListPropertyAccessor;
import com.intellij.util.containers.ContainerUtil;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
@@ -16,9 +17,11 @@ public class JavaPackageEntryTableAccessor extends ValueListPropertyAccessor<Pac
public static final char BLANK_LINE_CHAR = '|';
public static final String STATIC_PREFIX = "$";
public static final String MODULE_PREFIX = "@";
private final Field myField;
public JavaPackageEntryTableAccessor(@NotNull Object object, @NotNull Field field) {
super(object, field);
myField = field;
}
@Override
@@ -66,6 +69,11 @@ public class JavaPackageEntryTableAccessor extends ValueListPropertyAccessor<Pac
}
}
}
if ("imports_layout".equals(getPropertyName()) &&
JavaCodeStyleSettings.class.equals(myField.getDeclaringClass()) &&
!ContainerUtil.exists(entryTable.getEntries(), entry -> entry == PackageEntry.ALL_MODULE_IMPORTS)) {
entryTable.insertEntryAt(PackageEntry.ALL_MODULE_IMPORTS, 0);
}
return entryTable;
}

View File

@@ -955,10 +955,10 @@ public final class ImportHelper {
if (entry == PackageEntry.ALL_OTHER_STATIC_IMPORTS_ENTRY) {
allOtherStaticIndex = i;
}
if (entry == PackageEntry.ALL_OTHER_IMPORTS_ENTRY) {
if (!isModule && entry == PackageEntry.ALL_OTHER_IMPORTS_ENTRY) {
allOtherIndex = i;
}
if (entry.isBetterMatchForPackageThan(bestEntry, packageName, isStatic)) {
if (!isModule && entry.isBetterMatchForPackageThan(bestEntry, packageName, isStatic)) {
bestEntry = entry;
bestEntryIndex = i;
}

View File

@@ -0,0 +1,18 @@
package org.example;
import ccc.CCC;
import java.util.ArrayList;
import java.util.List;
import static java.util.Arrays.asList;
class IncorrectOrderWithoutModuleImport {
public static void main(String[] args) {
List<String> a = new ArrayList<String>();
a.add("a");
final List<String> list = asList(args);
new CCC();
}
}

View File

@@ -0,0 +1,20 @@
package org.example;
import ccc.CCC;
import java.util.ArrayList;
import java.util.List;
import module java.base;
import static java.util.Arrays.asList;
class IncorrectOrderWithoutModuleImport {
public static void main(String[] args) {
List<String> a = new ArrayList<String>();
a.add("a");
final List<String> list = asList(args);
new CCC();
}
}

View File

@@ -0,0 +1,15 @@
package org.example;
import module java.base;
import ccc.CCC;
import static java.util.Arrays.asList;
class IncorrectOrderWithoutModuleImport {
public static void main(String[] args) {
List<String> a = new ArrayList<String>();
a.add("a");
final List<String> list = asList(args);
new CCC();
}
}

View File

@@ -0,0 +1,18 @@
package org.example;
import ccc.CCC;
import java.util.ArrayList;
import java.util.List;
import static java.util.Arrays.asList;
class IncorrectOrderWithoutModuleImport {
public static void main(String[] args) {
List<String> a = new ArrayList<String>();
a.add("a");
final List<String> list = asList(args);
new CCC();
}
}

View File

@@ -0,0 +1,16 @@
package org.example;
import ccc.CCC;
import java.util.ArrayList;
import java.util.List;
import static java.util.Arrays.asList;
class IncorrectOrderWithoutModuleImport {
public static void main(String[] args) {
List<String> a = new ArrayList<String>();
a.add("a");
final List<String> list = asList(args);
new CCC();
}
}

View File

@@ -0,0 +1,17 @@
package org.example;
import ccc.CCC;
import static java.util.Arrays.asList;
import java.util.ArrayList;
import java.util.List;
class IncorrectOrderWithoutModuleImport {
public static void main(String[] args) {
List<String> a = new ArrayList<String>();
a.add("a");
final List<String> list = asList(args);
new CCC();
}
}

View File

@@ -599,6 +599,51 @@ public class OptimizeImportsTest extends OptimizeImportsTestCase {
});
}
public void testIncorrectOrderWithoutModuleImport() {
myFixture.addClass("package ccc; public class CCC {}");
JavaCodeStyleSettings javaSettings = JavaCodeStyleSettings.getInstance(getProject());
javaSettings.IMPORT_LAYOUT_TABLE = new PackageEntryTable();
javaSettings.IMPORT_LAYOUT_TABLE.addEntry(PackageEntry.ALL_OTHER_IMPORTS_ENTRY);
javaSettings.IMPORT_LAYOUT_TABLE.addEntry(PackageEntry.ALL_OTHER_STATIC_IMPORTS_ENTRY);
javaSettings.IMPORT_LAYOUT_TABLE.addEntry(PackageEntry.BLANK_LINE_ENTRY);
javaSettings.IMPORT_LAYOUT_TABLE.addEntry(new PackageEntry(false, "java", true));
javaSettings.setPreserveModuleImports(true);
doTest();
}
public void testIncorrectOrderWithoutModuleImportConfigWithModule() {
IdeaTestUtil.withLevel(getModule(), JavaFeature.PACKAGE_IMPORTS_SHADOW_MODULE_IMPORTS.getMinimumLevel(), () -> {
myFixture.addClass("package ccc; public class CCC {}");
JavaCodeStyleSettings javaSettings = JavaCodeStyleSettings.getInstance(getProject());
javaSettings.IMPORT_LAYOUT_TABLE = new PackageEntryTable();
javaSettings.IMPORT_LAYOUT_TABLE.addEntry(PackageEntry.ALL_OTHER_IMPORTS_ENTRY);
javaSettings.IMPORT_LAYOUT_TABLE.addEntry(PackageEntry.ALL_OTHER_STATIC_IMPORTS_ENTRY);
javaSettings.IMPORT_LAYOUT_TABLE.addEntry(PackageEntry.BLANK_LINE_ENTRY);
javaSettings.IMPORT_LAYOUT_TABLE.addEntry(new PackageEntry(false, "java", true));
javaSettings.setPreserveModuleImports(true);
doTest();
});
}
public void testIncorrectOrderWithoutModuleImportMixStaticAndNonStatic() {
IdeaTestUtil.withLevel(getModule(), JavaFeature.PACKAGE_IMPORTS_SHADOW_MODULE_IMPORTS.getMinimumLevel(), () -> {
myFixture.addClass("package ccc; public class CCC {}");
JavaCodeStyleSettings javaSettings = JavaCodeStyleSettings.getInstance(getProject());
javaSettings.IMPORT_LAYOUT_TABLE = new PackageEntryTable();
javaSettings.IMPORT_LAYOUT_TABLE.addEntry(PackageEntry.BLANK_LINE_ENTRY);
javaSettings.IMPORT_LAYOUT_TABLE.addEntry(PackageEntry.ALL_OTHER_IMPORTS_ENTRY);
javaSettings.IMPORT_LAYOUT_TABLE.addEntry(PackageEntry.ALL_OTHER_STATIC_IMPORTS_ENTRY);
javaSettings.setPreserveModuleImports(true);
doTest();
});
}
public void testImportModuleOverOtherImports() {
IdeaTestUtil.withLevel(getModule(), JavaFeature.PACKAGE_IMPORTS_SHADOW_MODULE_IMPORTS.getMinimumLevel(), () -> {
myFixture.addClass("package aaa; public class AAA {}");

View File

@@ -112,11 +112,12 @@ public class JavaCodeStyleSettingsTest extends CodeStyleTestCase {
assertEquals(2, commonJavaSettings.getIndentOptions().INDENT_SIZE);
assertTrue(javaSettings.JD_ALIGN_PARAM_COMMENTS);
PackageEntryTable importsTable = javaSettings.getImportLayoutTable();
assertEquals(new PackageEntry(false, "com.jetbrains", false), importsTable.getEntryAt(0));
assertEquals(PackageEntry.BLANK_LINE_ENTRY, importsTable.getEntryAt(1));
assertEquals(new PackageEntry(false, "org.eclipse.bar", false), importsTable.getEntryAt(2));
assertEquals(PackageEntry.ALL_OTHER_STATIC_IMPORTS_ENTRY, importsTable.getEntryAt(3));
assertEquals(new PackageEntry(true, "org.eclipse.foo", true), importsTable.getEntryAt(4));
assertEquals(PackageEntry.ALL_MODULE_IMPORTS, importsTable.getEntryAt(0));
assertEquals(new PackageEntry(false, "com.jetbrains", false), importsTable.getEntryAt(1));
assertEquals(PackageEntry.BLANK_LINE_ENTRY, importsTable.getEntryAt(2));
assertEquals(new PackageEntry(false, "org.eclipse.bar", false), importsTable.getEntryAt(3));
assertEquals(PackageEntry.ALL_OTHER_STATIC_IMPORTS_ENTRY, importsTable.getEntryAt(4));
assertEquals(new PackageEntry(true, "org.eclipse.foo", true), importsTable.getEntryAt(5));
List<String> repeatAnno = javaSettings.getRepeatAnnotations();
assertEquals(2, repeatAnno.size());
assertEquals("com.jetbrains.First", repeatAnno.get(0));