Minor refactoring: change visibility on exposure (exposing -> user)

This commit is contained in:
Mikhail Glukhikh
2016-04-22 13:06:10 +03:00
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) {