diff --git a/idea/src/org/jetbrains/kotlin/idea/quickfix/ChangeVisibilityOnExposureFactory.kt b/idea/src/org/jetbrains/kotlin/idea/quickfix/ChangeVisibilityOnExposureFactory.kt index 6fa1dab0ec3..33a6d3b7514 100644 --- a/idea/src/org/jetbrains/kotlin/idea/quickfix/ChangeVisibilityOnExposureFactory.kt +++ b/idea/src/org/jetbrains/kotlin/idea/quickfix/ChangeVisibilityOnExposureFactory.kt @@ -48,26 +48,26 @@ object ChangeVisibilityOnExposureFactory : KotlinIntentionActionsFactory() { else -> Pair(PRIVATE, PUBLIC) } val userDeclaration = diagnostic.psiElement.getParentOfType(true) - val userTargetVisibility = when (lowerBoundVisibility) { - PUBLIC -> null - PROTECTED -> if (exposedDeclaration.parent == userDeclaration?.parent) PROTECTED else PRIVATE - else -> lowerBoundVisibility + val userTargetVisibilities = when (lowerBoundVisibility) { + PROTECTED -> if (exposedDeclaration.parent == userDeclaration?.parent) listOf(PRIVATE, PROTECTED) else listOf(PRIVATE) + INTERNAL -> listOf(PRIVATE, INTERNAL) + PRIVATE -> listOf(PRIVATE) + else -> listOf() } val userDescriptor = userDeclaration?.toDescriptor() as? DeclarationDescriptorWithVisibility val result = ArrayList() - if (userDeclaration != null && userDescriptor != null && userTargetVisibility != null && + if (userDeclaration != null && userDescriptor != null && Visibilities.isVisibleIgnoringReceiver(exposedDescriptor, userDescriptor)) { - ChangeVisibilityFix.create(userDeclaration, userDescriptor, userTargetVisibility)?.let { result += it } + result += userTargetVisibilities.mapNotNull { ChangeVisibilityFix.create(userDeclaration, userDescriptor, it) } } - val exposedTargetVisibility = when (upperBoundVisibility) { - PRIVATE -> null - PROTECTED -> if (exposedDeclaration.parent == userDeclaration?.parent) PROTECTED else PUBLIC - else -> upperBoundVisibility - } - if (exposedTargetVisibility != null) { - ChangeVisibilityFix.create(exposedDeclaration, exposedDescriptor, exposedTargetVisibility)?.let { result += it } + val exposedTargetVisibilities = when (upperBoundVisibility) { + PROTECTED -> if (exposedDeclaration.parent == userDeclaration?.parent) listOf(PUBLIC, PROTECTED) else listOf(PUBLIC) + INTERNAL -> listOf(PUBLIC, INTERNAL) + PUBLIC -> listOf(PUBLIC) + else -> listOf() } + result += exposedTargetVisibilities.mapNotNull { ChangeVisibilityFix.create(exposedDeclaration, exposedDescriptor, it) } return result } } \ No newline at end of file diff --git a/idea/testData/quickfix/decreaseVisibility/exposedParameterType.kt b/idea/testData/quickfix/decreaseVisibility/exposedParameterType.kt index ea41a1045fb..e7cd150fabc 100644 --- a/idea/testData/quickfix/decreaseVisibility/exposedParameterType.kt +++ b/idea/testData/quickfix/decreaseVisibility/exposedParameterType.kt @@ -1,6 +1,7 @@ // "Make foo private" "false" // ACTION: Convert parameter to receiver // ACTION: Make Nested internal +// ACTION: Make Nested public // ACTION: Remove parameter 'arg' // ERROR: 'internal' function exposes its 'private' parameter type argument Nested // ERROR: Cannot access 'Nested': it is 'private' in 'Outer' diff --git a/idea/testData/quickfix/decreaseVisibility/exposedReceiverType.kt b/idea/testData/quickfix/decreaseVisibility/exposedReceiverType.kt index d1dcafaccdd..8be84c66c43 100644 --- a/idea/testData/quickfix/decreaseVisibility/exposedReceiverType.kt +++ b/idea/testData/quickfix/decreaseVisibility/exposedReceiverType.kt @@ -1,6 +1,7 @@ // "Make foo private" "false" // ACTION: Convert receiver to parameter // ACTION: Make Private protected +// ACTION: Make Private public // ERROR: 'protected (in My)' member exposes its 'private' receiver type argument Private class Receiver diff --git a/idea/testData/quickfix/decreaseVisibility/exposedSuperInterfacePrivate.kt b/idea/testData/quickfix/decreaseVisibility/exposedSuperInterfacePrivate.kt new file mode 100644 index 00000000000..cd1e41f040c --- /dev/null +++ b/idea/testData/quickfix/decreaseVisibility/exposedSuperInterfacePrivate.kt @@ -0,0 +1,11 @@ +// "Make Derived private" "true" + +import Outer.Base + +internal class Outer { + interface Base +} + +class Container { + interface Derived : Base +} \ No newline at end of file diff --git a/idea/testData/quickfix/decreaseVisibility/exposedSuperInterfacePrivate.kt.after b/idea/testData/quickfix/decreaseVisibility/exposedSuperInterfacePrivate.kt.after new file mode 100644 index 00000000000..6059b4b16ec --- /dev/null +++ b/idea/testData/quickfix/decreaseVisibility/exposedSuperInterfacePrivate.kt.after @@ -0,0 +1,11 @@ +// "Make Derived private" "true" + +import Outer.Base + +internal class Outer { + interface Base +} + +class Container { + private interface Derived : Base +} \ No newline at end of file diff --git a/idea/testData/quickfix/increaseVisibility/exposedParameterTypePublic.kt b/idea/testData/quickfix/increaseVisibility/exposedParameterTypePublic.kt new file mode 100644 index 00000000000..9348f5ddd7f --- /dev/null +++ b/idea/testData/quickfix/increaseVisibility/exposedParameterTypePublic.kt @@ -0,0 +1,9 @@ +// "Make Nested public" "true" + +class Outer { + private class Nested +} + +class Generic + +internal fun foo(arg: Generic) {} \ No newline at end of file diff --git a/idea/testData/quickfix/increaseVisibility/exposedParameterTypePublic.kt.after b/idea/testData/quickfix/increaseVisibility/exposedParameterTypePublic.kt.after new file mode 100644 index 00000000000..ab861b0c33a --- /dev/null +++ b/idea/testData/quickfix/increaseVisibility/exposedParameterTypePublic.kt.after @@ -0,0 +1,9 @@ +// "Make Nested public" "true" + +class Outer { + class Nested +} + +class Generic + +internal fun foo(arg: Generic) {} \ 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 37e887dc76e..a1da2a7cf74 100644 --- a/idea/tests/org/jetbrains/kotlin/idea/quickfix/QuickFixTestGenerated.java +++ b/idea/tests/org/jetbrains/kotlin/idea/quickfix/QuickFixTestGenerated.java @@ -3548,6 +3548,12 @@ public class QuickFixTestGenerated extends AbstractQuickFixTest { doTest(fileName); } + @TestMetadata("exposedSuperInterfacePrivate.kt") + public void testExposedSuperInterfacePrivate() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("idea/testData/quickfix/decreaseVisibility/exposedSuperInterfacePrivate.kt"); + doTest(fileName); + } + @TestMetadata("exposedTypeParameterBound.kt") public void testExposedTypeParameterBound() throws Exception { String fileName = KotlinTestUtils.navigationMetadata("idea/testData/quickfix/decreaseVisibility/exposedTypeParameterBound.kt"); @@ -4800,6 +4806,12 @@ public class QuickFixTestGenerated extends AbstractQuickFixTest { doTest(fileName); } + @TestMetadata("exposedParameterTypePublic.kt") + public void testExposedParameterTypePublic() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("idea/testData/quickfix/increaseVisibility/exposedParameterTypePublic.kt"); + doTest(fileName); + } + @TestMetadata("exposedPropertyType.kt") public void testExposedPropertyType() throws Exception { String fileName = KotlinTestUtils.navigationMetadata("idea/testData/quickfix/increaseVisibility/exposedPropertyType.kt");