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 7a2bcd2145ce..089ce9f55bf4 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 @@ -3,7 +3,6 @@ package com.intellij.psi.impl.source.codeStyle; import com.intellij.application.options.CodeStyle; import com.intellij.codeInsight.ImportFilter; -import com.intellij.codeInsight.JavaProjectCodeInsightSettings; import com.intellij.ide.highlighter.JavaFileType; import com.intellij.jsp.JspSpiUtil; import com.intellij.lang.ASTNode; @@ -19,6 +18,7 @@ import com.intellij.psi.codeStyle.CodeStyleSettings; import com.intellij.psi.codeStyle.JavaCodeStyleSettings; import com.intellij.psi.codeStyle.PackageEntry; import com.intellij.psi.codeStyle.PackageEntryTable; +import com.intellij.psi.impl.IncompleteModelUtil; import com.intellij.psi.impl.PsiFileFactoryImpl; import com.intellij.psi.impl.source.PsiJavaCodeReferenceElementImpl; import com.intellij.psi.impl.source.SourceTreeToPsiMap; @@ -77,7 +77,7 @@ public final class ImportHelper { } /** - * @param filter pretend some references do not exist so the corresponding imports may be deleted + * @param filter pretend some references do not exist, so the corresponding imports may be deleted * @return the import list to replace with, or null when there's no need to replace the import list because they are the same */ public @Nullable PsiImportList prepareOptimizeImportsResult(@NotNull PsiJavaFile file, @NotNull Predicate filter) { @@ -103,8 +103,7 @@ public final class ImportHelper { Map classesOrPackagesToImportOnDemand = new HashMap<>(); List previousModuleStatements = collectModuleImports(file, mySettings); Map moduleStatementMap = collectNamesImportedByModules(file, previousModuleStatements, resultList); - JavaProjectCodeInsightSettings javaProjectCodeInsightSettings = JavaProjectCodeInsightSettings.getSettings(file.getProject()); - collectOnDemandImports(resultList, mySettings, javaProjectCodeInsightSettings, classesOrPackagesToImportOnDemand, moduleStatementMap); + collectOnDemandImports(resultList, mySettings, classesOrPackagesToImportOnDemand, moduleStatementMap); MultiMap conflictingMemberNames = new MultiMap<>(); for (Import anImport : resultList) { @@ -161,7 +160,7 @@ public final class ImportHelper { } /** - * Collects the names of classes that are imported by modules specified implicitly in the given Java file and in import list. + * Collects the names of classes that are imported by modules specified implicitly in the given Java file and in the import list. * * @param file the Java file for which imported class names are being collected. * @param statements a list of import module statements that specify the modules from which classes are imported. @@ -213,7 +212,6 @@ public final class ImportHelper { public static void collectOnDemandImports(@NotNull List resultList, @NotNull JavaCodeStyleSettings javaCodeStyleSettings, - @NotNull JavaProjectCodeInsightSettings javaProjectCodeInsightSettings, @NotNull Map outClassesOrPackagesToImportOnDemand, @NotNull Map moduleStatementMap) { Object2IntMap packageToCountMap = new Object2IntOpenHashMap<>(); @@ -1240,7 +1238,8 @@ public final class ImportHelper { Import unresolvedImport = unresolvedNames.get(name); if (reference.multiResolve(false).length == 0) { hasResolveProblem[0] = true; - if (unresolvedImport != null) { + if (unresolvedImport != null && + (IncompleteModelUtil.canBeClassReference(reference) || unresolvedImport.isStatic())) { namesToImport.add(unresolvedImport); unresolvedNames.remove(name); if (unresolvedNames.isEmpty()) return; diff --git a/java/java-psi-impl/src/com/intellij/psi/impl/IncompleteModelUtil.java b/java/java-psi-impl/src/com/intellij/psi/impl/IncompleteModelUtil.java index a61f5cd610a0..5cddc7720d29 100644 --- a/java/java-psi-impl/src/com/intellij/psi/impl/IncompleteModelUtil.java +++ b/java/java-psi-impl/src/com/intellij/psi/impl/IncompleteModelUtil.java @@ -220,7 +220,7 @@ public final class IncompleteModelUtil { public static List getPotentialImports(@NotNull PsiJavaCodeReferenceElement ref) { PsiElement parent = ref.getParent(); if (parent instanceof PsiImportStatementBase || ref.isQualified()) return Collections.emptyList(); - boolean maybeClass = canBeClass(ref); + boolean maybeClass = canBeClassReference(ref); if (!(ref.getContainingFile() instanceof PsiJavaFile)) return Collections.emptyList(); PsiImportList list = ((PsiJavaFile)ref.getContainingFile()).getImportList(); List imports = new ArrayList<>(); @@ -243,7 +243,11 @@ public final class IncompleteModelUtil { return imports; } - private static boolean canBeClass(@NotNull PsiJavaCodeReferenceElement ref) { + /** + * @param ref reference to check + * @return true if this reference could be a reference to a class + */ + public static boolean canBeClassReference(@NotNull PsiJavaCodeReferenceElement ref) { PsiElement parent = ref.getParent(); if (parent instanceof PsiMethodCallExpression) return false; if (!(ref instanceof PsiReferenceExpression)) return true; diff --git a/java/java-tests/testData/psi/optimizeImports/UnresolvedReferenceAfterParenthesis.java b/java/java-tests/testData/psi/optimizeImports/UnresolvedReferenceAfterParenthesis.java new file mode 100644 index 000000000000..6455042eb98d --- /dev/null +++ b/java/java-tests/testData/psi/optimizeImports/UnresolvedReferenceAfterParenthesis.java @@ -0,0 +1,7 @@ +import com.foo.Hello; + +class Test { + void method { + (Hello + } +} \ No newline at end of file diff --git a/java/java-tests/testData/psi/optimizeImports/UnresolvedReferenceAfterParenthesis_after.java b/java/java-tests/testData/psi/optimizeImports/UnresolvedReferenceAfterParenthesis_after.java new file mode 100644 index 000000000000..5dcd3d92862c --- /dev/null +++ b/java/java-tests/testData/psi/optimizeImports/UnresolvedReferenceAfterParenthesis_after.java @@ -0,0 +1,5 @@ +class Test { + void method { + (Hello + } +} \ No newline at end of file diff --git a/java/java-tests/testSrc/com/intellij/java/psi/OptimizeImportsTest.java b/java/java-tests/testSrc/com/intellij/java/psi/OptimizeImportsTest.java index c57460bfff31..19860bffed5a 100644 --- a/java/java-tests/testSrc/com/intellij/java/psi/OptimizeImportsTest.java +++ b/java/java-tests/testSrc/com/intellij/java/psi/OptimizeImportsTest.java @@ -768,6 +768,11 @@ public class OptimizeImportsTest extends OptimizeImportsTestCase { """); doTest(); } + + public void testUnresolvedReferenceAfterParenthesis() { + doTest(); + } + private void doTest() { doTest(".java"); } diff --git a/plugins/javaFX/src/org/jetbrains/plugins/javaFX/fxml/codeInsight/JavaFxImportsOptimizer.java b/plugins/javaFX/src/org/jetbrains/plugins/javaFX/fxml/codeInsight/JavaFxImportsOptimizer.java index a056a12d2f85..ea14b792a63e 100644 --- a/plugins/javaFX/src/org/jetbrains/plugins/javaFX/fxml/codeInsight/JavaFxImportsOptimizer.java +++ b/plugins/javaFX/src/org/jetbrains/plugins/javaFX/fxml/codeInsight/JavaFxImportsOptimizer.java @@ -1,7 +1,6 @@ // Copyright 2000-2024 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license. package org.jetbrains.plugins.javaFX.fxml.codeInsight; -import com.intellij.codeInsight.JavaProjectCodeInsightSettings; import com.intellij.ide.highlighter.XmlFileType; import com.intellij.injected.editor.VirtualFileWindow; import com.intellij.lang.ASTNode; @@ -48,10 +47,9 @@ public final class JavaFxImportsOptimizer implements ImportOptimizer { collectNamesToImport(names, demandedForNested, (XmlFile)file); names.sort((o1, o2) -> StringUtil.compare(o1.name(), o2.name(), true)); final JavaCodeStyleSettings settings = JavaCodeStyleSettings.getInstance(file); - JavaProjectCodeInsightSettings javaProjectCodeInsightSettings = JavaProjectCodeInsightSettings.getSettings(file.getProject()); final @NotNull List sortedNames = ImportHelper.sortItemsAccordingToSettings(names, settings); final Map onDemand = new HashMap<>(); - ImportHelper.collectOnDemandImports(sortedNames, settings, javaProjectCodeInsightSettings, onDemand, new HashMap<>()); + ImportHelper.collectOnDemandImports(sortedNames, settings, onDemand, new HashMap<>()); for (String s : demandedForNested) { onDemand.put(s, false); }