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 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? {
|
||||
|
||||
-1
@@ -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 ->
|
||||
|
||||
Reference in New Issue
Block a user