diff --git a/java/java-impl/src/com/intellij/codeInsight/intention/impl/CreateSubclassAction.java b/java/java-impl/src/com/intellij/codeInsight/intention/impl/CreateSubclassAction.java index 9918a9317eb4..e9b427dc11d2 100644 --- a/java/java-impl/src/com/intellij/codeInsight/intention/impl/CreateSubclassAction.java +++ b/java/java-impl/src/com/intellij/codeInsight/intention/impl/CreateSubclassAction.java @@ -46,6 +46,7 @@ import com.intellij.openapi.roots.ProjectFileIndex; import com.intellij.openapi.roots.ProjectRootManager; import com.intellij.openapi.ui.Messages; import com.intellij.openapi.util.NlsContexts; +import com.intellij.openapi.util.Ref; import com.intellij.openapi.util.TextRange; import com.intellij.openapi.vfs.VirtualFile; import com.intellij.psi.*; @@ -57,6 +58,7 @@ import com.intellij.psi.util.PsiUtilCore; import com.intellij.psi.util.TypeConversionUtil; import com.intellij.util.ArrayUtil; import com.intellij.util.IncorrectOperationException; +import com.intellij.util.Processor; import com.intellij.util.containers.SmartHashSet; import com.siyeh.ig.psiutils.SealedUtils; import org.jetbrains.annotations.NotNull; @@ -213,9 +215,16 @@ public class CreateSubclassAction extends BaseIntentionAction { } private static boolean hasOnlySameFileInheritors(PsiClass psiClass) { - if (!psiClass.hasModifierProperty(PsiModifier.SEALED)) return false; - return DirectClassInheritorsSearch.search(psiClass) - .allMatch(inheritor -> inheritor.getContainingFile() == psiClass.getContainingFile()); + if (!psiClass.hasModifierProperty(PsiModifier.SEALED) || psiClass.getPermitsList() != null) return false; + Ref hasInheritors = Ref.create(false); + boolean hasOnlySameFileInheritors = DirectClassInheritorsSearch.search(psiClass).forEach((Processor) inheritor -> { + if (inheritor.getContainingFile() != psiClass.getContainingFile()) { + return false; + } + hasInheritors.set(true); + return true; + }); + return hasOnlySameFileInheritors && hasInheritors.get(); } @Nullable @@ -305,7 +314,7 @@ public class CreateSubclassAction extends BaseIntentionAction { else { ref = (PsiJavaCodeReferenceElement)targetClass.getExtendsList().add(ref); } - if (psiClass.hasModifierProperty(PsiModifier.SEALED)) { + if (psiClass.hasModifierProperty(PsiModifier.SEALED) && psiClass.getContainingFile() != targetClass.getContainingFile()) { String createdClassName = Objects.requireNonNull(targetClass.getQualifiedName()); SmartHashSet missingInheritors = new SmartHashSet<>(); missingInheritors.add(createdClassName); diff --git a/java/java-tests/testData/codeInsight/createSubclass/sealedWithSameFileInheritors/after/Superclass.java b/java/java-tests/testData/codeInsight/createSubclass/sealedWithSameFileInheritors/after/Superclass.java index 0dd58cb9402f..d94f856ae553 100644 --- a/java/java-tests/testData/codeInsight/createSubclass/sealedWithSameFileInheritors/after/Superclass.java +++ b/java/java-tests/testData/codeInsight/createSubclass/sealedWithSameFileInheritors/after/Superclass.java @@ -1,4 +1,4 @@ -public sealed class Superclass permits B, Subclass { +public sealed class Superclass { public void foo() {} }