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:
Andrei Klunnyi
2021-04-16 18:17:39 +02:00
committed by Space
parent b961812efd
commit 89801a1ac7
7 changed files with 8 additions and 12 deletions
@@ -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? {
@@ -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 ->