Extract Superclass: Run refactoring inside of transaction

#KT-18555 Fixed
This commit is contained in:
Alexey Sedunov
2018-06-09 15:56:51 +03:00
parent 87f4d0c5a4
commit 5ef54a2f03
3 changed files with 16 additions and 19 deletions
@@ -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()
}
)
}
@@ -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<KtClassOrObject>() ?: 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<out PsiElement>, 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<KtClassOrObject>() ?: 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
}
@@ -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()
}
)
}