diff --git a/idea/src/org/jetbrains/kotlin/idea/quickfix/createFromUsage/createClass/CreateClassFromUsageFix.kt b/idea/src/org/jetbrains/kotlin/idea/quickfix/createFromUsage/createClass/CreateClassFromUsageFix.kt index 89f83381477..8d902d538e3 100644 --- a/idea/src/org/jetbrains/kotlin/idea/quickfix/createFromUsage/createClass/CreateClassFromUsageFix.kt +++ b/idea/src/org/jetbrains/kotlin/idea/quickfix/createFromUsage/createClass/CreateClassFromUsageFix.kt @@ -46,12 +46,8 @@ import org.jetbrains.kotlin.idea.util.application.runWriteAction import org.jetbrains.kotlin.idea.util.projectStructure.module import org.jetbrains.kotlin.name.FqName import org.jetbrains.kotlin.name.Name -import org.jetbrains.kotlin.psi.KtClass -import org.jetbrains.kotlin.psi.KtElement -import org.jetbrains.kotlin.psi.KtFile -import org.jetbrains.kotlin.psi.KtSimpleNameExpression +import org.jetbrains.kotlin.psi.* import org.jetbrains.kotlin.psi.psiUtil.allChildren -import org.jetbrains.kotlin.psi.psiUtil.containingClass import org.jetbrains.kotlin.psi.psiUtil.getQualifiedElementSelector import org.jetbrains.kotlin.utils.SmartList import java.util.* @@ -117,17 +113,20 @@ open class CreateClassFromUsageFix protected constructor ( if (editor == null) return val applicableParents = SmartList().also { parents -> - if (classInfo.kind == ClassKind.INTERFACE) - classInfo.applicableParents.filterTo(parents) { it != element?.containingClass() } - else - parents += classInfo.applicableParents - + classInfo.applicableParents.filterNotTo(parents) { + it is KtClassOrObject && it.superTypeListEntries.any { + when (it) { + is KtDelegatedSuperTypeEntry, is KtSuperTypeEntry -> it.typeAsUserType == element + is KtSuperTypeCallEntry -> it == element + else -> false + } + } + } if (classInfo.kind != ClassKind.ENUM_ENTRY) { parents += SeparateFileWrapper(PsiManager.getInstance(project)) } } - if (ApplicationManager.getApplication().isUnitTestMode) { val targetParent = applicableParents.firstOrNull { it.allChildren.any { it is PsiComment && it.text == "// TARGET_PARENT:" } diff --git a/idea/testData/quickfix/createFromUsage/createClass/delegationSpecifier/createSuperclassInsideSubclass.kt b/idea/testData/quickfix/createFromUsage/createClass/delegationSpecifier/createSuperclassInsideSubclass.kt new file mode 100644 index 00000000000..717bfc0ba1e --- /dev/null +++ b/idea/testData/quickfix/createFromUsage/createClass/delegationSpecifier/createSuperclassInsideSubclass.kt @@ -0,0 +1,7 @@ +// "Create class 'A'" "true" +package p + +// TARGET_PARENT: +class Foo: A() { + +} \ No newline at end of file diff --git a/idea/testData/quickfix/createFromUsage/createClass/delegationSpecifier/createSuperclassInsideSubclass.kt.after b/idea/testData/quickfix/createFromUsage/createClass/delegationSpecifier/createSuperclassInsideSubclass.kt.after new file mode 100644 index 00000000000..79f3b8d4a88 --- /dev/null +++ b/idea/testData/quickfix/createFromUsage/createClass/delegationSpecifier/createSuperclassInsideSubclass.kt.after @@ -0,0 +1,11 @@ +// "Create class 'A'" "true" +package p + +// TARGET_PARENT: +class Foo: A() { + +} + +open class A { + +} diff --git a/idea/tests/org/jetbrains/kotlin/idea/quickfix/QuickFixTestGenerated.java b/idea/tests/org/jetbrains/kotlin/idea/quickfix/QuickFixTestGenerated.java index b3a444a5b4a..b5922bf1c0b 100644 --- a/idea/tests/org/jetbrains/kotlin/idea/quickfix/QuickFixTestGenerated.java +++ b/idea/tests/org/jetbrains/kotlin/idea/quickfix/QuickFixTestGenerated.java @@ -2286,6 +2286,11 @@ public class QuickFixTestGenerated extends AbstractQuickFixTest { runTest("idea/testData/quickfix/createFromUsage/createClass/delegationSpecifier/classDelegatorToSuperclass.kt"); } + @TestMetadata("createSuperclassInsideSubclass.kt") + public void testCreateSuperclassInsideSubclass() throws Exception { + runTest("idea/testData/quickfix/createFromUsage/createClass/delegationSpecifier/createSuperclassInsideSubclass.kt"); + } + @TestMetadata("delegatorToSupercallNoReceiver.kt") public void testDelegatorToSupercallNoReceiver() throws Exception { runTest("idea/testData/quickfix/createFromUsage/createClass/delegationSpecifier/delegatorToSupercallNoReceiver.kt");