diff --git a/java/java-impl/src/com/intellij/codeInsight/daemon/impl/quickfix/ImportClassFixBase.java b/java/java-impl/src/com/intellij/codeInsight/daemon/impl/quickfix/ImportClassFixBase.java index e6bba1ec6558..65eb3e029428 100644 --- a/java/java-impl/src/com/intellij/codeInsight/daemon/impl/quickfix/ImportClassFixBase.java +++ b/java/java-impl/src/com/intellij/codeInsight/daemon/impl/quickfix/ImportClassFixBase.java @@ -32,6 +32,7 @@ import com.intellij.psi.codeStyle.JavaCodeStyleSettings; import com.intellij.psi.search.GlobalSearchScope; import com.intellij.psi.search.PsiShortNamesCache; import com.intellij.psi.util.InheritanceUtil; +import com.intellij.psi.util.PsiTreeUtil; import com.intellij.psi.util.PsiUtil; import com.intellij.util.ArrayUtil; import com.intellij.util.ThreeState; @@ -195,7 +196,9 @@ public abstract class ImportClassFixBase (anyAccessibleFound || !BaseIntentionAction.canModify(aClass) || - facade.arePackagesTheSame(aClass, myReferenceElement)) && !isAccessible(aClass, myReferenceElement)); + facade.arePackagesTheSame(aClass, myReferenceElement) || + PsiTreeUtil.getParentOfType(aClass, PsiImplicitClass.class) != null) && + !isAccessible(aClass, myReferenceElement)); filterByRequiredMemberName(classList); diff --git a/java/java-psi-impl/src/com/intellij/psi/impl/source/resolve/PsiResolveHelperImpl.java b/java/java-psi-impl/src/com/intellij/psi/impl/source/resolve/PsiResolveHelperImpl.java index e36296bd472b..e91d289d7f41 100644 --- a/java/java-psi-impl/src/com/intellij/psi/impl/source/resolve/PsiResolveHelperImpl.java +++ b/java/java-psi-impl/src/com/intellij/psi/impl/source/resolve/PsiResolveHelperImpl.java @@ -16,6 +16,7 @@ import com.intellij.psi.scope.conflictResolvers.DuplicateConflictResolver; import com.intellij.psi.scope.processor.MethodCandidatesProcessor; import com.intellij.psi.scope.processor.MethodResolverProcessor; import com.intellij.psi.scope.util.PsiScopesUtil; +import com.intellij.psi.util.PsiTreeUtil; import com.intellij.psi.util.PsiUtil; import com.intellij.util.IncorrectOperationException; import com.intellij.util.SmartList; @@ -130,9 +131,28 @@ public class PsiResolveHelperImpl implements PsiResolveHelper { if (accessible && member instanceof PsiClass && !(member instanceof PsiTypeParameter)) { accessible = isAccessible(moduleSystem -> moduleSystem.isAccessible(((PsiClass)member), place)); } + if (fromImplicitClass(member, place)) { + return false; + } return accessible; } + /** + * Determines whether the given member is from an implicit class or not. + * If it is from implicit class, that place is in the same class + * + * @param member the member to check + * @param place the place where the check is performed + * @return true if the member is not from an implicit class or if place and member are both in the same implicit class, false otherwise. + */ + private static boolean fromImplicitClass(@NotNull PsiMember member, @NotNull PsiElement place) { + PsiImplicitClass implicitClass = PsiTreeUtil.getParentOfType(member, PsiImplicitClass.class); + if (implicitClass == null) { + return false; + } + return !PsiTreeUtil.isAncestor(implicitClass, place, false); + } + @Override public boolean isAccessible(@NotNull PsiPackage pkg, @NotNull PsiElement place) { return isAccessible(moduleSystem -> moduleSystem.isAccessible(pkg.getQualifiedName(), null, place)); diff --git a/java/java-tests/testData/refactoring/replaceConstructorWithFactory/beforeImplicitClass.java b/java/java-tests/testData/refactoring/replaceConstructorWithFactory/beforeImplicitClass.java new file mode 100644 index 000000000000..fe51d05a51aa --- /dev/null +++ b/java/java-tests/testData/refactoring/replaceConstructorWithFactory/beforeImplicitClass.java @@ -0,0 +1,5 @@ + +void main() { + Rar x = new Rar(); +} + diff --git a/java/java-tests/testSrc/com/intellij/java/codeInsight/intention/AddImportActionTest.java b/java/java-tests/testSrc/com/intellij/java/codeInsight/intention/AddImportActionTest.java index 0f545602b742..b0c10076a009 100644 --- a/java/java-tests/testSrc/com/intellij/java/codeInsight/intention/AddImportActionTest.java +++ b/java/java-tests/testSrc/com/intellij/java/codeInsight/intention/AddImportActionTest.java @@ -804,4 +804,24 @@ public class AddImportActionTest extends LightJavaCodeInsightFixtureTestCase { final List list = new @AssertTrue ArrayList(); }"""); } + + public void testNotImportFromImplicitClass() { + IdeaTestUtil.withLevel(getModule(), LanguageLevel.JDK_21_PREVIEW, ()->{ + myFixture.addClass(""" + enum E {A, B} + + static class Rar { + } + + void main() { + } + """); + myFixture.configureByText("a.java", """ + void main() { + Rar x = new Rar(); + } + """); + assertTrue(myFixture.filterAvailableIntentions("Import class").isEmpty()); + }); + } }