From 833f564f0e0855635285d0af0f1297568a2ad4c6 Mon Sep 17 00:00:00 2001 From: Mikhail Glukhikh Date: Thu, 6 Dec 2018 14:48:08 +0300 Subject: [PATCH] Disable extract actions on non-JVM classes #KT-28476 Fixed --- .../extractClass/KotlinExtractInterfaceHandler.kt | 2 ++ .../extractClass/KotlinExtractSuperHandlerBase.kt | 8 +++++++- .../extractClass/KotlinExtractSuperclassHandler.kt | 2 ++ 3 files changed, 11 insertions(+), 1 deletion(-) diff --git a/idea/src/org/jetbrains/kotlin/idea/refactoring/introduce/extractClass/KotlinExtractInterfaceHandler.kt b/idea/src/org/jetbrains/kotlin/idea/refactoring/introduce/extractClass/KotlinExtractInterfaceHandler.kt index f0ce18ad20e..3938df8a67d 100644 --- a/idea/src/org/jetbrains/kotlin/idea/refactoring/introduce/extractClass/KotlinExtractInterfaceHandler.kt +++ b/idea/src/org/jetbrains/kotlin/idea/refactoring/introduce/extractClass/KotlinExtractInterfaceHandler.kt @@ -25,6 +25,8 @@ object KotlinExtractInterfaceHandler : KotlinExtractSuperHandlerBase(true) { val REFACTORING_NAME = "Extract Interface" override fun getErrorMessage(klass: KtClassOrObject): String? { + val superMessage = super.getErrorMessage(klass) + if (superMessage != null) return superMessage if (klass is KtClass && klass.isAnnotation()) return "Interface cannot be extracted from an annotation class" return null } diff --git a/idea/src/org/jetbrains/kotlin/idea/refactoring/introduce/extractClass/KotlinExtractSuperHandlerBase.kt b/idea/src/org/jetbrains/kotlin/idea/refactoring/introduce/extractClass/KotlinExtractSuperHandlerBase.kt index d7c0bb197cb..81e88312baa 100644 --- a/idea/src/org/jetbrains/kotlin/idea/refactoring/introduce/extractClass/KotlinExtractSuperHandlerBase.kt +++ b/idea/src/org/jetbrains/kotlin/idea/refactoring/introduce/extractClass/KotlinExtractSuperHandlerBase.kt @@ -30,11 +30,13 @@ import com.intellij.refactoring.RefactoringBundle import com.intellij.refactoring.extractSuperclass.ExtractSuperClassUtil import com.intellij.refactoring.lang.ElementsHandler import com.intellij.refactoring.util.CommonRefactoringUtil +import org.jetbrains.kotlin.asJava.toLightClass import org.jetbrains.kotlin.idea.refactoring.SeparateFileWrapper import org.jetbrains.kotlin.idea.refactoring.chooseContainerElementIfNecessary import org.jetbrains.kotlin.idea.refactoring.getExtractionContainers import org.jetbrains.kotlin.idea.refactoring.introduce.extractClass.ui.KotlinExtractSuperDialogBase import org.jetbrains.kotlin.idea.refactoring.showWithTransaction +import org.jetbrains.kotlin.idea.util.isExpectDeclaration import org.jetbrains.kotlin.psi.KtClassOrObject import org.jetbrains.kotlin.psi.KtFile import org.jetbrains.kotlin.psi.psiUtil.getNonStrictParentOfType @@ -108,7 +110,11 @@ abstract class KotlinExtractSuperHandlerBase(private val isExtractInterface: Boo return ExtractSuperClassUtil.showConflicts(dialog, conflicts, originalClass.project) } - internal abstract fun getErrorMessage(klass: KtClassOrObject): String? + internal open fun getErrorMessage(klass: KtClassOrObject): String? = when { + klass.isExpectDeclaration() -> "Extraction from expect class is not yet supported" + klass.toLightClass() == null -> "Extraction from non-JVM class is not yet supported" + else -> null + } protected abstract fun createDialog(klass: KtClassOrObject, targetParent: PsiElement): KotlinExtractSuperDialogBase } \ No newline at end of file diff --git a/idea/src/org/jetbrains/kotlin/idea/refactoring/introduce/extractClass/KotlinExtractSuperclassHandler.kt b/idea/src/org/jetbrains/kotlin/idea/refactoring/introduce/extractClass/KotlinExtractSuperclassHandler.kt index 3093334024d..228136bae30 100644 --- a/idea/src/org/jetbrains/kotlin/idea/refactoring/introduce/extractClass/KotlinExtractSuperclassHandler.kt +++ b/idea/src/org/jetbrains/kotlin/idea/refactoring/introduce/extractClass/KotlinExtractSuperclassHandler.kt @@ -26,6 +26,8 @@ object KotlinExtractSuperclassHandler : KotlinExtractSuperHandlerBase(false) { val REFACTORING_NAME = "Extract Superclass" override fun getErrorMessage(klass: KtClassOrObject): String? { + val superMessage = super.getErrorMessage(klass) + if (superMessage != null) return superMessage if (klass is KtClass) { if (klass.isInterface()) return RefactoringBundle.message("superclass.cannot.be.extracted.from.an.interface") if (klass.isEnum()) return RefactoringBundle.message("superclass.cannot.be.extracted.from.an.enum")