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 cb633917d044..756d3af61fd7 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 @@ -47,6 +47,7 @@ import com.intellij.util.ArrayUtil; import com.intellij.util.IncorrectOperationException; import com.intellij.util.ObjectUtils; import com.intellij.util.containers.ContainerUtil; +import com.intellij.util.containers.MultiMap; import gnu.trove.THashMap; import gnu.trove.THashSet; import gnu.trove.TObjectIntHashMap; @@ -81,13 +82,29 @@ public class ImportHelper{ List nonImports = new ArrayList<>(); // Note: this array may contain ".*" for unresolved imports! List> names = new ArrayList<>(collectNamesToImport(file, nonImports)); - Collections.sort(names, (o1, o2) -> o1.getFirst().compareTo(o2.getFirst())); + Collections.sort(names, Comparator.comparing(o -> o.getFirst())); List> resultList = sortItemsAccordingToSettings(names, mySettings); final Map classesOrPackagesToImportOnDemand = new THashMap<>(); collectOnDemandImports(resultList, mySettings, classesOrPackagesToImportOnDemand); + MultiMap conflictingMemberNames = new MultiMap<>(); + for (Pair pair : resultList) { + if (pair.second) { + conflictingMemberNames.putValue(StringUtil.getShortName(pair.first), StringUtil.getPackageName(pair.first)); + } + } + + for (String methodName : conflictingMemberNames.keySet()) { + Collection collection = conflictingMemberNames.get(methodName); + if (!classesOrPackagesToImportOnDemand.keySet().containsAll(collection)) { + for (String name : collection) { + classesOrPackagesToImportOnDemand.remove(name); + } + } + } + Set classesToUseSingle = findSingleImports(file, resultList, classesOrPackagesToImportOnDemand.keySet()); Set toReimport = new THashSet<>(); calcClassesConflictingViaOnDemandImports(file, classesOrPackagesToImportOnDemand, file.getResolveScope(), toReimport); diff --git a/java/java-tests/testData/psi/optimizeImports/DontCollapseToOnDemandImport.java b/java/java-tests/testData/psi/optimizeImports/DontCollapseToOnDemandImport.java new file mode 100644 index 000000000000..6a15cea66d1e --- /dev/null +++ b/java/java-tests/testData/psi/optimizeImports/DontCollapseToOnDemandImport.java @@ -0,0 +1,16 @@ +import java.util.ArrayList; + +import static java.util.Arrays.asList; +import static java.util.Arrays.deepHashCode; +import static java.util.Arrays.sort; +import static java.util.Collections.sort; + +class OnDemand { + { + sort(new Integer[0]); + asList(new Integer[0]); + deepHashCode(new Integer[0]); + + sort(new ArrayList()); + } +} diff --git a/java/java-tests/testData/psi/optimizeImports/DontCollapseToOnDemandImport_after.java b/java/java-tests/testData/psi/optimizeImports/DontCollapseToOnDemandImport_after.java new file mode 100644 index 000000000000..6a15cea66d1e --- /dev/null +++ b/java/java-tests/testData/psi/optimizeImports/DontCollapseToOnDemandImport_after.java @@ -0,0 +1,16 @@ +import java.util.ArrayList; + +import static java.util.Arrays.asList; +import static java.util.Arrays.deepHashCode; +import static java.util.Arrays.sort; +import static java.util.Collections.sort; + +class OnDemand { + { + sort(new Integer[0]); + asList(new Integer[0]); + deepHashCode(new Integer[0]); + + sort(new ArrayList()); + } +} diff --git a/java/java-tests/testSrc/com/intellij/psi/OptimizeImportsTest.java b/java/java-tests/testSrc/com/intellij/psi/OptimizeImportsTest.java index 8811ebcfad89..f922e492e9d0 100644 --- a/java/java-tests/testSrc/com/intellij/psi/OptimizeImportsTest.java +++ b/java/java-tests/testSrc/com/intellij/psi/OptimizeImportsTest.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2013 JetBrains s.r.o. + * Copyright 2000-2016 JetBrains s.r.o. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -38,6 +38,8 @@ public class OptimizeImportsTest extends OptimizeImportsTestCase { public void testNewImportListIsEmptyAndCommentPreserved() throws Exception { doTest(); } public void testNewImportListIsEmptyAndJavaDocWithInvalidCodePreserved() throws Exception { doTest(); } + public void testDontCollapseToOnDemandImport() throws Exception { doTest(); } + private void doTest() throws Exception { doTest(".java"); }