Move: Support test data with multiple carets
This commit is contained in:
@@ -121,18 +121,17 @@ fun runMoveRefactoring(path: String, config: JsonObject, rootDir: VirtualFile, p
|
|||||||
val document = FileDocumentManager.getInstance().getDocument(mainFile)!!
|
val document = FileDocumentManager.getInstance().getDocument(mainFile)!!
|
||||||
val editor = EditorFactory.getInstance()!!.createEditor(document, project)!!
|
val editor = EditorFactory.getInstance()!!.createEditor(document, project)!!
|
||||||
|
|
||||||
val caretOffset = document.extractMarkerOffset(project)
|
val caretOffsets = document.extractMultipleMarkerOffsets(project)
|
||||||
val elementAtCaret = if (caretOffset >= 0) {
|
val elementsAtCaret = caretOffsets.map {
|
||||||
TargetElementUtil.getInstance().findTargetElement(
|
TargetElementUtil.getInstance().findTargetElement(
|
||||||
editor,
|
editor,
|
||||||
TargetElementUtil.REFERENCED_ELEMENT_ACCEPTED or TargetElementUtil.ELEMENT_NAME_ACCEPTED,
|
TargetElementUtil.REFERENCED_ELEMENT_ACCEPTED or TargetElementUtil.ELEMENT_NAME_ACCEPTED,
|
||||||
caretOffset
|
it
|
||||||
)
|
)!!
|
||||||
}
|
}
|
||||||
else null
|
|
||||||
|
|
||||||
try {
|
try {
|
||||||
action.runRefactoring(rootDir, mainPsiFile, elementAtCaret, config)
|
action.runRefactoring(rootDir, mainPsiFile, elementsAtCaret, config)
|
||||||
|
|
||||||
assert(!conflictFile.exists())
|
assert(!conflictFile.exists())
|
||||||
}
|
}
|
||||||
@@ -142,7 +141,7 @@ fun runMoveRefactoring(path: String, config: JsonObject, rootDir: VirtualFile, p
|
|||||||
ConflictsInTestsException.setTestIgnore(true)
|
ConflictsInTestsException.setTestIgnore(true)
|
||||||
|
|
||||||
// Run refactoring again with ConflictsInTestsException suppressed
|
// Run refactoring again with ConflictsInTestsException suppressed
|
||||||
action.runRefactoring(rootDir, mainPsiFile, elementAtCaret, config)
|
action.runRefactoring(rootDir, mainPsiFile, elementsAtCaret, config)
|
||||||
}
|
}
|
||||||
finally {
|
finally {
|
||||||
ConflictsInTestsException.setTestIgnore(false)
|
ConflictsInTestsException.setTestIgnore(false)
|
||||||
@@ -153,28 +152,28 @@ fun runMoveRefactoring(path: String, config: JsonObject, rootDir: VirtualFile, p
|
|||||||
|
|
||||||
enum class MoveAction {
|
enum class MoveAction {
|
||||||
MOVE_MEMBERS {
|
MOVE_MEMBERS {
|
||||||
override fun runRefactoring(rootDir: VirtualFile, mainFile: PsiFile, elementAtCaret: PsiElement?, config: JsonObject) {
|
override fun runRefactoring(rootDir: VirtualFile, mainFile: PsiFile, elementsAtCaret: List<PsiElement>, config: JsonObject) {
|
||||||
val member = elementAtCaret!!.getNonStrictParentOfType<PsiMember>()!!
|
val members = elementsAtCaret.map { it.getNonStrictParentOfType<PsiMember>()!! }
|
||||||
val targetClassName = config.getString("targetClass")
|
val targetClassName = config.getString("targetClass")
|
||||||
val visibility = config.getNullableString("visibility")
|
val visibility = config.getNullableString("visibility")
|
||||||
|
|
||||||
val options = MockMoveMembersOptions(targetClassName, arrayOf(member))
|
val options = MockMoveMembersOptions(targetClassName, members.toTypedArray())
|
||||||
if (visibility != null) {
|
if (visibility != null) {
|
||||||
options.memberVisibility = visibility
|
options.memberVisibility = visibility
|
||||||
}
|
}
|
||||||
|
|
||||||
MoveMembersProcessor(elementAtCaret.project, options).run()
|
MoveMembersProcessor(mainFile.project, options).run()
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|
||||||
MOVE_TOP_LEVEL_CLASSES {
|
MOVE_TOP_LEVEL_CLASSES {
|
||||||
override fun runRefactoring(rootDir: VirtualFile, mainFile: PsiFile, elementAtCaret: PsiElement?, config: JsonObject) {
|
override fun runRefactoring(rootDir: VirtualFile, mainFile: PsiFile, elementsAtCaret: List<PsiElement>, config: JsonObject) {
|
||||||
val classToMove = elementAtCaret!!.getNonStrictParentOfType<PsiClass>()!!
|
val classesToMove = elementsAtCaret.map { it.getNonStrictParentOfType<PsiClass>()!! }
|
||||||
val targetPackage = config.getString("targetPackage")
|
val targetPackage = config.getString("targetPackage")
|
||||||
|
|
||||||
MoveClassesOrPackagesProcessor(
|
MoveClassesOrPackagesProcessor(
|
||||||
mainFile.project,
|
mainFile.project,
|
||||||
arrayOf(classToMove),
|
classesToMove.toTypedArray(),
|
||||||
MultipleRootsMoveDestination(PackageWrapper(mainFile.manager, targetPackage)),
|
MultipleRootsMoveDestination(PackageWrapper(mainFile.manager, targetPackage)),
|
||||||
/* searchInComments = */ false,
|
/* searchInComments = */ false,
|
||||||
/* searchInNonJavaFiles = */ true,
|
/* searchInNonJavaFiles = */ true,
|
||||||
@@ -184,7 +183,7 @@ enum class MoveAction {
|
|||||||
},
|
},
|
||||||
|
|
||||||
MOVE_PACKAGES {
|
MOVE_PACKAGES {
|
||||||
override fun runRefactoring(rootDir: VirtualFile, mainFile: PsiFile, elementAtCaret: PsiElement?, config: JsonObject) {
|
override fun runRefactoring(rootDir: VirtualFile, mainFile: PsiFile, elementsAtCaret: List<PsiElement>, config: JsonObject) {
|
||||||
val project = mainFile.project
|
val project = mainFile.project
|
||||||
val sourcePackage = config.getString("sourcePackage")
|
val sourcePackage = config.getString("sourcePackage")
|
||||||
val targetPackage = config.getString("targetPackage")
|
val targetPackage = config.getString("targetPackage")
|
||||||
@@ -201,15 +200,15 @@ enum class MoveAction {
|
|||||||
},
|
},
|
||||||
|
|
||||||
MOVE_TOP_LEVEL_CLASSES_TO_INNER {
|
MOVE_TOP_LEVEL_CLASSES_TO_INNER {
|
||||||
override fun runRefactoring(rootDir: VirtualFile, mainFile: PsiFile, elementAtCaret: PsiElement?, config: JsonObject) {
|
override fun runRefactoring(rootDir: VirtualFile, mainFile: PsiFile, elementsAtCaret: List<PsiElement>, config: JsonObject) {
|
||||||
val project = mainFile.project
|
val project = mainFile.project
|
||||||
|
|
||||||
val classToMove = elementAtCaret!!.getNonStrictParentOfType<PsiClass>()!!
|
val classesToMove = elementsAtCaret.map { it.getNonStrictParentOfType<PsiClass>()!! }
|
||||||
val targetClass = config.getString("targetClass")
|
val targetClass = config.getString("targetClass")
|
||||||
|
|
||||||
MoveClassToInnerProcessor(
|
MoveClassToInnerProcessor(
|
||||||
project,
|
project,
|
||||||
arrayOf(classToMove),
|
classesToMove.toTypedArray(),
|
||||||
JavaPsiFacade.getInstance(project).findClass(targetClass, project.allScope())!!,
|
JavaPsiFacade.getInstance(project).findClass(targetClass, project.allScope())!!,
|
||||||
/* searchInComments = */ false,
|
/* searchInComments = */ false,
|
||||||
/* searchInNonJavaFiles = */ true,
|
/* searchInNonJavaFiles = */ true,
|
||||||
@@ -219,10 +218,10 @@ enum class MoveAction {
|
|||||||
},
|
},
|
||||||
|
|
||||||
MOVE_INNER_CLASS {
|
MOVE_INNER_CLASS {
|
||||||
override fun runRefactoring(rootDir: VirtualFile, mainFile: PsiFile, elementAtCaret: PsiElement?, config: JsonObject) {
|
override fun runRefactoring(rootDir: VirtualFile, mainFile: PsiFile, elementsAtCaret: List<PsiElement>, config: JsonObject) {
|
||||||
val project = mainFile.project
|
val project = mainFile.project
|
||||||
|
|
||||||
val classToMove = elementAtCaret!!.getNonStrictParentOfType<PsiClass>()!!
|
val classToMove = elementsAtCaret.single().getNonStrictParentOfType<PsiClass>()!!
|
||||||
val newClassName = config.getNullableString("newClassName") ?: classToMove.name!!
|
val newClassName = config.getNullableString("newClassName") ?: classToMove.name!!
|
||||||
val outerInstanceParameterName = config.getNullableString("outerInstanceParameterName")
|
val outerInstanceParameterName = config.getNullableString("outerInstanceParameterName")
|
||||||
val targetPackage = config.getString("targetPackage")
|
val targetPackage = config.getString("targetPackage")
|
||||||
@@ -239,7 +238,7 @@ enum class MoveAction {
|
|||||||
},
|
},
|
||||||
|
|
||||||
MOVE_FILES {
|
MOVE_FILES {
|
||||||
override fun runRefactoring(rootDir: VirtualFile, mainFile: PsiFile, elementAtCaret: PsiElement?, config: JsonObject) {
|
override fun runRefactoring(rootDir: VirtualFile, mainFile: PsiFile, elementsAtCaret: List<PsiElement>, config: JsonObject) {
|
||||||
val project = mainFile.project
|
val project = mainFile.project
|
||||||
|
|
||||||
val targetPackage = config.getNullableString("targetPackage")
|
val targetPackage = config.getNullableString("targetPackage")
|
||||||
@@ -270,7 +269,7 @@ enum class MoveAction {
|
|||||||
},
|
},
|
||||||
|
|
||||||
MOVE_FILES_WITH_DECLARATIONS {
|
MOVE_FILES_WITH_DECLARATIONS {
|
||||||
override fun runRefactoring(rootDir: VirtualFile, mainFile: PsiFile, elementAtCaret: PsiElement?, config: JsonObject) {
|
override fun runRefactoring(rootDir: VirtualFile, mainFile: PsiFile, elementsAtCaret: List<PsiElement>, config: JsonObject) {
|
||||||
val project = mainFile.project
|
val project = mainFile.project
|
||||||
val psiFilesToMove = config.getAsJsonArray("filesToMove").map {
|
val psiFilesToMove = config.getAsJsonArray("filesToMove").map {
|
||||||
rootDir.findFileByRelativePath(it.asString)!!.toPsiFile(project) as KtFile
|
rootDir.findFileByRelativePath(it.asString)!!.toPsiFile(project) as KtFile
|
||||||
@@ -290,9 +289,9 @@ enum class MoveAction {
|
|||||||
},
|
},
|
||||||
|
|
||||||
MOVE_KOTLIN_TOP_LEVEL_DECLARATIONS {
|
MOVE_KOTLIN_TOP_LEVEL_DECLARATIONS {
|
||||||
override fun runRefactoring(rootDir: VirtualFile, mainFile: PsiFile, elementAtCaret: PsiElement?, config: JsonObject) {
|
override fun runRefactoring(rootDir: VirtualFile, mainFile: PsiFile, elementsAtCaret: List<PsiElement>, config: JsonObject) {
|
||||||
val project = mainFile.project
|
val project = mainFile.project
|
||||||
val elementToMove = elementAtCaret!!.getNonStrictParentOfType<KtNamedDeclaration>()!!
|
val elementsToMove = elementsAtCaret.map { it.getNonStrictParentOfType<KtNamedDeclaration>()!! }
|
||||||
|
|
||||||
val moveTarget = config.getNullableString("targetPackage")?.let { packageName ->
|
val moveTarget = config.getNullableString("targetPackage")?.let { packageName ->
|
||||||
val targetSourceRootPath = config["targetSourceRoot"]?.asString
|
val targetSourceRootPath = config["targetSourceRoot"]?.asString
|
||||||
@@ -308,25 +307,25 @@ enum class MoveAction {
|
|||||||
}
|
}
|
||||||
|
|
||||||
KotlinMoveTargetForDeferredFile(FqName(packageName), targetDir, targetVirtualFile) {
|
KotlinMoveTargetForDeferredFile(FqName(packageName), targetDir, targetVirtualFile) {
|
||||||
createKotlinFile(guessNewFileName(listOf(elementToMove))!!, moveDestination.getTargetDirectory(mainFile))
|
createKotlinFile(guessNewFileName(elementsToMove)!!, moveDestination.getTargetDirectory(mainFile))
|
||||||
}
|
}
|
||||||
} ?: config.getString("targetFile").let { filePath ->
|
} ?: config.getString("targetFile").let { filePath ->
|
||||||
KotlinMoveTargetForExistingElement(PsiManager.getInstance(project).findFile(rootDir.findFileByRelativePath(filePath)!!) as KtFile)
|
KotlinMoveTargetForExistingElement(PsiManager.getInstance(project).findFile(rootDir.findFileByRelativePath(filePath)!!) as KtFile)
|
||||||
}
|
}
|
||||||
|
|
||||||
val options = MoveDeclarationsDescriptor(listOf(elementToMove), moveTarget, MoveDeclarationsDelegate.TopLevel)
|
val options = MoveDeclarationsDescriptor(elementsToMove, moveTarget, MoveDeclarationsDelegate.TopLevel)
|
||||||
MoveKotlinDeclarationsProcessor(mainFile.getProject(), options).run()
|
MoveKotlinDeclarationsProcessor(mainFile.getProject(), options).run()
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|
||||||
CHANGE_PACKAGE_DIRECTIVE {
|
CHANGE_PACKAGE_DIRECTIVE {
|
||||||
override fun runRefactoring(rootDir: VirtualFile, mainFile: PsiFile, elementAtCaret: PsiElement?, config: JsonObject) {
|
override fun runRefactoring(rootDir: VirtualFile, mainFile: PsiFile, elementsAtCaret: List<PsiElement>, config: JsonObject) {
|
||||||
KotlinChangePackageRefactoring(mainFile as KtFile).run(FqName(config.getString("newPackageName")))
|
KotlinChangePackageRefactoring(mainFile as KtFile).run(FqName(config.getString("newPackageName")))
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|
||||||
MOVE_DIRECTORY_WITH_CLASSES {
|
MOVE_DIRECTORY_WITH_CLASSES {
|
||||||
override fun runRefactoring(rootDir: VirtualFile, mainFile: PsiFile, elementAtCaret: PsiElement?, config: JsonObject) {
|
override fun runRefactoring(rootDir: VirtualFile, mainFile: PsiFile, elementsAtCaret: List<PsiElement>, config: JsonObject) {
|
||||||
val project = mainFile.project
|
val project = mainFile.project
|
||||||
val sourceDir = rootDir.findFileByRelativePath(config.getString("sourceDir"))!!.toPsiDirectory(project)!!
|
val sourceDir = rootDir.findFileByRelativePath(config.getString("sourceDir"))!!.toPsiDirectory(project)!!
|
||||||
val targetDir = rootDir.findFileByRelativePath(config.getString("targetDir"))!!.toPsiDirectory(project)!!
|
val targetDir = rootDir.findFileByRelativePath(config.getString("targetDir"))!!.toPsiDirectory(project)!!
|
||||||
@@ -335,9 +334,9 @@ enum class MoveAction {
|
|||||||
},
|
},
|
||||||
|
|
||||||
MOVE_KOTLIN_NESTED_CLASS {
|
MOVE_KOTLIN_NESTED_CLASS {
|
||||||
override fun runRefactoring(rootDir: VirtualFile, mainFile: PsiFile, elementAtCaret: PsiElement?, config: JsonObject) {
|
override fun runRefactoring(rootDir: VirtualFile, mainFile: PsiFile, elementsAtCaret: List<PsiElement>, config: JsonObject) {
|
||||||
val project = mainFile.project
|
val project = mainFile.project
|
||||||
val elementToMove = elementAtCaret!!.getNonStrictParentOfType<KtClassOrObject>()!!
|
val elementToMove = elementsAtCaret.single().getNonStrictParentOfType<KtClassOrObject>()!!
|
||||||
val targetClassName = config.getNullableString("targetClass")
|
val targetClassName = config.getNullableString("targetClass")
|
||||||
val targetClass =
|
val targetClass =
|
||||||
if (targetClassName != null) {
|
if (targetClassName != null) {
|
||||||
@@ -363,5 +362,5 @@ enum class MoveAction {
|
|||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
abstract fun runRefactoring(rootDir: VirtualFile, mainFile: PsiFile, elementAtCaret: PsiElement?, config: JsonObject)
|
abstract fun runRefactoring(rootDir: VirtualFile, mainFile: PsiFile, elementsAtCaret: List<PsiElement>, config: JsonObject)
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user