From a9e7d3d5cf0f67b56ee491499b7b4e1822e9ee9d Mon Sep 17 00:00:00 2001 From: Alexey Sedunov Date: Tue, 4 Apr 2017 20:06:26 +0300 Subject: [PATCH] Move: Support test data with multiple carets --- .../idea/refactoring/move/AbstractMoveTest.kt | 61 +++++++++---------- 1 file changed, 30 insertions(+), 31 deletions(-) diff --git a/idea/tests/org/jetbrains/kotlin/idea/refactoring/move/AbstractMoveTest.kt b/idea/tests/org/jetbrains/kotlin/idea/refactoring/move/AbstractMoveTest.kt index 5ec00b0a427..856c1f5c3e5 100644 --- a/idea/tests/org/jetbrains/kotlin/idea/refactoring/move/AbstractMoveTest.kt +++ b/idea/tests/org/jetbrains/kotlin/idea/refactoring/move/AbstractMoveTest.kt @@ -121,18 +121,17 @@ fun runMoveRefactoring(path: String, config: JsonObject, rootDir: VirtualFile, p val document = FileDocumentManager.getInstance().getDocument(mainFile)!! val editor = EditorFactory.getInstance()!!.createEditor(document, project)!! - val caretOffset = document.extractMarkerOffset(project) - val elementAtCaret = if (caretOffset >= 0) { + val caretOffsets = document.extractMultipleMarkerOffsets(project) + val elementsAtCaret = caretOffsets.map { TargetElementUtil.getInstance().findTargetElement( editor, TargetElementUtil.REFERENCED_ELEMENT_ACCEPTED or TargetElementUtil.ELEMENT_NAME_ACCEPTED, - caretOffset - ) + it + )!! } - else null try { - action.runRefactoring(rootDir, mainPsiFile, elementAtCaret, config) + action.runRefactoring(rootDir, mainPsiFile, elementsAtCaret, config) assert(!conflictFile.exists()) } @@ -142,7 +141,7 @@ fun runMoveRefactoring(path: String, config: JsonObject, rootDir: VirtualFile, p ConflictsInTestsException.setTestIgnore(true) // Run refactoring again with ConflictsInTestsException suppressed - action.runRefactoring(rootDir, mainPsiFile, elementAtCaret, config) + action.runRefactoring(rootDir, mainPsiFile, elementsAtCaret, config) } finally { ConflictsInTestsException.setTestIgnore(false) @@ -153,28 +152,28 @@ fun runMoveRefactoring(path: String, config: JsonObject, rootDir: VirtualFile, p enum class MoveAction { MOVE_MEMBERS { - override fun runRefactoring(rootDir: VirtualFile, mainFile: PsiFile, elementAtCaret: PsiElement?, config: JsonObject) { - val member = elementAtCaret!!.getNonStrictParentOfType()!! + override fun runRefactoring(rootDir: VirtualFile, mainFile: PsiFile, elementsAtCaret: List, config: JsonObject) { + val members = elementsAtCaret.map { it.getNonStrictParentOfType()!! } val targetClassName = config.getString("targetClass") val visibility = config.getNullableString("visibility") - val options = MockMoveMembersOptions(targetClassName, arrayOf(member)) + val options = MockMoveMembersOptions(targetClassName, members.toTypedArray()) if (visibility != null) { options.memberVisibility = visibility } - MoveMembersProcessor(elementAtCaret.project, options).run() + MoveMembersProcessor(mainFile.project, options).run() } }, MOVE_TOP_LEVEL_CLASSES { - override fun runRefactoring(rootDir: VirtualFile, mainFile: PsiFile, elementAtCaret: PsiElement?, config: JsonObject) { - val classToMove = elementAtCaret!!.getNonStrictParentOfType()!! + override fun runRefactoring(rootDir: VirtualFile, mainFile: PsiFile, elementsAtCaret: List, config: JsonObject) { + val classesToMove = elementsAtCaret.map { it.getNonStrictParentOfType()!! } val targetPackage = config.getString("targetPackage") MoveClassesOrPackagesProcessor( mainFile.project, - arrayOf(classToMove), + classesToMove.toTypedArray(), MultipleRootsMoveDestination(PackageWrapper(mainFile.manager, targetPackage)), /* searchInComments = */ false, /* searchInNonJavaFiles = */ true, @@ -184,7 +183,7 @@ enum class MoveAction { }, MOVE_PACKAGES { - override fun runRefactoring(rootDir: VirtualFile, mainFile: PsiFile, elementAtCaret: PsiElement?, config: JsonObject) { + override fun runRefactoring(rootDir: VirtualFile, mainFile: PsiFile, elementsAtCaret: List, config: JsonObject) { val project = mainFile.project val sourcePackage = config.getString("sourcePackage") val targetPackage = config.getString("targetPackage") @@ -201,15 +200,15 @@ enum class MoveAction { }, 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, config: JsonObject) { val project = mainFile.project - val classToMove = elementAtCaret!!.getNonStrictParentOfType()!! + val classesToMove = elementsAtCaret.map { it.getNonStrictParentOfType()!! } val targetClass = config.getString("targetClass") MoveClassToInnerProcessor( project, - arrayOf(classToMove), + classesToMove.toTypedArray(), JavaPsiFacade.getInstance(project).findClass(targetClass, project.allScope())!!, /* searchInComments = */ false, /* searchInNonJavaFiles = */ true, @@ -219,10 +218,10 @@ enum class MoveAction { }, MOVE_INNER_CLASS { - override fun runRefactoring(rootDir: VirtualFile, mainFile: PsiFile, elementAtCaret: PsiElement?, config: JsonObject) { + override fun runRefactoring(rootDir: VirtualFile, mainFile: PsiFile, elementsAtCaret: List, config: JsonObject) { val project = mainFile.project - val classToMove = elementAtCaret!!.getNonStrictParentOfType()!! + val classToMove = elementsAtCaret.single().getNonStrictParentOfType()!! val newClassName = config.getNullableString("newClassName") ?: classToMove.name!! val outerInstanceParameterName = config.getNullableString("outerInstanceParameterName") val targetPackage = config.getString("targetPackage") @@ -239,7 +238,7 @@ enum class MoveAction { }, MOVE_FILES { - override fun runRefactoring(rootDir: VirtualFile, mainFile: PsiFile, elementAtCaret: PsiElement?, config: JsonObject) { + override fun runRefactoring(rootDir: VirtualFile, mainFile: PsiFile, elementsAtCaret: List, config: JsonObject) { val project = mainFile.project val targetPackage = config.getNullableString("targetPackage") @@ -270,7 +269,7 @@ enum class MoveAction { }, MOVE_FILES_WITH_DECLARATIONS { - override fun runRefactoring(rootDir: VirtualFile, mainFile: PsiFile, elementAtCaret: PsiElement?, config: JsonObject) { + override fun runRefactoring(rootDir: VirtualFile, mainFile: PsiFile, elementsAtCaret: List, config: JsonObject) { val project = mainFile.project val psiFilesToMove = config.getAsJsonArray("filesToMove").map { rootDir.findFileByRelativePath(it.asString)!!.toPsiFile(project) as KtFile @@ -290,9 +289,9 @@ enum class MoveAction { }, 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, config: JsonObject) { val project = mainFile.project - val elementToMove = elementAtCaret!!.getNonStrictParentOfType()!! + val elementsToMove = elementsAtCaret.map { it.getNonStrictParentOfType()!! } val moveTarget = config.getNullableString("targetPackage")?.let { packageName -> val targetSourceRootPath = config["targetSourceRoot"]?.asString @@ -308,25 +307,25 @@ enum class MoveAction { } KotlinMoveTargetForDeferredFile(FqName(packageName), targetDir, targetVirtualFile) { - createKotlinFile(guessNewFileName(listOf(elementToMove))!!, moveDestination.getTargetDirectory(mainFile)) + createKotlinFile(guessNewFileName(elementsToMove)!!, moveDestination.getTargetDirectory(mainFile)) } } ?: config.getString("targetFile").let { filePath -> 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() } }, CHANGE_PACKAGE_DIRECTIVE { - override fun runRefactoring(rootDir: VirtualFile, mainFile: PsiFile, elementAtCaret: PsiElement?, config: JsonObject) { + override fun runRefactoring(rootDir: VirtualFile, mainFile: PsiFile, elementsAtCaret: List, config: JsonObject) { KotlinChangePackageRefactoring(mainFile as KtFile).run(FqName(config.getString("newPackageName"))) } }, MOVE_DIRECTORY_WITH_CLASSES { - override fun runRefactoring(rootDir: VirtualFile, mainFile: PsiFile, elementAtCaret: PsiElement?, config: JsonObject) { + override fun runRefactoring(rootDir: VirtualFile, mainFile: PsiFile, elementsAtCaret: List, config: JsonObject) { val project = mainFile.project val sourceDir = rootDir.findFileByRelativePath(config.getString("sourceDir"))!!.toPsiDirectory(project)!! val targetDir = rootDir.findFileByRelativePath(config.getString("targetDir"))!!.toPsiDirectory(project)!! @@ -335,9 +334,9 @@ enum class MoveAction { }, MOVE_KOTLIN_NESTED_CLASS { - override fun runRefactoring(rootDir: VirtualFile, mainFile: PsiFile, elementAtCaret: PsiElement?, config: JsonObject) { + override fun runRefactoring(rootDir: VirtualFile, mainFile: PsiFile, elementsAtCaret: List, config: JsonObject) { val project = mainFile.project - val elementToMove = elementAtCaret!!.getNonStrictParentOfType()!! + val elementToMove = elementsAtCaret.single().getNonStrictParentOfType()!! val targetClassName = config.getNullableString("targetClass") val targetClass = 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, config: JsonObject) }