From 5ef54a2f03386eb5283c033a5441d64ea368229d Mon Sep 17 00:00:00 2001 From: Alexey Sedunov Date: Sat, 9 Jun 2018 15:56:51 +0300 Subject: [PATCH] Extract Superclass: Run refactoring inside of transaction #KT-18555 Fixed --- .../KotlinExtractInterfaceHandler.kt | 8 ++------ .../KotlinExtractSuperHandlerBase.kt | 18 ++++++++++++------ .../KotlinExtractSuperclassHandler.kt | 9 ++------- 3 files changed, 16 insertions(+), 19 deletions(-) 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 dd133987d88..f0ce18ad20e 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 @@ -16,10 +16,7 @@ package org.jetbrains.kotlin.idea.refactoring.introduce.extractClass -import com.intellij.openapi.editor.Editor -import com.intellij.openapi.project.Project import com.intellij.psi.PsiElement -import com.intellij.refactoring.util.CommonRefactoringUtil import org.jetbrains.kotlin.idea.refactoring.introduce.extractClass.ui.KotlinExtractInterfaceDialog import org.jetbrains.kotlin.psi.KtClass import org.jetbrains.kotlin.psi.KtClassOrObject @@ -32,12 +29,11 @@ object KotlinExtractInterfaceHandler : KotlinExtractSuperHandlerBase(true) { return null } - override fun doInvoke(klass: KtClassOrObject, targetParent: PsiElement, project: Project, editor: Editor?) { + override fun createDialog(klass: KtClassOrObject, targetParent: PsiElement) = KotlinExtractInterfaceDialog( originalClass = klass, targetParent = targetParent, conflictChecker = { checkConflicts(klass, it) }, refactoring = { ExtractSuperRefactoring(it).performRefactoring() } - ).show() - } + ) } \ No newline at end of file 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 73191b73650..b7244def9a8 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 @@ -18,6 +18,7 @@ package org.jetbrains.kotlin.idea.refactoring.introduce.extractClass import com.intellij.openapi.actionSystem.CommonDataKeys import com.intellij.openapi.actionSystem.DataContext +import com.intellij.openapi.application.TransactionGuard import com.intellij.openapi.editor.Editor import com.intellij.openapi.editor.ScrollType import com.intellij.openapi.project.Project @@ -47,7 +48,7 @@ abstract class KotlinExtractSuperHandlerBase(private val isExtractInterface: Boo val klass = element.getNonStrictParentOfType() ?: return if (!checkClass(klass, editor)) return editor.scrollingModel.scrollToCaret(ScrollType.MAKE_VISIBLE) - selectElements(klass, project, editor) + selectElements(klass, editor) } override fun invoke(project: Project, elements: Array, dataContext: DataContext?) { @@ -55,7 +56,7 @@ abstract class KotlinExtractSuperHandlerBase(private val isExtractInterface: Boo val editor = CommonDataKeys.EDITOR.getData(dataContext) val klass = PsiTreeUtil.findCommonParent(*elements)?.getNonStrictParentOfType() ?: return if (!checkClass(klass, editor)) return - selectElements(klass, project, editor) + selectElements(klass, editor) } private fun checkClass(klass: KtClassOrObject, editor: Editor?): Boolean { @@ -77,10 +78,15 @@ abstract class KotlinExtractSuperHandlerBase(private val isExtractInterface: Boo return true } - private fun selectElements(klass: KtClassOrObject, project: Project, editor: Editor?) { + private fun doInvoke(klass: KtClassOrObject, targetParent: PsiElement) { + val dialog = createDialog(klass, targetParent) + TransactionGuard.submitTransaction(dialog.disposable, Runnable { dialog.show() }) + } + + private fun selectElements(klass: KtClassOrObject, editor: Editor?) { val containers = klass.getExtractionContainers(strict = true, includeAll = true) + SeparateFileWrapper(klass.manager) - if (editor == null) return doInvoke(klass, containers.first(), project, editor) + if (editor == null) return doInvoke(klass, containers.first()) chooseContainerElementIfNecessary( containers, @@ -88,7 +94,7 @@ abstract class KotlinExtractSuperHandlerBase(private val isExtractInterface: Boo if (containers.first() is KtFile) "Select target file" else "Select target code block / file", true, { it }, - { doInvoke(klass, if (it is SeparateFileWrapper) klass.containingFile.parent!! else it, project, editor) } + { doInvoke(klass, if (it is SeparateFileWrapper) klass.containingFile.parent!! else it) } ) } @@ -105,5 +111,5 @@ abstract class KotlinExtractSuperHandlerBase(private val isExtractInterface: Boo internal abstract fun getErrorMessage(klass: KtClassOrObject): String? - protected abstract fun doInvoke(klass: KtClassOrObject, targetParent: PsiElement, project: Project, editor: Editor?) + 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 d8fa1bfe4fa..3093334024d 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 @@ -16,12 +16,8 @@ package org.jetbrains.kotlin.idea.refactoring.introduce.extractClass -import com.intellij.openapi.editor.Editor -import com.intellij.openapi.project.Project import com.intellij.psi.PsiElement -import com.intellij.refactoring.HelpID import com.intellij.refactoring.RefactoringBundle -import com.intellij.refactoring.util.CommonRefactoringUtil import org.jetbrains.kotlin.idea.refactoring.introduce.extractClass.ui.KotlinExtractSuperclassDialog import org.jetbrains.kotlin.psi.KtClass import org.jetbrains.kotlin.psi.KtClassOrObject @@ -38,12 +34,11 @@ object KotlinExtractSuperclassHandler : KotlinExtractSuperHandlerBase(false) { return null } - override fun doInvoke(klass: KtClassOrObject, targetParent: PsiElement, project: Project, editor: Editor?) { + override fun createDialog(klass: KtClassOrObject, targetParent: PsiElement) = KotlinExtractSuperclassDialog( originalClass = klass, targetParent = targetParent, conflictChecker = { checkConflicts(klass, it) }, refactoring = { ExtractSuperRefactoring(it).performRefactoring() } - ).show() - } + ) } \ No newline at end of file