CreateSubclass: support sealed classes (IDEA-243902)

GitOrigin-RevId: 430dbb9d1a8934c2169e3f1050b18e7d78f0d985
This commit is contained in:
Artemiy Sartakov
2020-08-03 09:08:11 +00:00
committed by intellij-monorepo-bot
parent 03a79536c5
commit 175337c304
5 changed files with 30 additions and 0 deletions
@@ -60,7 +60,9 @@ import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.Objects;
public class CreateSubclassAction extends BaseIntentionAction {
private static final Logger LOG = Logger.getInstance(CreateSubclassAction.class);
@@ -262,6 +264,10 @@ public class CreateSubclassAction extends BaseIntentionAction {
else {
ref = (PsiJavaCodeReferenceElement)targetClass.getExtendsList().add(ref);
}
if (psiClass.hasModifierProperty(PsiModifier.SEALED)) {
String createdClassName = targetClass.getQualifiedName();
FillPermitsListFix.fillPermitsList(psiClass, Collections.singleton(createdClassName));
}
if (psiClass.hasTypeParameters() || includeClassName) {
final Editor editor = CodeInsightUtil.positionCursorAtLBrace(project, targetClass.getContainingFile(), targetClass);
final TemplateBuilderImpl templateBuilder = editor != null
@@ -361,6 +367,11 @@ public class CreateSubclassAction extends BaseIntentionAction {
editor.getCaretModel().moveToOffset(offset);
}
if (psiClass.hasModifierProperty(PsiModifier.SEALED)) {
PsiIdentifier targetNameIdentifier = Objects.requireNonNull(targetClass.getNameIdentifier());
editor.getCaretModel().moveToOffset(targetNameIdentifier.getTextRange().getStartOffset());
}
if (showChooser) OverrideImplementUtil.chooseAndImplementMethods(project, editor, targetClass);
}
@@ -0,0 +1,2 @@
public class Subclass extends Superclass {
}
@@ -0,0 +1,3 @@
public sealed class Superclass permits Subclass {
void foo() {}
}
@@ -0,0 +1,3 @@
public sealed class Superclass {
void foo() {}
}
@@ -21,12 +21,19 @@ import com.intellij.openapi.application.ex.PathManagerEx;
import com.intellij.psi.PsiClass;
import com.intellij.psi.PsiDirectory;
import com.intellij.refactoring.LightMultiFileTestCase;
import com.intellij.testFramework.LightProjectDescriptor;
import com.intellij.util.ui.UIUtil;
import org.jetbrains.annotations.NotNull;
/**
* @author yole
*/
public class CreateSubclassTest extends LightMultiFileTestCase {
@Override
protected @NotNull LightProjectDescriptor getProjectDescriptor() {
return JAVA_15;
}
public void testGenerics() {
doTest();
}
@@ -43,6 +50,10 @@ public class CreateSubclassTest extends LightMultiFileTestCase {
doTestInner();
}
public void testSealed() {
doTest();
}
private void doTestInner() {
doTest(() -> {
PsiClass superClass = myFixture.findClass("Test");