diff --git a/idea/src/org/jetbrains/kotlin/idea/quickfix/MakeVisibleFactory.kt b/idea/src/org/jetbrains/kotlin/idea/quickfix/MakeVisibleFactory.kt index 25ac44f9f6f..ae32ec88b27 100644 --- a/idea/src/org/jetbrains/kotlin/idea/quickfix/MakeVisibleFactory.kt +++ b/idea/src/org/jetbrains/kotlin/idea/quickfix/MakeVisibleFactory.kt @@ -17,6 +17,7 @@ package org.jetbrains.kotlin.idea.quickfix import com.intellij.codeInsight.intention.IntentionAction +import org.jetbrains.kotlin.descriptors.ClassConstructorDescriptor import org.jetbrains.kotlin.descriptors.ClassDescriptor import org.jetbrains.kotlin.descriptors.DeclarationDescriptor import org.jetbrains.kotlin.descriptors.DeclarationDescriptorWithVisibility @@ -25,6 +26,7 @@ import org.jetbrains.kotlin.diagnostics.Diagnostic import org.jetbrains.kotlin.diagnostics.DiagnosticFactory3 import org.jetbrains.kotlin.idea.caches.resolve.findModuleDescriptor import org.jetbrains.kotlin.idea.search.usagesSearch.descriptor +import org.jetbrains.kotlin.lexer.KtTokens import org.jetbrains.kotlin.psi.KtElement import org.jetbrains.kotlin.psi.KtModifierListOwner import org.jetbrains.kotlin.psi.psiUtil.containingClass @@ -42,6 +44,8 @@ object MakeVisibleFactory : KotlinIntentionActionsFactory() { val descriptor = factory.cast(diagnostic).c as? DeclarationDescriptorWithVisibility ?: return emptyList() val declaration = DescriptorToSourceUtils.descriptorToDeclaration(descriptor) as? KtModifierListOwner ?: return emptyList() + if (declaration.hasModifier(KtTokens.SEALED_KEYWORD) && descriptor is ClassConstructorDescriptor) return emptyList() + val module = DescriptorUtils.getContainingModule(descriptor) val targetVisibilities = when (descriptor.visibility) { PRIVATE, INVISIBLE_FAKE -> mutableListOf(PUBLIC).apply { diff --git a/idea/testData/quickfix/increaseVisibility/invalidSealedClassInheritance.kt b/idea/testData/quickfix/increaseVisibility/invalidSealedClassInheritance.kt new file mode 100644 index 00000000000..54aaf733e6d --- /dev/null +++ b/idea/testData/quickfix/increaseVisibility/invalidSealedClassInheritance.kt @@ -0,0 +1,10 @@ +// "Make '' public" "false" +// "Make '' internal" "false" +// ERROR: Cannot access '': it is private in 'SealedClass' +// ERROR: This type is sealed, so it can be inherited by only its own nested classes or objects + +sealed class SealedClass + +fun test() { + class Test : SealedClass() +} \ No newline at end of file diff --git a/idea/testData/quickfix/increaseVisibility/privateSealedClassInheritance.kt b/idea/testData/quickfix/increaseVisibility/privateSealedClassInheritance.kt new file mode 100644 index 00000000000..1b265993ab9 --- /dev/null +++ b/idea/testData/quickfix/increaseVisibility/privateSealedClassInheritance.kt @@ -0,0 +1,6 @@ +// "Make 'SealedClass' public" "true" +// ACTION: "Make 'Test' private" + +private sealed class SealedClass + +class Test : SealedClass() \ No newline at end of file diff --git a/idea/testData/quickfix/increaseVisibility/privateSealedClassInheritance.kt.after b/idea/testData/quickfix/increaseVisibility/privateSealedClassInheritance.kt.after new file mode 100644 index 00000000000..eb13e77d7a1 --- /dev/null +++ b/idea/testData/quickfix/increaseVisibility/privateSealedClassInheritance.kt.after @@ -0,0 +1,6 @@ +// "Make 'SealedClass' public" "true" +// ACTION: "Make 'Test' private" + +sealed class SealedClass + +class Test : SealedClass() \ No newline at end of file diff --git a/idea/tests/org/jetbrains/kotlin/idea/quickfix/QuickFixTestGenerated.java b/idea/tests/org/jetbrains/kotlin/idea/quickfix/QuickFixTestGenerated.java index 982ec73baca..9f57e6dd4fa 100644 --- a/idea/tests/org/jetbrains/kotlin/idea/quickfix/QuickFixTestGenerated.java +++ b/idea/tests/org/jetbrains/kotlin/idea/quickfix/QuickFixTestGenerated.java @@ -6683,6 +6683,12 @@ public class QuickFixTestGenerated extends AbstractQuickFixTest { doTest(fileName); } + @TestMetadata("invalidSealedClassInheritance.kt") + public void testInvalidSealedClassInheritance() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("idea/testData/quickfix/increaseVisibility/invalidSealedClassInheritance.kt"); + doTest(fileName); + } + @TestMetadata("overriddenProtectedMemberToPublicSingleFile.kt") public void testOverriddenProtectedMemberToPublicSingleFile() throws Exception { String fileName = KotlinTestUtils.navigationMetadata("idea/testData/quickfix/increaseVisibility/overriddenProtectedMemberToPublicSingleFile.kt"); @@ -6707,6 +6713,12 @@ public class QuickFixTestGenerated extends AbstractQuickFixTest { doTest(fileName); } + @TestMetadata("privateSealedClassInheritance.kt") + public void testPrivateSealedClassInheritance() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("idea/testData/quickfix/increaseVisibility/privateSealedClassInheritance.kt"); + doTest(fileName); + } + @TestMetadata("protectedMemberToPublicSingleFile.kt") public void testProtectedMemberToPublicSingleFile() throws Exception { String fileName = KotlinTestUtils.navigationMetadata("idea/testData/quickfix/increaseVisibility/protectedMemberToPublicSingleFile.kt");