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 d45410d22060..08c35c92e847 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 @@ -59,6 +59,8 @@ import org.jetbrains.annotations.Nullable; import java.util.*; import java.util.stream.Collectors; +import static java.util.stream.Collectors.toSet; + public class ImportHelper{ private static final Logger LOG = Logger.getInstance("#com.intellij.psi.impl.source.codeStyle.ImportHelper"); @@ -213,7 +215,7 @@ public class ImportHelper{ @NotNull private static Set findSingleImports(@NotNull final PsiJavaFile file, - @NotNull List> names, + @NotNull Collection> names, @NotNull final Set onDemandImports) { final GlobalSearchScope resolveScope = file.getResolveScope(); final String thisPackageName = file.getPackageName(); @@ -304,12 +306,12 @@ public class ImportHelper{ boolean isStatic = ObjectUtils.notNull(onDemandImports.get(onDemand), Boolean.FALSE); PsiClass aClass; if (aPackage != null) { // import foo.package1.*; - Set set = Arrays.stream(aPackage.getClasses(resolveScope)).map(PsiClass::getName).collect(Collectors.toSet()); + Set set = Arrays.stream(aPackage.getClasses(resolveScope)).map(PsiClass::getName).collect(toSet()); classNames.put(onDemand, set); } else if (isStatic && (aClass = facade.findClass(onDemand, resolveScope)) != null) { // import static foo.package1.Class1.*; PsiMember[][] membersArray = {aClass.getInnerClasses(), aClass.getMethods(), aClass.getFields()}; - Set set = Arrays.stream(membersArray).flatMap(Arrays::stream).map(PsiMember::getName).collect(Collectors.toSet()); + Set set = Arrays.stream(membersArray).flatMap(Arrays::stream).map(PsiMember::getName).collect(toSet()); classNames.put(onDemand, set); } else { @@ -761,15 +763,26 @@ public class ImportHelper{ public static boolean hasConflictingOnDemandImport(@NotNull PsiJavaFile file, @NotNull PsiClass psiClass, @NotNull String referenceName) { Collection> resultList = collectNamesToImport(file, new ArrayList<>()); + String qualifiedName = psiClass.getQualifiedName(); for (Pair pair : resultList) { if (pair.second && referenceName.equals(StringUtil.getShortName(pair.first)) && - !StringUtil.getPackageName(pair.first).equals(psiClass.getQualifiedName())) { + !StringUtil.getPackageName(pair.first).equals(qualifiedName)) { return true; } } - return false; + PsiImportList importList = file.getImportList(); + if (importList == null) return false; + Set onDemandImportedClasses = Arrays.stream(importList.getImportStaticStatements()) + .filter(statement -> statement.isOnDemand()) + .map(statement -> statement.resolveTargetClass()) + .filter(aClass -> aClass != null) + .map(aClass -> aClass.getQualifiedName()).collect(toSet()); + String newImport = StringUtil.getQualifiedName(qualifiedName, referenceName); + Set singleImports = findSingleImports(file, Collections.singletonList(Pair.create(newImport, true)), onDemandImportedClasses); + + return singleImports.contains(newImport); } @NotNull diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/staticImportConstant/afterAmbiguity.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/staticImportConstant/afterAmbiguity.java new file mode 100644 index 000000000000..968df5caad03 --- /dev/null +++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/staticImportConstant/afterAmbiguity.java @@ -0,0 +1,20 @@ +// "Import static constant..." "true" + +package foo; +import static foo.A.*; +import static foo.A.CONST; +import static foo.B.*; + +public class X { + { + CONST; + } +} + +class A { + public static Object CONST = null; +} + +class B { + public static Object CONST = null; +} \ No newline at end of file diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/staticImportConstant/beforeAmbiguity.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/staticImportConstant/beforeAmbiguity.java new file mode 100644 index 000000000000..45252e484f08 --- /dev/null +++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/staticImportConstant/beforeAmbiguity.java @@ -0,0 +1,19 @@ +// "Import static constant..." "true" + +package foo; +import static foo.A.*; +import static foo.B.*; + +public class X { + { + CONST; + } +} + +class A { + public static Object CONST = null; +} + +class B { + public static Object CONST = null; +} \ No newline at end of file