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 targetPackage = moveTarget.getTargetPackage() ?: return null
val targetDir = moveTarget.targetFile?.takeIf { it.isDirectory } ?: moveTarget.targetFile?.parent
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()
return KotlinBundle.message(
"text.sealed.broken.hierarchy.none.in.target",
@@ -749,9 +750,10 @@ class MoveConflictChecker(
val moduleToMoveFrom = classToMove.module ?: return null
val packageToMoveFrom = classToMoveDesc.findPsiPackage(moduleToMoveFrom) ?: return null
val directoryToMoveFrom = classToMove.containingKtFile.containingDirectory?.virtualFile
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) &&
membersRemainingInOriginalPackage.any { !isToBeMoved(it) }
@@ -765,10 +767,11 @@ class MoveConflictChecker(
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 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? {
@@ -177,7 +177,6 @@ internal abstract class MoveKotlinNestedClassesToUpperLevelModel(
val target = KotlinMoveTargetForDeferredFile(
targetPackageFqName,
target,
targetFile = null
) { createKotlinFile(targetFileName, target, targetPackageFqName.asString()) }
target to MoveRefactoringDestination.FILE
@@ -226,13 +226,7 @@ enum class MoveAction : AbstractMultifileRefactoringTest.RefactoringAction {
AutocreatingSingleSourceRootMoveDestination(packageWrapper, rootDir.findFileByRelativePath(it)!!)
} ?: MultipleRootsMoveDestination(packageWrapper)
val targetDir = moveDestination.getTargetIfExists(mainFile)
val targetVirtualFile = if (targetSourceRootPath != null) {
rootDir.findFileByRelativePath(targetSourceRootPath)!!
} else {
targetDir?.virtualFile
}
KotlinMoveTargetForDeferredFile(FqName(packageName), targetDir, targetVirtualFile) {
KotlinMoveTargetForDeferredFile(FqName(packageName), targetDir) {
createKotlinFile(guessNewFileName(elementsToMove)!!, moveDestination.getTargetDirectory(mainFile))
}
} ?: config.getString("targetFile").let { filePath ->