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 897d970c74a1..f3a7c1af737a 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 @@ -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); } diff --git a/java/java-tests/testData/codeInsight/createSubclass/sealed/after/Subclass.java b/java/java-tests/testData/codeInsight/createSubclass/sealed/after/Subclass.java new file mode 100644 index 000000000000..306b1cb7aad3 --- /dev/null +++ b/java/java-tests/testData/codeInsight/createSubclass/sealed/after/Subclass.java @@ -0,0 +1,2 @@ +public class Subclass extends Superclass { +} diff --git a/java/java-tests/testData/codeInsight/createSubclass/sealed/after/Superclass.java b/java/java-tests/testData/codeInsight/createSubclass/sealed/after/Superclass.java new file mode 100644 index 000000000000..f01b469533ec --- /dev/null +++ b/java/java-tests/testData/codeInsight/createSubclass/sealed/after/Superclass.java @@ -0,0 +1,3 @@ +public sealed class Superclass permits Subclass { + void foo() {} +} \ No newline at end of file diff --git a/java/java-tests/testData/codeInsight/createSubclass/sealed/before/Superclass.java b/java/java-tests/testData/codeInsight/createSubclass/sealed/before/Superclass.java new file mode 100644 index 000000000000..50d459bde7b6 --- /dev/null +++ b/java/java-tests/testData/codeInsight/createSubclass/sealed/before/Superclass.java @@ -0,0 +1,3 @@ +public sealed class Superclass { + void foo() {} +} \ No newline at end of file diff --git a/java/java-tests/testSrc/com/intellij/java/codeInsight/intention/CreateSubclassTest.java b/java/java-tests/testSrc/com/intellij/java/codeInsight/intention/CreateSubclassTest.java index d8a2f058677a..808084c6820b 100644 --- a/java/java-tests/testSrc/com/intellij/java/codeInsight/intention/CreateSubclassTest.java +++ b/java/java-tests/testSrc/com/intellij/java/codeInsight/intention/CreateSubclassTest.java @@ -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");