Early exit from getSourcePosition() for non-kotlin source files

This commit is contained in:
Nikolay Krasko
2017-12-18 16:12:59 +03:00
parent 50608d0844
commit 7c73356893
3 changed files with 20 additions and 12 deletions
@@ -20,6 +20,7 @@ import com.intellij.openapi.project.DumbService
import com.intellij.openapi.project.Project
import com.intellij.openapi.util.io.FileUtilRt
import com.intellij.psi.search.GlobalSearchScope
import org.jetbrains.kotlin.asJava.finder.JavaElementFinder
import org.jetbrains.kotlin.descriptors.CallableDescriptor
import org.jetbrains.kotlin.idea.KotlinFileTypeFactory
import org.jetbrains.kotlin.idea.caches.resolve.getResolutionFacade
@@ -59,8 +60,7 @@ object DebuggerUtils {
scopes: List<GlobalSearchScope>,
className: JvmClassName,
fileName: String): KtFile? {
val extension = FileUtilRt.getExtension(fileName)
if (extension !in KotlinFileTypeFactory.KOTLIN_EXTENSIONS) return null
if (!isKotlinSourceFile(fileName)) return null
if (DumbService.getInstance(project).isDumb) return null
val filesWithExactName = scopes.findFirstNotEmpty { findFilesByNameInPackage(className, fileName, project, it) } ?: return null
@@ -133,6 +133,11 @@ object DebuggerUtils {
return analyzedElements
}
fun isKotlinSourceFile(fileName: String): Boolean {
val extension = FileUtilRt.getExtension(fileName).toLowerCase()
return extension in KotlinFileTypeFactory.KOTLIN_EXTENSIONS
}
private fun analyzeElementWithInline(
resolutionFacade: ResolutionFacade,
element: KtElement,
@@ -77,6 +77,9 @@ class KotlinPositionManager(private val myDebugProcess: DebugProcess) : MultiReq
override fun getSourcePosition(location: Location?): SourcePosition? {
if (location == null) throw NoDataException.INSTANCE
val fileName = location.safeSourceName ?: throw NoDataException.INSTANCE
if (!DebuggerUtils.isKotlinSourceFile(fileName)) throw NoDataException.INSTANCE
val psiFile = getPsiFileByLocation(location)
if (psiFile == null) {
val isKotlinStrataAvailable = location.declaringType().containsKotlinStrata()
@@ -184,17 +187,20 @@ class KotlinPositionManager(private val myDebugProcess: DebugProcess) : MultiReq
return null
}
private fun getPsiFileByLocation(location: Location): PsiFile? {
val sourceName: String
try {
sourceName = location.sourceName()
private val Location.safeSourceName: String? get() {
return try {
sourceName()
}
catch (e: AbsentInformationException) {
return null
null
}
catch (e: InternalError) {
return null
null
}
}
private fun getPsiFileByLocation(location: Location): PsiFile? {
val sourceName = location.safeSourceName ?: return null
val referenceInternalName = try {
if (location.declaringType().containsKotlinStrata()) {
@@ -19,11 +19,9 @@ package org.jetbrains.kotlin.idea.filters
import com.intellij.execution.filters.*
import com.intellij.execution.filters.impl.HyperlinkInfoFactoryImpl
import com.intellij.openapi.project.Project
import com.intellij.openapi.util.io.FileUtilRt
import com.intellij.openapi.vfs.VirtualFile
import com.intellij.psi.search.FilenameIndex
import com.intellij.psi.search.GlobalSearchScope
import org.jetbrains.kotlin.idea.KotlinFileTypeFactory
import org.jetbrains.kotlin.idea.debugger.*
import org.jetbrains.kotlin.resolve.jvm.JvmClassName
import java.util.*
@@ -59,8 +57,7 @@ class KotlinExceptionFilter(private val searchScope: GlobalSearchScope) : Filter
val fileName = stackTraceElement.fileName
val extension = FileUtilRt.getExtension(fileName).toLowerCase()
if (extension !in KotlinFileTypeFactory.KOTLIN_EXTENSIONS) return null
if (!DebuggerUtils.isKotlinSourceFile(fileName)) return null
// fullyQualifiedName is of format "package.Class$Inner"
val fullyQualifiedName = stackTraceElement.className