diff --git a/idea/src/org/jetbrains/kotlin/idea/quickfix/DecreaseExposingVisibilityFactory.kt b/idea/src/org/jetbrains/kotlin/idea/quickfix/ChangeVisibilityOnExposureFactory.kt similarity index 52% rename from idea/src/org/jetbrains/kotlin/idea/quickfix/DecreaseExposingVisibilityFactory.kt rename to idea/src/org/jetbrains/kotlin/idea/quickfix/ChangeVisibilityOnExposureFactory.kt index a5a35a26094..92353b83a97 100644 --- a/idea/src/org/jetbrains/kotlin/idea/quickfix/DecreaseExposingVisibilityFactory.kt +++ b/idea/src/org/jetbrains/kotlin/idea/quickfix/ChangeVisibilityOnExposureFactory.kt @@ -30,28 +30,43 @@ import org.jetbrains.kotlin.psi.KtDeclaration import org.jetbrains.kotlin.psi.KtModifierListOwner import org.jetbrains.kotlin.psi.psiUtil.getParentOfType import org.jetbrains.kotlin.resolve.DescriptorToSourceUtils +import java.util.* -object DecreaseExposingVisibilityFactory : KotlinSingleIntentionActionFactory() { - override fun createAction(diagnostic: Diagnostic): IntentionAction? { +object ChangeVisibilityOnExposureFactory : KotlinIntentionActionsFactory() { + override fun doCreateActions(diagnostic: Diagnostic): List { @Suppress("UNCHECKED_CAST") val factory = diagnostic.factory as DiagnosticFactory3<*, EffectiveVisibility, DescriptorWithRelation, EffectiveVisibility> val exposedDiagnostic = factory.cast(diagnostic) - val exposedDescriptor = exposedDiagnostic.b.descriptor as? DeclarationDescriptorWithVisibility ?: return null - val exposedDeclaration = DescriptorToSourceUtils.getSourceFromDescriptor(exposedDescriptor) as? KtModifierListOwner ?: return null + val exposedDescriptor = exposedDiagnostic.b.descriptor as? DeclarationDescriptorWithVisibility ?: return emptyList() + val exposedDeclaration = + DescriptorToSourceUtils.getSourceFromDescriptor(exposedDescriptor) as? KtModifierListOwner ?: return emptyList() val exposedVisibility = exposedDiagnostic.c val exposingVisibility = exposedDiagnostic.a - val boundVisibility = when (exposedVisibility.relation(exposingVisibility)) { - LESS -> exposedVisibility.toVisibility() - else -> PRIVATE + val (lowerBoundVisibility, upperBoundVisibility) = when (exposedVisibility.relation(exposingVisibility)) { + LESS -> Pair(exposedVisibility.toVisibility(), exposingVisibility.toVisibility()) + else -> Pair(PRIVATE, PUBLIC) } - val exposingDeclaration = diagnostic.psiElement.getParentOfType(true) ?: return null - val targetVisibility = when (boundVisibility) { - PUBLIC -> return null - PROTECTED -> if (exposedDeclaration.parent == exposingDeclaration.parent) PROTECTED else PRIVATE - else -> boundVisibility + val exposingDeclaration = diagnostic.psiElement.getParentOfType(true) + val exposingTargetVisibility = when (lowerBoundVisibility) { + PUBLIC -> null + PROTECTED -> if (exposedDeclaration.parent == exposingDeclaration?.parent) PROTECTED else PRIVATE + else -> lowerBoundVisibility } - val exposingDescriptor = exposingDeclaration.toDescriptor() as? DeclarationDescriptorWithVisibility ?: return null - if (!Visibilities.isVisibleIgnoringReceiver(exposedDescriptor, exposingDescriptor)) return null - return ChangeVisibilityFix.create(exposingDeclaration, exposingDescriptor, targetVisibility) + val exposingDescriptor = exposingDeclaration?.toDescriptor() as? DeclarationDescriptorWithVisibility + val result = ArrayList() + if (exposingDeclaration != null && exposingDescriptor != null && exposingTargetVisibility != null && + Visibilities.isVisibleIgnoringReceiver(exposedDescriptor, exposingDescriptor)) { + ChangeVisibilityFix.create(exposingDeclaration, exposingDescriptor, exposingTargetVisibility)?.let { result += it } + } + + val exposedTargetVisibility = when (upperBoundVisibility) { + PRIVATE -> null + PROTECTED -> if (exposedDeclaration.parent == exposingDeclaration?.parent) PROTECTED else PUBLIC + else -> upperBoundVisibility + } + if (exposedTargetVisibility != null) { + ChangeVisibilityFix.create(exposedDeclaration, exposedDescriptor, exposedTargetVisibility)?.let { result += it } + } + return result } } \ No newline at end of file diff --git a/idea/src/org/jetbrains/kotlin/idea/quickfix/IncreaseExposedVisibilityFactory.kt b/idea/src/org/jetbrains/kotlin/idea/quickfix/IncreaseExposedVisibilityFactory.kt deleted file mode 100644 index d2003c7f78a..00000000000 --- a/idea/src/org/jetbrains/kotlin/idea/quickfix/IncreaseExposedVisibilityFactory.kt +++ /dev/null @@ -1,53 +0,0 @@ -/* - * Copyright 2010-2016 JetBrains s.r.o. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package org.jetbrains.kotlin.idea.quickfix - -import com.intellij.codeInsight.intention.IntentionAction -import org.jetbrains.kotlin.descriptors.DeclarationDescriptorWithVisibility -import org.jetbrains.kotlin.descriptors.DescriptorWithRelation -import org.jetbrains.kotlin.descriptors.EffectiveVisibility -import org.jetbrains.kotlin.descriptors.EffectiveVisibility.Permissiveness.LESS -import org.jetbrains.kotlin.descriptors.Visibilities.* -import org.jetbrains.kotlin.diagnostics.Diagnostic -import org.jetbrains.kotlin.diagnostics.DiagnosticFactory3 -import org.jetbrains.kotlin.psi.KtDeclaration -import org.jetbrains.kotlin.psi.KtModifierListOwner -import org.jetbrains.kotlin.psi.psiUtil.getParentOfType -import org.jetbrains.kotlin.resolve.DescriptorToSourceUtils - -object IncreaseExposedVisibilityFactory : KotlinSingleIntentionActionFactory() { - override fun createAction(diagnostic: Diagnostic): IntentionAction? { - @Suppress("UNCHECKED_CAST") - val factory = diagnostic.factory as DiagnosticFactory3<*, EffectiveVisibility, DescriptorWithRelation, EffectiveVisibility> - val exposedDiagnostic = factory.cast(diagnostic) - val exposedDescriptor = exposedDiagnostic.b.descriptor as? DeclarationDescriptorWithVisibility ?: return null - val exposedDeclaration = DescriptorToSourceUtils.getSourceFromDescriptor(exposedDescriptor) as? KtModifierListOwner ?: return null - val exposedVisibility = exposedDiagnostic.c - val exposingVisibility = exposedDiagnostic.a - val boundVisibility = when (exposedVisibility.relation(exposingVisibility)) { - LESS -> exposingVisibility.toVisibility() - else -> PUBLIC - } - val exposingDeclaration = diagnostic.psiElement.getParentOfType(true) - val targetVisibility = when (boundVisibility) { - PRIVATE -> return null - PROTECTED -> if (exposedDeclaration.parent == exposingDeclaration?.parent) PROTECTED else PUBLIC - else -> boundVisibility - } - return ChangeVisibilityFix.create(exposedDeclaration, exposedDescriptor, targetVisibility) - } -} \ No newline at end of file diff --git a/idea/src/org/jetbrains/kotlin/idea/quickfix/QuickFixRegistrar.kt b/idea/src/org/jetbrains/kotlin/idea/quickfix/QuickFixRegistrar.kt index 36134dfb2ba..a6ca63d44f8 100644 --- a/idea/src/org/jetbrains/kotlin/idea/quickfix/QuickFixRegistrar.kt +++ b/idea/src/org/jetbrains/kotlin/idea/quickfix/QuickFixRegistrar.kt @@ -155,7 +155,7 @@ class QuickFixRegistrar : QuickFixContributor { for (exposed in listOf(EXPOSED_FUNCTION_RETURN_TYPE, EXPOSED_PARAMETER_TYPE, EXPOSED_PROPERTY_TYPE, EXPOSED_RECEIVER_TYPE, EXPOSED_SUPER_CLASS, EXPOSED_SUPER_INTERFACE, EXPOSED_TYPE_PARAMETER_BOUND)) { - exposed.registerFactory(IncreaseExposedVisibilityFactory, DecreaseExposingVisibilityFactory) + exposed.registerFactory(ChangeVisibilityOnExposureFactory) } REDUNDANT_NULLABLE.registerFactory(RemoveNullableFix.Factory(RemoveNullableFix.NullableKind.REDUNDANT))