KT-45347 Quickfix to move to sealed parent: do not suggest for binaries

^KT-45347 Fixed
This commit is contained in:
Andrei Klunnyi
2021-04-14 18:10:03 +02:00
parent d531df1643
commit 2bb7f6a168
@@ -20,10 +20,13 @@ import com.intellij.psi.util.parentOfType
import com.intellij.refactoring.PackageWrapper import com.intellij.refactoring.PackageWrapper
import com.intellij.refactoring.move.MoveCallback import com.intellij.refactoring.move.MoveCallback
import com.intellij.refactoring.move.MoveHandler import com.intellij.refactoring.move.MoveHandler
import org.jetbrains.kotlin.descriptors.ClassDescriptor
import org.jetbrains.kotlin.descriptors.containingPackage import org.jetbrains.kotlin.descriptors.containingPackage
import org.jetbrains.kotlin.descriptors.isSealed
import org.jetbrains.kotlin.diagnostics.Diagnostic import org.jetbrains.kotlin.diagnostics.Diagnostic
import org.jetbrains.kotlin.idea.KotlinBundle import org.jetbrains.kotlin.idea.KotlinBundle
import org.jetbrains.kotlin.idea.actions.internal.refactoringTesting.cases.* import org.jetbrains.kotlin.idea.actions.internal.refactoringTesting.cases.*
import org.jetbrains.kotlin.idea.caches.resolve.resolveToDescriptorIfAny
import org.jetbrains.kotlin.idea.refactoring.move.getTargetPackageFqName import org.jetbrains.kotlin.idea.refactoring.move.getTargetPackageFqName
import org.jetbrains.kotlin.idea.refactoring.move.guessNewFileName import org.jetbrains.kotlin.idea.refactoring.move.guessNewFileName
import org.jetbrains.kotlin.idea.refactoring.move.moveDeclarations.MoveKotlinDeclarationsHandler import org.jetbrains.kotlin.idea.refactoring.move.moveDeclarations.MoveKotlinDeclarationsHandler
@@ -37,7 +40,10 @@ import org.jetbrains.kotlin.idea.util.projectStructure.module
import org.jetbrains.kotlin.psi.* import org.jetbrains.kotlin.psi.*
import org.jetbrains.kotlin.psi.psiUtil.containingClassOrObject import org.jetbrains.kotlin.psi.psiUtil.containingClassOrObject
import org.jetbrains.kotlin.resolve.DescriptorToSourceUtils import org.jetbrains.kotlin.resolve.DescriptorToSourceUtils
import org.jetbrains.kotlin.resolve.descriptorUtil.getSuperClassNotAny
import org.jetbrains.kotlin.resolve.descriptorUtil.getSuperInterfaces
import org.jetbrains.kotlin.resolve.jvm.KotlinJavaPsiFacade import org.jetbrains.kotlin.resolve.jvm.KotlinJavaPsiFacade
import org.jetbrains.kotlin.serialization.deserialization.descriptors.DeserializedClassDescriptor
class MoveToSealedMatchingPackageFix(element: KtTypeReference) : KotlinQuickFixAction<KtTypeReference>(element) { class MoveToSealedMatchingPackageFix(element: KtTypeReference) : KotlinQuickFixAction<KtTypeReference>(element) {
@@ -94,9 +100,18 @@ class MoveToSealedMatchingPackageFix(element: KtTypeReference) : KotlinQuickFixA
} }
companion object : KotlinSingleIntentionActionFactory() { companion object : KotlinSingleIntentionActionFactory() {
private fun ClassDescriptor.isBinarySealed(): Boolean = isSealed() && this is DeserializedClassDescriptor
override fun createAction(diagnostic: Diagnostic): MoveToSealedMatchingPackageFix? { override fun createAction(diagnostic: Diagnostic): MoveToSealedMatchingPackageFix? {
val annotationEntry = diagnostic.psiElement as? KtTypeReference ?: return null val typeReference = diagnostic.psiElement as? KtTypeReference ?: return null
return MoveToSealedMatchingPackageFix(annotationEntry)
// We cannot suggest moving this class to the binary of his parent
val classDescriptor = typeReference.parentOfType<KtClass>()?.resolveToDescriptorIfAny() ?: return null
if (classDescriptor.getSuperInterfaces().any { it.isBinarySealed() }) return null
if (classDescriptor.getSuperClassNotAny()?.isBinarySealed() == true) return null
return MoveToSealedMatchingPackageFix(typeReference)
} }
} }
} }