Extract Superclass: Run refactoring inside of transaction
#KT-18555 Fixed
This commit is contained in:
+2
-6
@@ -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()
|
||||
}
|
||||
)
|
||||
}
|
||||
+12
-6
@@ -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
|
||||
}
|
||||
+2
-7
@@ -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()
|
||||
}
|
||||
)
|
||||
}
|
||||
Reference in New Issue
Block a user