KT-44841 Move sealed: no warning on splitting hierarchy (JPS)
To provide similar behavior for both Gradle and JPS projects target and source directories are now taken into account. Prior to this commit AbstractMoveTest.kt contained a hack allowing not to create empty target directories. It breaks updated logic of the move check and therefore is removed. To commit empty target directories under 'before' to git one needs to put something in them (git ignores dirs otherwise). Hence .gitignore-s. ^KT-44841 Fixed
This commit is contained in:
+7
-4
@@ -733,10 +733,11 @@ class MoveConflictChecker(
|
|||||||
|
|
||||||
val targetModule = moveTarget.getTargetModule(project) ?: return null
|
val targetModule = moveTarget.getTargetModule(project) ?: return null
|
||||||
val targetPackage = moveTarget.getTargetPackage() ?: return null
|
val targetPackage = moveTarget.getTargetPackage() ?: return null
|
||||||
|
val targetDir = moveTarget.targetFile?.takeIf { it.isDirectory } ?: moveTarget.targetFile?.parent
|
||||||
|
|
||||||
val className = classToMove.nameAsSafeName.asString()
|
val className = classToMove.nameAsSafeName.asString()
|
||||||
|
|
||||||
if (otherHierarchyMembers.none { it.residesIn(targetModule, targetPackage) }) {
|
if (otherHierarchyMembers.none { it.residesIn(targetModule, targetPackage, targetDir) }) {
|
||||||
val hierarchyMembers = buildList { add(classToMove); addAll(otherHierarchyMembers) }.toNamesList()
|
val hierarchyMembers = buildList { add(classToMove); addAll(otherHierarchyMembers) }.toNamesList()
|
||||||
return KotlinBundle.message(
|
return KotlinBundle.message(
|
||||||
"text.sealed.broken.hierarchy.none.in.target",
|
"text.sealed.broken.hierarchy.none.in.target",
|
||||||
@@ -749,9 +750,10 @@ class MoveConflictChecker(
|
|||||||
|
|
||||||
val moduleToMoveFrom = classToMove.module ?: return null
|
val moduleToMoveFrom = classToMove.module ?: return null
|
||||||
val packageToMoveFrom = classToMoveDesc.findPsiPackage(moduleToMoveFrom) ?: return null
|
val packageToMoveFrom = classToMoveDesc.findPsiPackage(moduleToMoveFrom) ?: return null
|
||||||
|
val directoryToMoveFrom = classToMove.containingKtFile.containingDirectory?.virtualFile
|
||||||
|
|
||||||
val membersRemainingInOriginalPackage =
|
val membersRemainingInOriginalPackage =
|
||||||
otherHierarchyMembers.filter { it.residesIn(moduleToMoveFrom, packageToMoveFrom) && !isToBeMoved(it) }.toList()
|
otherHierarchyMembers.filter { it.residesIn(moduleToMoveFrom, packageToMoveFrom, directoryToMoveFrom) && !isToBeMoved(it) }.toList()
|
||||||
|
|
||||||
if ((targetPackage != packageToMoveFrom || targetModule != moduleToMoveFrom) &&
|
if ((targetPackage != packageToMoveFrom || targetModule != moduleToMoveFrom) &&
|
||||||
membersRemainingInOriginalPackage.any { !isToBeMoved(it) }
|
membersRemainingInOriginalPackage.any { !isToBeMoved(it) }
|
||||||
@@ -765,10 +767,11 @@ class MoveConflictChecker(
|
|||||||
return null
|
return null
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun KtClassOrObject.residesIn(targetModule: Module, targetPackage: PsiPackage): Boolean {
|
private fun KtClassOrObject.residesIn(targetModule: Module, targetPackage: PsiPackage, targetDir: VirtualFile?): Boolean {
|
||||||
val myModule = module ?: return false
|
val myModule = module ?: return false
|
||||||
val myPackage = descriptor?.findPsiPackage(myModule)
|
val myPackage = descriptor?.findPsiPackage(myModule)
|
||||||
return myPackage == targetPackage && myModule == targetModule
|
val myDirectory = containingKtFile.containingDirectory?.virtualFile
|
||||||
|
return myPackage == targetPackage && myModule == targetModule && myDirectory == targetDir
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun DeclarationDescriptor.findPsiPackage(module: Module): PsiPackage? {
|
private fun DeclarationDescriptor.findPsiPackage(module: Module): PsiPackage? {
|
||||||
|
|||||||
-1
@@ -177,7 +177,6 @@ internal abstract class MoveKotlinNestedClassesToUpperLevelModel(
|
|||||||
val target = KotlinMoveTargetForDeferredFile(
|
val target = KotlinMoveTargetForDeferredFile(
|
||||||
targetPackageFqName,
|
targetPackageFqName,
|
||||||
target,
|
target,
|
||||||
targetFile = null
|
|
||||||
) { createKotlinFile(targetFileName, target, targetPackageFqName.asString()) }
|
) { createKotlinFile(targetFileName, target, targetPackageFqName.asString()) }
|
||||||
|
|
||||||
target to MoveRefactoringDestination.FILE
|
target to MoveRefactoringDestination.FILE
|
||||||
|
|||||||
@@ -226,13 +226,7 @@ enum class MoveAction : AbstractMultifileRefactoringTest.RefactoringAction {
|
|||||||
AutocreatingSingleSourceRootMoveDestination(packageWrapper, rootDir.findFileByRelativePath(it)!!)
|
AutocreatingSingleSourceRootMoveDestination(packageWrapper, rootDir.findFileByRelativePath(it)!!)
|
||||||
} ?: MultipleRootsMoveDestination(packageWrapper)
|
} ?: MultipleRootsMoveDestination(packageWrapper)
|
||||||
val targetDir = moveDestination.getTargetIfExists(mainFile)
|
val targetDir = moveDestination.getTargetIfExists(mainFile)
|
||||||
val targetVirtualFile = if (targetSourceRootPath != null) {
|
KotlinMoveTargetForDeferredFile(FqName(packageName), targetDir) {
|
||||||
rootDir.findFileByRelativePath(targetSourceRootPath)!!
|
|
||||||
} else {
|
|
||||||
targetDir?.virtualFile
|
|
||||||
}
|
|
||||||
|
|
||||||
KotlinMoveTargetForDeferredFile(FqName(packageName), targetDir, targetVirtualFile) {
|
|
||||||
createKotlinFile(guessNewFileName(elementsToMove)!!, moveDestination.getTargetDirectory(mainFile))
|
createKotlinFile(guessNewFileName(elementsToMove)!!, moveDestination.getTargetDirectory(mainFile))
|
||||||
}
|
}
|
||||||
} ?: config.getString("targetFile").let { filePath ->
|
} ?: config.getString("targetFile").let { filePath ->
|
||||||
|
|||||||
Reference in New Issue
Block a user