diff --git a/idea/src/org/jetbrains/kotlin/idea/quickfix/AddDefaultConstructorFix.kt b/idea/src/org/jetbrains/kotlin/idea/quickfix/AddDefaultConstructorFix.kt index fa4154cdafd..994ac6ddde1 100644 --- a/idea/src/org/jetbrains/kotlin/idea/quickfix/AddDefaultConstructorFix.kt +++ b/idea/src/org/jetbrains/kotlin/idea/quickfix/AddDefaultConstructorFix.kt @@ -27,17 +27,21 @@ class AddDefaultConstructorFix(expectClass: KtClass) : KotlinQuickFixAction? { val argumentList = diagnostic.psiElement as? KtValueArgumentList ?: return null if (argumentList.arguments.isNotEmpty()) return null val derivedClass = argumentList.getStrictParentOfType() ?: return null val context = derivedClass.analyze() val baseTypeCallEntry = derivedClass.superTypeListEntries.filterIsInstance().firstOrNull() ?: return null - val baseType = context[BindingContext.TYPE, baseTypeCallEntry.typeReference] ?: return null - val baseClassDescriptor = baseType.constructor.declarationDescriptor as? ClassDescriptor ?: return null - if (!baseClassDescriptor.isExpect) return null - if (baseClassDescriptor.kind != ClassKind.CLASS) return null - val baseClass = DescriptorToSourceUtils.descriptorToDeclaration(baseClassDescriptor) as? KtClass ?: return null + val baseClass = superTypeEntryToClass(baseTypeCallEntry, context) ?: return null return AddDefaultConstructorFix(baseClass) } } diff --git a/idea/src/org/jetbrains/kotlin/idea/quickfix/SuperClassNotInitialized.kt b/idea/src/org/jetbrains/kotlin/idea/quickfix/SuperClassNotInitialized.kt index 8bedffeff03..41173a32a93 100644 --- a/idea/src/org/jetbrains/kotlin/idea/quickfix/SuperClassNotInitialized.kt +++ b/idea/src/org/jetbrains/kotlin/idea/quickfix/SuperClassNotInitialized.kt @@ -32,9 +32,9 @@ import org.jetbrains.kotlin.idea.core.isVisible import org.jetbrains.kotlin.idea.core.moveCaret import org.jetbrains.kotlin.idea.core.replaced import org.jetbrains.kotlin.idea.util.IdeDescriptorRenderers +import org.jetbrains.kotlin.idea.util.isExpectDeclaration import org.jetbrains.kotlin.psi.* -import org.jetbrains.kotlin.psi.psiUtil.createSmartPointer -import org.jetbrains.kotlin.psi.psiUtil.endOffset +import org.jetbrains.kotlin.psi.psiUtil.* import org.jetbrains.kotlin.renderer.DescriptorRenderer import org.jetbrains.kotlin.renderer.render import org.jetbrains.kotlin.resolve.BindingContext @@ -64,7 +64,9 @@ object SuperClassNotInitialized : KotlinIntentionActionsFactory() { val constructors = superClass.constructors.filter { it.isVisible(classDescriptor) || (superClass.modality == Modality.SEALED && inSameFile) } - if (constructors.isEmpty()) return emptyList() // no accessible constructor + if (constructors.isEmpty() && (!superClass.isExpect || superClass.kind != ClassKind.CLASS)) { + return emptyList() // no accessible constructor + } val fixes = ArrayList() @@ -122,7 +124,13 @@ object SuperClassNotInitialized : KotlinIntentionActionsFactory() { override fun invoke(project: Project, editor: Editor?, file: KtFile) { val element = element ?: return + val context = (element.getStrictParentOfType() ?: element).analyze() + val baseClass = AddDefaultConstructorFix.superTypeEntryToClass(element, context) + val newSpecifier = element.replaced(KtPsiFactory(project).createSuperTypeCallEntry(element.text + "()")) + if (baseClass != null && baseClass.hasExpectModifier() && baseClass.secondaryConstructors.isEmpty()) { + baseClass.createPrimaryConstructorIfAbsent() + } if (putCaretIntoParenthesis) { if (editor != null) { diff --git a/idea/testData/quickfix/supertypeInitialization/addParenthesisExpectClass.kt b/idea/testData/quickfix/supertypeInitialization/addParenthesisExpectClass.kt new file mode 100644 index 00000000000..1ed3faa77f1 --- /dev/null +++ b/idea/testData/quickfix/supertypeInitialization/addParenthesisExpectClass.kt @@ -0,0 +1,7 @@ +// "Change to constructor invocation" "true" +// ENABLE_MULTIPLATFORM +// DISABLE-ERRORS + +expect open class A + +class B : A diff --git a/idea/testData/quickfix/supertypeInitialization/addParenthesisExpectClass.kt.after b/idea/testData/quickfix/supertypeInitialization/addParenthesisExpectClass.kt.after new file mode 100644 index 00000000000..f7988772ca7 --- /dev/null +++ b/idea/testData/quickfix/supertypeInitialization/addParenthesisExpectClass.kt.after @@ -0,0 +1,7 @@ +// "Change to constructor invocation" "true" +// ENABLE_MULTIPLATFORM +// DISABLE-ERRORS + +expect open class A() + +class B : A() diff --git a/idea/tests/org/jetbrains/kotlin/idea/quickfix/QuickFixTestGenerated.java b/idea/tests/org/jetbrains/kotlin/idea/quickfix/QuickFixTestGenerated.java index cfbf66e619c..ca01170999a 100644 --- a/idea/tests/org/jetbrains/kotlin/idea/quickfix/QuickFixTestGenerated.java +++ b/idea/tests/org/jetbrains/kotlin/idea/quickfix/QuickFixTestGenerated.java @@ -10026,6 +10026,11 @@ public class QuickFixTestGenerated extends AbstractQuickFixTest { runTest("idea/testData/quickfix/supertypeInitialization/addParenthesisEmptyConstructor.kt"); } + @TestMetadata("addParenthesisExpectClass.kt") + public void testAddParenthesisExpectClass() throws Exception { + runTest("idea/testData/quickfix/supertypeInitialization/addParenthesisExpectClass.kt"); + } + @TestMetadata("addParenthesisForInvalidSealedClass.kt") public void testAddParenthesisForInvalidSealedClass() throws Exception { runTest("idea/testData/quickfix/supertypeInitialization/addParenthesisForInvalidSealedClass.kt");