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
|
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.psi.PsiElement
|
||||||
import com.intellij.refactoring.util.CommonRefactoringUtil
|
|
||||||
import org.jetbrains.kotlin.idea.refactoring.introduce.extractClass.ui.KotlinExtractInterfaceDialog
|
import org.jetbrains.kotlin.idea.refactoring.introduce.extractClass.ui.KotlinExtractInterfaceDialog
|
||||||
import org.jetbrains.kotlin.psi.KtClass
|
import org.jetbrains.kotlin.psi.KtClass
|
||||||
import org.jetbrains.kotlin.psi.KtClassOrObject
|
import org.jetbrains.kotlin.psi.KtClassOrObject
|
||||||
@@ -32,12 +29,11 @@ object KotlinExtractInterfaceHandler : KotlinExtractSuperHandlerBase(true) {
|
|||||||
return null
|
return null
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun doInvoke(klass: KtClassOrObject, targetParent: PsiElement, project: Project, editor: Editor?) {
|
override fun createDialog(klass: KtClassOrObject, targetParent: PsiElement) =
|
||||||
KotlinExtractInterfaceDialog(
|
KotlinExtractInterfaceDialog(
|
||||||
originalClass = klass,
|
originalClass = klass,
|
||||||
targetParent = targetParent,
|
targetParent = targetParent,
|
||||||
conflictChecker = { checkConflicts(klass, it) },
|
conflictChecker = { checkConflicts(klass, it) },
|
||||||
refactoring = { ExtractSuperRefactoring(it).performRefactoring() }
|
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.CommonDataKeys
|
||||||
import com.intellij.openapi.actionSystem.DataContext
|
import com.intellij.openapi.actionSystem.DataContext
|
||||||
|
import com.intellij.openapi.application.TransactionGuard
|
||||||
import com.intellij.openapi.editor.Editor
|
import com.intellij.openapi.editor.Editor
|
||||||
import com.intellij.openapi.editor.ScrollType
|
import com.intellij.openapi.editor.ScrollType
|
||||||
import com.intellij.openapi.project.Project
|
import com.intellij.openapi.project.Project
|
||||||
@@ -47,7 +48,7 @@ abstract class KotlinExtractSuperHandlerBase(private val isExtractInterface: Boo
|
|||||||
val klass = element.getNonStrictParentOfType<KtClassOrObject>() ?: return
|
val klass = element.getNonStrictParentOfType<KtClassOrObject>() ?: return
|
||||||
if (!checkClass(klass, editor)) return
|
if (!checkClass(klass, editor)) return
|
||||||
editor.scrollingModel.scrollToCaret(ScrollType.MAKE_VISIBLE)
|
editor.scrollingModel.scrollToCaret(ScrollType.MAKE_VISIBLE)
|
||||||
selectElements(klass, project, editor)
|
selectElements(klass, editor)
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun invoke(project: Project, elements: Array<out PsiElement>, dataContext: DataContext?) {
|
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 editor = CommonDataKeys.EDITOR.getData(dataContext)
|
||||||
val klass = PsiTreeUtil.findCommonParent(*elements)?.getNonStrictParentOfType<KtClassOrObject>() ?: return
|
val klass = PsiTreeUtil.findCommonParent(*elements)?.getNonStrictParentOfType<KtClassOrObject>() ?: return
|
||||||
if (!checkClass(klass, editor)) return
|
if (!checkClass(klass, editor)) return
|
||||||
selectElements(klass, project, editor)
|
selectElements(klass, editor)
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun checkClass(klass: KtClassOrObject, editor: Editor?): Boolean {
|
private fun checkClass(klass: KtClassOrObject, editor: Editor?): Boolean {
|
||||||
@@ -77,10 +78,15 @@ abstract class KotlinExtractSuperHandlerBase(private val isExtractInterface: Boo
|
|||||||
return true
|
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)
|
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(
|
chooseContainerElementIfNecessary(
|
||||||
containers,
|
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",
|
if (containers.first() is KtFile) "Select target file" else "Select target code block / file",
|
||||||
true,
|
true,
|
||||||
{ it },
|
{ 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?
|
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
|
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.psi.PsiElement
|
||||||
import com.intellij.refactoring.HelpID
|
|
||||||
import com.intellij.refactoring.RefactoringBundle
|
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.idea.refactoring.introduce.extractClass.ui.KotlinExtractSuperclassDialog
|
||||||
import org.jetbrains.kotlin.psi.KtClass
|
import org.jetbrains.kotlin.psi.KtClass
|
||||||
import org.jetbrains.kotlin.psi.KtClassOrObject
|
import org.jetbrains.kotlin.psi.KtClassOrObject
|
||||||
@@ -38,12 +34,11 @@ object KotlinExtractSuperclassHandler : KotlinExtractSuperHandlerBase(false) {
|
|||||||
return null
|
return null
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun doInvoke(klass: KtClassOrObject, targetParent: PsiElement, project: Project, editor: Editor?) {
|
override fun createDialog(klass: KtClassOrObject, targetParent: PsiElement) =
|
||||||
KotlinExtractSuperclassDialog(
|
KotlinExtractSuperclassDialog(
|
||||||
originalClass = klass,
|
originalClass = klass,
|
||||||
targetParent = targetParent,
|
targetParent = targetParent,
|
||||||
conflictChecker = { checkConflicts(klass, it) },
|
conflictChecker = { checkConflicts(klass, it) },
|
||||||
refactoring = { ExtractSuperRefactoring(it).performRefactoring() }
|
refactoring = { ExtractSuperRefactoring(it).performRefactoring() }
|
||||||
).show()
|
)
|
||||||
}
|
|
||||||
}
|
}
|
||||||
Reference in New Issue
Block a user