Move: Reinitialize move context as MoveFileHandler.findUsages() can be bypassed
#KT-8436 Fixed
This commit is contained in:
+30
-25
@@ -40,26 +40,15 @@ import org.jetbrains.kotlin.idea.core.getPackage
|
|||||||
import org.jetbrains.kotlin.idea.core.packageMatchesDirectory
|
import org.jetbrains.kotlin.idea.core.packageMatchesDirectory
|
||||||
|
|
||||||
public class MoveKotlinFileHandler : MoveFileHandler() {
|
public class MoveKotlinFileHandler : MoveFileHandler() {
|
||||||
private var packageNameInfo: PackageNameInfo? = null
|
private data class MoveContext(
|
||||||
private var declarationMoveProcessor: MoveKotlinTopLevelDeclarationsProcessor? = null
|
val packageNameInfo: PackageNameInfo,
|
||||||
|
val declarationMoveProcessor: MoveKotlinTopLevelDeclarationsProcessor
|
||||||
|
)
|
||||||
|
|
||||||
private fun clearState() {
|
private var moveContext: MoveContext? = null
|
||||||
packageNameInfo = null
|
|
||||||
declarationMoveProcessor = null
|
|
||||||
}
|
|
||||||
|
|
||||||
override fun canProcessElement(element: PsiFile?): Boolean {
|
private fun initMoveContext(psiFile: PsiFile, newParent: PsiDirectory): MoveContext? {
|
||||||
if (element is PsiCompiledElement || element !is JetFile) return false
|
this.moveContext = null
|
||||||
return !JavaProjectRootsUtil.isOutsideJavaSourceRoot(element)
|
|
||||||
}
|
|
||||||
|
|
||||||
override fun findUsages(
|
|
||||||
psiFile: PsiFile,
|
|
||||||
newParent: PsiDirectory,
|
|
||||||
searchInComments: Boolean,
|
|
||||||
searchInNonJavaFiles: Boolean
|
|
||||||
): List<UsageInfo>? {
|
|
||||||
clearState()
|
|
||||||
|
|
||||||
if (psiFile !is JetFile || !(psiFile.updatePackageDirective ?: psiFile.packageMatchesDirectory())) return null
|
if (psiFile !is JetFile || !(psiFile.updatePackageDirective ?: psiFile.packageMatchesDirectory())) return null
|
||||||
|
|
||||||
@@ -83,21 +72,36 @@ public class MoveKotlinFileHandler : MoveFileHandler() {
|
|||||||
Mover.Idle
|
Mover.Idle
|
||||||
)
|
)
|
||||||
|
|
||||||
this.packageNameInfo = packageNameInfo
|
val moveContext = MoveContext(packageNameInfo, declarationMoveProcessor)
|
||||||
this.declarationMoveProcessor = declarationMoveProcessor
|
this.moveContext = moveContext
|
||||||
|
return moveContext
|
||||||
|
}
|
||||||
|
|
||||||
return declarationMoveProcessor.findUsages().toList()
|
override fun canProcessElement(element: PsiFile?): Boolean {
|
||||||
|
if (element is PsiCompiledElement || element !is JetFile) return false
|
||||||
|
return !JavaProjectRootsUtil.isOutsideJavaSourceRoot(element)
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun findUsages(
|
||||||
|
psiFile: PsiFile,
|
||||||
|
newParent: PsiDirectory,
|
||||||
|
searchInComments: Boolean,
|
||||||
|
searchInNonJavaFiles: Boolean
|
||||||
|
): List<UsageInfo> {
|
||||||
|
val moveContext = initMoveContext(psiFile, newParent) ?: return emptyList()
|
||||||
|
return moveContext.declarationMoveProcessor.findUsages().toList()
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun prepareMovedFile(file: PsiFile, moveDestination: PsiDirectory, oldToNewMap: Map<PsiElement, PsiElement>) {
|
override fun prepareMovedFile(file: PsiFile, moveDestination: PsiDirectory, oldToNewMap: Map<PsiElement, PsiElement>) {
|
||||||
|
initMoveContext(file, moveDestination)
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun updateMovedFile(file: PsiFile) {
|
override fun updateMovedFile(file: PsiFile) {
|
||||||
if (file !is JetFile) return
|
if (file !is JetFile) return
|
||||||
|
val moveContext = this.moveContext ?: return
|
||||||
|
|
||||||
file.updatePackageDirective = null
|
file.updatePackageDirective = null
|
||||||
val packageNameInfo = packageNameInfo ?: return
|
val packageNameInfo = moveContext.packageNameInfo
|
||||||
|
|
||||||
val internalUsages = file.getInternalReferencesToUpdateOnPackageNameChange(packageNameInfo)
|
val internalUsages = file.getInternalReferencesToUpdateOnPackageNameChange(packageNameInfo)
|
||||||
file.getPackageDirective()?.setFqName(packageNameInfo.newPackageName)
|
file.getPackageDirective()?.setFqName(packageNameInfo.newPackageName)
|
||||||
@@ -105,12 +109,13 @@ public class MoveKotlinFileHandler : MoveFileHandler() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
override fun retargetUsages(usageInfos: List<UsageInfo>?, oldToNewMap: Map<PsiElement, PsiElement>?) {
|
override fun retargetUsages(usageInfos: List<UsageInfo>?, oldToNewMap: Map<PsiElement, PsiElement>?) {
|
||||||
val processor = declarationMoveProcessor ?: return
|
val moveContext = this.moveContext ?: return
|
||||||
|
val processor = moveContext.declarationMoveProcessor
|
||||||
processor.project.runWithElementsToShortenIsEmptyIgnored {
|
processor.project.runWithElementsToShortenIsEmptyIgnored {
|
||||||
try {
|
try {
|
||||||
usageInfos?.let { processor.execute(it) }
|
usageInfos?.let { processor.execute(it) }
|
||||||
} finally {
|
} finally {
|
||||||
clearState()
|
this.moveContext = null
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user