From 7c73356893625a1dbd9fc0c486c8aaa9652d8634 Mon Sep 17 00:00:00 2001 From: Nikolay Krasko Date: Mon, 18 Dec 2017 16:12:59 +0300 Subject: [PATCH] Early exit from getSourcePosition() for non-kotlin source files --- .../kotlin/idea/debugger/DebuggerUtils.kt | 9 +++++++-- .../idea/debugger/KotlinPositionManager.kt | 18 ++++++++++++------ .../idea/filters/KotlinExceptionFilter.kt | 5 +---- 3 files changed, 20 insertions(+), 12 deletions(-) diff --git a/idea/src/org/jetbrains/kotlin/idea/debugger/DebuggerUtils.kt b/idea/src/org/jetbrains/kotlin/idea/debugger/DebuggerUtils.kt index 4fd76b75424..d4e28879e65 100644 --- a/idea/src/org/jetbrains/kotlin/idea/debugger/DebuggerUtils.kt +++ b/idea/src/org/jetbrains/kotlin/idea/debugger/DebuggerUtils.kt @@ -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, 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, diff --git a/idea/src/org/jetbrains/kotlin/idea/debugger/KotlinPositionManager.kt b/idea/src/org/jetbrains/kotlin/idea/debugger/KotlinPositionManager.kt index 3b3d2669d27..02eb5b14d19 100644 --- a/idea/src/org/jetbrains/kotlin/idea/debugger/KotlinPositionManager.kt +++ b/idea/src/org/jetbrains/kotlin/idea/debugger/KotlinPositionManager.kt @@ -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()) { diff --git a/idea/src/org/jetbrains/kotlin/idea/filters/KotlinExceptionFilter.kt b/idea/src/org/jetbrains/kotlin/idea/filters/KotlinExceptionFilter.kt index 19ce6cef9bb..a2b1f5cfb45 100644 --- a/idea/src/org/jetbrains/kotlin/idea/filters/KotlinExceptionFilter.kt +++ b/idea/src/org/jetbrains/kotlin/idea/filters/KotlinExceptionFilter.kt @@ -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