diff --git a/idea/src/org/jetbrains/kotlin/idea/quickfix/SuperClassNotInitialized.kt b/idea/src/org/jetbrains/kotlin/idea/quickfix/SuperClassNotInitialized.kt index 28fd9b0cd9c..c49002e73ca 100644 --- a/idea/src/org/jetbrains/kotlin/idea/quickfix/SuperClassNotInitialized.kt +++ b/idea/src/org/jetbrains/kotlin/idea/quickfix/SuperClassNotInitialized.kt @@ -31,6 +31,7 @@ import org.jetbrains.kotlin.renderer.DescriptorRenderer import org.jetbrains.kotlin.renderer.render import org.jetbrains.kotlin.resolve.BindingContext import org.jetbrains.kotlin.resolve.DescriptorToSourceUtils +import org.jetbrains.kotlin.resolve.descriptorUtil.classId import org.jetbrains.kotlin.resolve.lazy.BodyResolveMode import org.jetbrains.kotlin.types.KotlinType import org.jetbrains.kotlin.types.TypeConstructorSubstitution @@ -52,10 +53,10 @@ object SuperClassNotInitialized : KotlinIntentionActionsFactory() { val superClass = (type.constructor.declarationDescriptor as? ClassDescriptor) ?: return emptyList() val classDescriptor = classOrObjectDeclaration.resolveToDescriptorIfAny(BodyResolveMode.FULL) ?: return emptyList() - val containingPackage = superClass.containingDeclaration as? PackageFragmentDescriptor - val inSameFile = containingPackage == classDescriptor.containingDeclaration + val containingPackage = superClass.classId?.packageFqName + val inSamePackage = containingPackage != null && containingPackage == classDescriptor.classId?.packageFqName val constructors = superClass.constructors.filter { - it.isVisible(classDescriptor) || (superClass.modality == Modality.SEALED && inSameFile) + it.isVisible(classDescriptor) && (superClass.modality != Modality.SEALED || inSamePackage && classDescriptor.visibility != DescriptorVisibilities.LOCAL) } if (constructors.isEmpty() && (!superClass.isExpect || superClass.kind != ClassKind.CLASS)) { return emptyList() // no accessible constructor diff --git a/idea/testData/quickfix/supertypeInitialization/addParenthesisForInvalidSealedClass.kt b/idea/testData/quickfix/supertypeInitialization/addParenthesisForInvalidSealedClass.kt index a6c9a803094..60c2bf1c61a 100644 --- a/idea/testData/quickfix/supertypeInitialization/addParenthesisForInvalidSealedClass.kt +++ b/idea/testData/quickfix/supertypeInitialization/addParenthesisForInvalidSealedClass.kt @@ -6,4 +6,4 @@ sealed class A fun test() { class B : A -} \ No newline at end of file +} diff --git a/idea/testData/quickfix/supertypeInitialization/addParenthesisForInvalidSealedClass2.kt b/idea/testData/quickfix/supertypeInitialization/addParenthesisForInvalidSealedClass2.kt deleted file mode 100644 index 5a6961352fb..00000000000 --- a/idea/testData/quickfix/supertypeInitialization/addParenthesisForInvalidSealedClass2.kt +++ /dev/null @@ -1,10 +0,0 @@ -// "Change to constructor invocation" "false" -// ACTION: Introduce import alias -// ERROR: This type has a constructor, and thus must be initialized here -// ERROR: This type is sealed, so it can be inherited by only its own nested classes or objects - -class My { - sealed class A - - class B : A -} \ No newline at end of file diff --git a/idea/testData/quickfix/supertypeInitialization/addParenthesisForSealedClass2.kt b/idea/testData/quickfix/supertypeInitialization/addParenthesisForSealedClass2.kt new file mode 100644 index 00000000000..a1fd9b71fa8 --- /dev/null +++ b/idea/testData/quickfix/supertypeInitialization/addParenthesisForSealedClass2.kt @@ -0,0 +1,8 @@ +// "Change to constructor invocation" "true" +// ACTION: Introduce import alias + +class My { + sealed class A + + class B : A +} diff --git a/idea/testData/quickfix/supertypeInitialization/addParenthesisForSealedClass2.kt.after b/idea/testData/quickfix/supertypeInitialization/addParenthesisForSealedClass2.kt.after new file mode 100644 index 00000000000..54451d5f1f8 --- /dev/null +++ b/idea/testData/quickfix/supertypeInitialization/addParenthesisForSealedClass2.kt.after @@ -0,0 +1,8 @@ +// "Change to constructor invocation" "true" +// ACTION: Introduce import alias + +class My { + sealed 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 524ed4f1a3a..a19d3bdbe5e 100644 --- a/idea/tests/org/jetbrains/kotlin/idea/quickfix/QuickFixTestGenerated.java +++ b/idea/tests/org/jetbrains/kotlin/idea/quickfix/QuickFixTestGenerated.java @@ -12509,11 +12509,6 @@ public class QuickFixTestGenerated extends AbstractQuickFixTest { runTest("idea/testData/quickfix/supertypeInitialization/addParenthesisForInvalidSealedClass.kt"); } - @TestMetadata("addParenthesisForInvalidSealedClass2.kt") - public void testAddParenthesisForInvalidSealedClass2() throws Exception { - runTest("idea/testData/quickfix/supertypeInitialization/addParenthesisForInvalidSealedClass2.kt"); - } - @TestMetadata("addParenthesisForLocalClass.kt") public void testAddParenthesisForLocalClass() throws Exception { runTest("idea/testData/quickfix/supertypeInitialization/addParenthesisForLocalClass.kt"); @@ -12529,6 +12524,11 @@ public class QuickFixTestGenerated extends AbstractQuickFixTest { runTest("idea/testData/quickfix/supertypeInitialization/addParenthesisForSealedClass.kt"); } + @TestMetadata("addParenthesisForSealedClass2.kt") + public void testAddParenthesisForSealedClass2() throws Exception { + runTest("idea/testData/quickfix/supertypeInitialization/addParenthesisForSealedClass2.kt"); + } + public void testAllFilesPresentInSupertypeInitialization() throws Exception { KtTestUtil.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("idea/testData/quickfix/supertypeInitialization"), Pattern.compile("^([\\w\\-_]+)\\.kt$"), null, true); }