Minor refactoring: change visibility on exposure (exposing -> user)
This commit is contained in:
committed by
Mikhail Glukhikh
parent
0217e6104f
commit
a2501463a8
@@ -36,32 +36,33 @@ object ChangeVisibilityOnExposureFactory : KotlinIntentionActionsFactory() {
|
|||||||
override fun doCreateActions(diagnostic: Diagnostic): List<IntentionAction> {
|
override fun doCreateActions(diagnostic: Diagnostic): List<IntentionAction> {
|
||||||
@Suppress("UNCHECKED_CAST")
|
@Suppress("UNCHECKED_CAST")
|
||||||
val factory = diagnostic.factory as DiagnosticFactory3<*, EffectiveVisibility, DescriptorWithRelation, EffectiveVisibility>
|
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 exposedDiagnostic = factory.cast(diagnostic)
|
||||||
val exposedDescriptor = exposedDiagnostic.b.descriptor as? DeclarationDescriptorWithVisibility ?: return emptyList()
|
val exposedDescriptor = exposedDiagnostic.b.descriptor as? DeclarationDescriptorWithVisibility ?: return emptyList()
|
||||||
val exposedDeclaration =
|
val exposedDeclaration =
|
||||||
DescriptorToSourceUtils.getSourceFromDescriptor(exposedDescriptor) as? KtModifierListOwner ?: return emptyList()
|
DescriptorToSourceUtils.getSourceFromDescriptor(exposedDescriptor) as? KtModifierListOwner ?: return emptyList()
|
||||||
val exposedVisibility = exposedDiagnostic.c
|
val exposedVisibility = exposedDiagnostic.c
|
||||||
val exposingVisibility = exposedDiagnostic.a
|
val userVisibility = exposedDiagnostic.a
|
||||||
val (lowerBoundVisibility, upperBoundVisibility) = when (exposedVisibility.relation(exposingVisibility)) {
|
val (lowerBoundVisibility, upperBoundVisibility) = when (exposedVisibility.relation(userVisibility)) {
|
||||||
LESS -> Pair(exposedVisibility.toVisibility(), exposingVisibility.toVisibility())
|
LESS -> Pair(exposedVisibility.toVisibility(), userVisibility.toVisibility())
|
||||||
else -> Pair(PRIVATE, PUBLIC)
|
else -> Pair(PRIVATE, PUBLIC)
|
||||||
}
|
}
|
||||||
val exposingDeclaration = diagnostic.psiElement.getParentOfType<KtDeclaration>(true)
|
val userDeclaration = diagnostic.psiElement.getParentOfType<KtDeclaration>(true)
|
||||||
val exposingTargetVisibility = when (lowerBoundVisibility) {
|
val userTargetVisibility = when (lowerBoundVisibility) {
|
||||||
PUBLIC -> null
|
PUBLIC -> null
|
||||||
PROTECTED -> if (exposedDeclaration.parent == exposingDeclaration?.parent) PROTECTED else PRIVATE
|
PROTECTED -> if (exposedDeclaration.parent == userDeclaration?.parent) PROTECTED else PRIVATE
|
||||||
else -> lowerBoundVisibility
|
else -> lowerBoundVisibility
|
||||||
}
|
}
|
||||||
val exposingDescriptor = exposingDeclaration?.toDescriptor() as? DeclarationDescriptorWithVisibility
|
val userDescriptor = userDeclaration?.toDescriptor() as? DeclarationDescriptorWithVisibility
|
||||||
val result = ArrayList<IntentionAction>()
|
val result = ArrayList<IntentionAction>()
|
||||||
if (exposingDeclaration != null && exposingDescriptor != null && exposingTargetVisibility != null &&
|
if (userDeclaration != null && userDescriptor != null && userTargetVisibility != null &&
|
||||||
Visibilities.isVisibleIgnoringReceiver(exposedDescriptor, exposingDescriptor)) {
|
Visibilities.isVisibleIgnoringReceiver(exposedDescriptor, userDescriptor)) {
|
||||||
ChangeVisibilityFix.create(exposingDeclaration, exposingDescriptor, exposingTargetVisibility)?.let { result += it }
|
ChangeVisibilityFix.create(userDeclaration, userDescriptor, userTargetVisibility)?.let { result += it }
|
||||||
}
|
}
|
||||||
|
|
||||||
val exposedTargetVisibility = when (upperBoundVisibility) {
|
val exposedTargetVisibility = when (upperBoundVisibility) {
|
||||||
PRIVATE -> null
|
PRIVATE -> null
|
||||||
PROTECTED -> if (exposedDeclaration.parent == exposingDeclaration?.parent) PROTECTED else PUBLIC
|
PROTECTED -> if (exposedDeclaration.parent == userDeclaration?.parent) PROTECTED else PUBLIC
|
||||||
else -> upperBoundVisibility
|
else -> upperBoundVisibility
|
||||||
}
|
}
|
||||||
if (exposedTargetVisibility != null) {
|
if (exposedTargetVisibility != null) {
|
||||||
|
|||||||
Reference in New Issue
Block a user