Refactoring: IncreaseExposed + DecreaseExposing = ChangeVisibilityOnExposure
This commit is contained in:
committed by
Mikhail Glukhikh
parent
8938752cf9
commit
0217e6104f
+30
-15
@@ -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<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 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<KtDeclaration>(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<KtDeclaration>(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<IntentionAction>()
|
||||
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
|
||||
}
|
||||
}
|
||||
@@ -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<KtDeclaration>(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)
|
||||
}
|
||||
}
|
||||
@@ -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))
|
||||
|
||||
Reference in New Issue
Block a user