Move: Fix internal reference processing on moving multiple files

#KT-17211 Fixed
This commit is contained in:
Alexey Sedunov
2017-04-03 16:17:55 +03:00
parent a8a9c3bbf4
commit 746ec48176
15 changed files with 50 additions and 13 deletions
@@ -40,12 +40,14 @@ import java.util.*
class MoveKotlinFileHandler : MoveFileHandler() {
internal class InternalUsagesWrapper(file: KtFile, val usages: List<UsageInfo>) : UsageInfo(file)
internal class FileInfo(file: KtFile) : UsageInfo(file)
// This is special 'PsiElement' whose purpose is to wrap MoveKotlinTopLevelDeclarationsProcessor
// so that it can be kept in the transition map
// so that it can be kept in the usage info list
private class MoveContext(
psiManager: PsiManager,
val file: PsiFile,
val declarationMoveProcessor: MoveKotlinDeclarationsProcessor
): LightElement(psiManager, KotlinLanguage.INSTANCE) {
): LightElement(file.manager, KotlinLanguage.INSTANCE) {
override fun toString() = ""
}
@@ -117,7 +119,7 @@ class MoveKotlinFileHandler : MoveFileHandler() {
): List<UsageInfo> {
if (psiFile !is KtFile) return emptyList()
val usages = ArrayList<UsageInfo>()
val usages = arrayListOf<UsageInfo>(FileInfo(psiFile))
initMoveProcessor(psiFile, newParent)?.let {
usages += it.findUsages()
usages += it.getConflictsAsUsages()
@@ -127,7 +129,7 @@ class MoveKotlinFileHandler : MoveFileHandler() {
override fun prepareMovedFile(file: PsiFile, moveDestination: PsiDirectory, oldToNewMap: MutableMap<PsiElement, PsiElement>) {
val moveProcessor = initMoveProcessor(file, moveDestination) ?: return
val moveContext = MoveContext(file.manager, moveProcessor)
val moveContext = MoveContext(file, moveProcessor)
oldToNewMap[moveContext] = moveContext
}
@@ -139,7 +141,8 @@ class MoveKotlinFileHandler : MoveFileHandler() {
}
override fun retargetUsages(usageInfos: List<UsageInfo>?, oldToNewMap: Map<PsiElement, PsiElement>) {
val moveContext = oldToNewMap.keys.firstIsInstanceOrNull<MoveContext>() ?: return
val currentFile = (usageInfos?.firstOrNull() as? FileInfo)?.element
val moveContext = oldToNewMap.keys.firstOrNull { it is MoveContext && it.file == currentFile} as? MoveContext ?: return
retargetUsages(usageInfos, moveContext.declarationMoveProcessor)
}
@@ -0,0 +1,5 @@
package target
interface NamedFaceO
class NamedClassO : NamedFaceO
@@ -0,0 +1,5 @@
package target
interface NamedFaceN
class NamedClassN : NamedFaceN
@@ -0,0 +1,5 @@
package source
interface NamedFaceO
class NamedClassO : NamedFaceO
@@ -0,0 +1,5 @@
package source
interface NamedFaceN
class NamedClassN : NamedFaceN
@@ -0,0 +1,5 @@
{
"filesToMove": ["source/foo.kt", "source/bar.kt"],
"type": "MOVE_FILES_WITH_DECLARATIONS",
"targetDirectory": "target"
}
@@ -1,5 +1,5 @@
{
"mainFile": "A/src/a1/internalTarget.kt",
"filesToMove": ["A/src/a1/internalTarget.kt"],
"type": "MOVE_FILES_WITH_DECLARATIONS",
"targetDirectory": "B/src/b",
"withRuntime": "true"
@@ -1,5 +1,5 @@
{
"mainFile": "A/src/a/test.kt",
"filesToMove": ["A/src/a/test.kt"],
"type": "MOVE_FILES_WITH_DECLARATIONS",
"targetDirectory": "B/src/b",
"withRuntime": "true",
@@ -1,5 +1,5 @@
{
"mainFile": "A/src/a1/internalTarget.kt",
"filesToMove": ["A/src/a1/internalTarget.kt"],
"type": "MOVE_FILES_WITH_DECLARATIONS",
"targetDirectory": "B/src/b",
"withRuntime": "true"
@@ -47,6 +47,7 @@ import org.jetbrains.kotlin.idea.refactoring.move.changePackage.KotlinChangePack
import org.jetbrains.kotlin.idea.refactoring.move.moveDeclarations.*
import org.jetbrains.kotlin.idea.refactoring.rename.loadTestConfiguration
import org.jetbrains.kotlin.idea.refactoring.toPsiDirectory
import org.jetbrains.kotlin.idea.refactoring.toPsiFile
import org.jetbrains.kotlin.idea.search.allScope
import org.jetbrains.kotlin.idea.search.projectScope
import org.jetbrains.kotlin.idea.stubindex.KotlinFullClassNameIndex
@@ -111,7 +112,7 @@ fun runMoveRefactoring(path: String, config: JsonObject, rootDir: VirtualFile, p
val action = MoveAction.valueOf(config.getString("type"))
val testDir = path.substring(0, path.lastIndexOf("/"))
val mainFilePath = config.getNullableString("mainFile")!!
val mainFilePath = config.getNullableString("mainFile") ?: config.getAsJsonArray("filesToMove").first().asString
val conflictFile = File(testDir + "/conflicts.txt")
@@ -271,14 +272,16 @@ enum class MoveAction {
MOVE_FILES_WITH_DECLARATIONS {
override fun runRefactoring(rootDir: VirtualFile, mainFile: PsiFile, elementAtCaret: PsiElement?, config: JsonObject) {
val project = mainFile.project
val psiFilesToMove = config.getAsJsonArray("filesToMove").map {
rootDir.findFileByRelativePath(it.asString)!!.toPsiFile(project) as KtFile
}
val targetDirPath = config.getString("targetDirectory")
val targetDir = rootDir.findFileByRelativePath(targetDirPath)!!.toPsiDirectory(project)!!
MoveFilesWithDeclarationsProcessor(
project,
listOf(mainFile as KtFile),
psiFilesToMove,
targetDir,
mainFile.name,
psiFilesToMove.singleOrNull()?.name,
searchInComments = true,
searchInNonJavaFiles = true,
moveCallback = null
@@ -288,6 +288,12 @@ public class MoveTestGenerated extends AbstractMoveTest {
doTest(fileName);
}
@TestMetadata("kotlin/moveFile/moveMultipleFIles/moveMultipleFiles.test")
public void testKotlin_moveFile_moveMultipleFIles_MoveMultipleFiles() throws Exception {
String fileName = KotlinTestUtils.navigationMetadata("idea/testData/refactoring/move/kotlin/moveFile/moveMultipleFIles/moveMultipleFiles.test");
doTest(fileName);
}
@TestMetadata("kotlin/moveFile/packageWithQuotation/moveFileToPackageWithQuotation.test")
public void testKotlin_moveFile_packageWithQuotation_MoveFileToPackageWithQuotation() throws Exception {
String fileName = KotlinTestUtils.navigationMetadata("idea/testData/refactoring/move/kotlin/moveFile/packageWithQuotation/moveFileToPackageWithQuotation.test");