summaryrefslogtreecommitdiff
path: root/plugins/kotlin/idea/src/org/jetbrains/kotlin/idea/quickfix/ChangeVisibilityOnExposureFactory.kt
diff options
context:
space:
mode:
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.kt71
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
}
}