diff options
Diffstat (limited to 'plugins/kotlin/idea/src/org/jetbrains/kotlin/idea/quickfix/ChangeVisibilityOnExposureFactory.kt')
-rw-r--r-- | plugins/kotlin/idea/src/org/jetbrains/kotlin/idea/quickfix/ChangeVisibilityOnExposureFactory.kt | 71 |
1 files changed, 44 insertions, 27 deletions
diff --git a/plugins/kotlin/idea/src/org/jetbrains/kotlin/idea/quickfix/ChangeVisibilityOnExposureFactory.kt b/plugins/kotlin/idea/src/org/jetbrains/kotlin/idea/quickfix/ChangeVisibilityOnExposureFactory.kt index f073fd455db1..5c13aa603d86 100644 --- a/plugins/kotlin/idea/src/org/jetbrains/kotlin/idea/quickfix/ChangeVisibilityOnExposureFactory.kt +++ b/plugins/kotlin/idea/src/org/jetbrains/kotlin/idea/quickfix/ChangeVisibilityOnExposureFactory.kt @@ -1,11 +1,10 @@ -// Copyright 2000-2021 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license that can be found in the LICENSE file. +// Copyright 2000-2022 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license. package org.jetbrains.kotlin.idea.quickfix import com.intellij.codeInsight.intention.IntentionAction import org.jetbrains.kotlin.descriptors.* import org.jetbrains.kotlin.descriptors.DescriptorVisibilities.* -import org.jetbrains.kotlin.descriptors.EffectiveVisibility.Permissiveness.LESS import org.jetbrains.kotlin.diagnostics.Diagnostic import org.jetbrains.kotlin.diagnostics.DiagnosticFactory3 import org.jetbrains.kotlin.idea.caches.resolve.getResolutionFacade @@ -14,19 +13,18 @@ import org.jetbrains.kotlin.idea.resolve.getLanguageVersionSettings import org.jetbrains.kotlin.psi.KtDeclaration import org.jetbrains.kotlin.psi.KtModifierListOwner import org.jetbrains.kotlin.psi.psiUtil.getParentOfType +import org.jetbrains.kotlin.psi.psiUtil.isPrivate import org.jetbrains.kotlin.resolve.DescriptorToSourceUtils -import org.jetbrains.kotlin.types.checker.SimpleClassicTypeSystemContext -import java.util.* object ChangeVisibilityOnExposureFactory : KotlinIntentionActionsFactory() { private fun addFixToTargetVisibility( - modifierListOwner: KtModifierListOwner, - descriptor: DeclarationDescriptorWithVisibility, - targetVisibility: DescriptorVisibility, - boundVisibility: DescriptorVisibility, - protectedAllowed: Boolean, - fixes: MutableList<IntentionAction> + modifierListOwner: KtModifierListOwner, + descriptor: DeclarationDescriptorWithVisibility, + targetVisibility: DescriptorVisibility, + boundVisibility: DescriptorVisibility, + protectedAllowed: Boolean, + fixes: MutableList<IntentionAction>, ) { val possibleVisibilities = when (targetVisibility) { PROTECTED -> if (protectedAllowed) listOf(boundVisibility, PROTECTED) else listOf(boundVisibility) @@ -34,6 +32,7 @@ object ChangeVisibilityOnExposureFactory : KotlinIntentionActionsFactory() { boundVisibility -> listOf(boundVisibility) else -> listOf() } + possibleVisibilities.mapNotNullTo(fixes) { ChangeVisibilityFix.create(modifierListOwner, descriptor, it) } } @@ -42,33 +41,51 @@ object ChangeVisibilityOnExposureFactory : KotlinIntentionActionsFactory() { val factory = diagnostic.factory as DiagnosticFactory3<*, EffectiveVisibility, DescriptorWithRelation, EffectiveVisibility> // We have USER that uses some EXPOSED object. USER visibility must be same or less permissive. val exposedDiagnostic = factory.cast(diagnostic) - val exposedDescriptor = exposedDiagnostic.b.descriptor as? DeclarationDescriptorWithVisibility ?: return emptyList() - val exposedDeclaration = - DescriptorToSourceUtils.getSourceFromDescriptor(exposedDescriptor) as? KtModifierListOwner ?: return emptyList() - val exposedVisibility = exposedDiagnostic.c - val userVisibility = exposedDiagnostic.a - val (targetUserVisibility, targetExposedVisibility) = when (exposedVisibility.relation(userVisibility, SimpleClassicTypeSystemContext)) { - LESS -> Pair(exposedVisibility.toDescriptorVisibility(), userVisibility.toDescriptorVisibility()) - else -> Pair(PRIVATE, PUBLIC) - } + val exposedDescriptor = exposedDiagnostic.b.descriptor as? DeclarationDescriptorWithVisibility + ?: return emptyList() + + val exposedDeclaration = DescriptorToSourceUtils.getSourceFromDescriptor(exposedDescriptor) as? KtModifierListOwner + ?: return emptyList() + + val exposedVisibility = exposedDiagnostic.c.toDescriptorVisibility() + val userVisibility = exposedDiagnostic.a.toDescriptorVisibility() + val (targetUserVisibility, targetExposedVisibility) = + if (exposedVisibility.compareTo(userVisibility)?.let { it < 0 } == true) + Pair(exposedVisibility, userVisibility) + else + Pair(PRIVATE, PUBLIC) + val result = ArrayList<IntentionAction>() val userDeclaration = diagnostic.psiElement.getParentOfType<KtDeclaration>(true) val protectedAllowed = exposedDeclaration.parent == userDeclaration?.parent - if (userDeclaration != null) { + if (userDeclaration != null && !userDeclaration.isPrivate()) { val userDescriptor = userDeclaration.toDescriptor() as? DeclarationDescriptorWithVisibility - if (userDescriptor != null && DescriptorVisibilityUtils.isVisibleIgnoringReceiver(exposedDescriptor, userDescriptor, exposedDeclaration.getResolutionFacade().getLanguageVersionSettings())) { + if (userDescriptor != null && DescriptorVisibilityUtils.isVisibleIgnoringReceiver( + exposedDescriptor, + userDescriptor, + exposedDeclaration.getResolutionFacade().getLanguageVersionSettings(), + ) + ) { addFixToTargetVisibility( - userDeclaration, userDescriptor, - targetUserVisibility, PRIVATE, - protectedAllowed, result + modifierListOwner = userDeclaration, + descriptor = userDescriptor, + targetVisibility = targetUserVisibility, + boundVisibility = PRIVATE, + protectedAllowed = protectedAllowed, + fixes = result, ) } } + addFixToTargetVisibility( - exposedDeclaration, exposedDescriptor, - targetExposedVisibility, PUBLIC, - protectedAllowed, result + modifierListOwner = exposedDeclaration, + descriptor = exposedDescriptor, + targetVisibility = targetExposedVisibility, + boundVisibility = PUBLIC, + protectedAllowed = protectedAllowed, + fixes = result, ) + return result } } |