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