CreateSubclassAction: create sealed class subclass in the same file when all current inheritors are in the same file

GitOrigin-RevId: f0db9c12a7daab38aa82ebeec34f8a55ccbb3573
This commit is contained in:
Artemiy Sartakov
2020-09-02 04:33:17 +00:00
committed by intellij-monorepo-bot
parent 417a4cdf60
commit 150b695399
2 changed files with 14 additions and 5 deletions
@@ -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<Boolean> hasInheritors = Ref.create(false);
boolean hasOnlySameFileInheritors = DirectClassInheritorsSearch.search(psiClass).forEach((Processor<? super PsiClass>) 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<String> missingInheritors = new SmartHashSet<>();
missingInheritors.add(createdClassName);
@@ -1,4 +1,4 @@
public sealed class Superclass permits B, Subclass {
public sealed class Superclass {
public void foo() {}
}