Debugger: Do not calculate default source file if an alternative one is available

This commit is contained in:
Yan Zhulanow
2019-06-27 21:58:54 +09:00
parent d45bbaabcd
commit 8f20f0b963
@@ -33,6 +33,7 @@ import com.intellij.openapi.util.Computable
import com.intellij.openapi.vfs.VirtualFile
import com.intellij.openapi.vfs.VirtualFileManager
import com.intellij.psi.PsiFile
import com.intellij.psi.PsiManager
import com.intellij.psi.impl.compiled.ClsFileImpl
import com.intellij.psi.search.DelegatingGlobalSearchScope
import com.intellij.psi.search.GlobalSearchScope
@@ -108,9 +109,7 @@ class KotlinPositionManager(private val myDebugProcess: DebugProcess) : MultiReq
if (!DebuggerUtils.isKotlinSourceFile(fileName)) throw NoDataException.INSTANCE
val psiFile = getPsiFileByLocation(location)?.let {
replaceWithAlternativeSource(it, location)
}
val psiFile = getAlternativeSource(location) ?: getPsiFileByLocation(location)
if (psiFile == null) {
val isKotlinStrataAvailable = location.declaringType().containsKotlinStrata()
@@ -186,15 +185,12 @@ class KotlinPositionManager(private val myDebugProcess: DebugProcess) : MultiReq
class KotlinReentrantSourcePosition(delegate: SourcePosition) : DelegateSourcePosition(delegate)
private fun replaceWithAlternativeSource(psiFile: PsiFile, location: Location): PsiFile {
fun findAlternativeSource(): PsiFile? {
val qName = location.declaringType().name()
val alternativeFileUrl = DebuggerUtilsEx.getAlternativeSourceUrl(qName, myDebugProcess.project) ?: return null
val alternativePsiFile = VirtualFileManager.getInstance().findFileByUrl(alternativeFileUrl) ?: return null
return psiFile.manager.findFile(alternativePsiFile)
}
return findAlternativeSource() ?: psiFile
private fun getAlternativeSource(location: Location): PsiFile? {
val manager = PsiManager.getInstance(myDebugProcess.project)
val qName = location.declaringType().name()
val alternativeFileUrl = DebuggerUtilsEx.getAlternativeSourceUrl(qName, myDebugProcess.project) ?: return null
val alternativePsiFile = VirtualFileManager.getInstance().findFileByUrl(alternativeFileUrl) ?: return null
return manager.findFile(alternativePsiFile)
}
// Returns a property or a constructor if debugger stops at class declaration