IdeFirProvider: insert protection against ProcessCanceledException

This commit is contained in:
Mikhail Glukhikh
2019-12-06 17:51:42 +03:00
parent fc117466a8
commit cd089658bd
2 changed files with 35 additions and 18 deletions
@@ -5,6 +5,7 @@
package org.jetbrains.kotlin.idea.fir package org.jetbrains.kotlin.idea.fir
import com.intellij.openapi.progress.ProgressIndicatorProvider
import com.intellij.psi.PsiElement import com.intellij.psi.PsiElement
import org.jetbrains.kotlin.fir.FirElement import org.jetbrains.kotlin.fir.FirElement
import org.jetbrains.kotlin.fir.declarations.* import org.jetbrains.kotlin.fir.declarations.*
@@ -5,6 +5,7 @@
package org.jetbrains.kotlin.idea.fir package org.jetbrains.kotlin.idea.fir
import com.intellij.openapi.progress.ProcessCanceledException
import com.intellij.openapi.project.Project import com.intellij.openapi.project.Project
import com.intellij.psi.search.GlobalSearchScope import com.intellij.psi.search.GlobalSearchScope
import org.jetbrains.kotlin.fir.FirSession import org.jetbrains.kotlin.fir.FirSession
@@ -36,16 +37,19 @@ class IdeFirProvider(
override fun getFirClassifierByFqName(classId: ClassId): FirClassLikeDeclaration<*>? { override fun getFirClassifierByFqName(classId: ClassId): FirClassLikeDeclaration<*>? {
return cacheProvider.getFirClassifierByFqName(classId) ?: run { return cacheProvider.getFirClassifierByFqName(classId) ?: run {
try {
val classes = KotlinFullClassNameIndex.getInstance().get(classId.asSingleFqName().asString(), project, scope)
val ktClass = classes.firstOrNull {
classId.packageFqName == it.containingKtFile.packageFqName
} ?: return null // TODO: what if two of them?
val classes = KotlinFullClassNameIndex.getInstance().get(classId.asSingleFqName().asString(), project, scope) val ktFile = ktClass.containingKtFile
val ktClass = classes.firstOrNull { getOrBuildFile(ktFile)
classId.packageFqName == it.containingKtFile.packageFqName
} ?: return null // TODO: what if two of them?
val ktFile = ktClass.containingKtFile
getOrBuildFile(ktFile) cacheProvider.getFirClassifierByFqName(classId)
} catch (e: ProcessCanceledException) {
cacheProvider.getFirClassifierByFqName(classId) return null
}
} }
} }
@@ -68,11 +72,15 @@ class IdeFirProvider(
override fun getTopLevelCallableSymbols(packageFqName: FqName, name: Name): List<FirCallableSymbol<*>> { override fun getTopLevelCallableSymbols(packageFqName: FqName, name: Name): List<FirCallableSymbol<*>> {
val packagePrefix = if (packageFqName.isRoot) "" else "$packageFqName." val packagePrefix = if (packageFqName.isRoot) "" else "$packageFqName."
val topLevelFunctions = KotlinTopLevelFunctionFqnNameIndex.getInstance()["$packagePrefix$name", project, scope] return try {
val topLevelProperties = KotlinTopLevelPropertyFqnNameIndex.getInstance()["$packagePrefix$name", project, scope] val topLevelFunctions = KotlinTopLevelFunctionFqnNameIndex.getInstance()["$packagePrefix$name", project, scope]
topLevelFunctions.forEach { getOrBuildFile(it.containingKtFile) } val topLevelProperties = KotlinTopLevelPropertyFqnNameIndex.getInstance()["$packagePrefix$name", project, scope]
topLevelProperties.forEach { getOrBuildFile(it.containingKtFile) } topLevelFunctions.forEach { getOrBuildFile(it.containingKtFile) }
return cacheProvider.getTopLevelCallableSymbols(packageFqName, name) topLevelProperties.forEach { getOrBuildFile(it.containingKtFile) }
cacheProvider.getTopLevelCallableSymbols(packageFqName, name)
} catch (e: ProcessCanceledException) {
emptyList()
}
} }
override fun getFirClassifierContainerFile(fqName: ClassId): FirFile { override fun getFirClassifierContainerFile(fqName: ClassId): FirFile {
@@ -93,8 +101,12 @@ class IdeFirProvider(
override fun getFirClassifierContainerFileIfAny(symbol: FirClassLikeSymbol<*>): FirFile? { override fun getFirClassifierContainerFileIfAny(symbol: FirClassLikeSymbol<*>): FirFile? {
val psi = symbol.fir.source?.psi val psi = symbol.fir.source?.psi
if (psi is KtElement) { if (psi is KtElement) {
val ktFile = psi.containingKtFile return try {
return getOrBuildFile(ktFile) val ktFile = psi.containingKtFile
getOrBuildFile(ktFile)
} catch (e: ProcessCanceledException) {
null
}
} }
return getFirClassifierContainerFileIfAny(symbol.classId) return getFirClassifierContainerFileIfAny(symbol.classId)
} }
@@ -104,9 +116,13 @@ class IdeFirProvider(
} }
override fun getFirFilesByPackage(fqName: FqName): List<FirFile> { override fun getFirFilesByPackage(fqName: FqName): List<FirFile> {
val files = KotlinExactPackagesIndex.getInstance()[fqName.asString(), project, scope] return try {
files.forEach { getOrBuildFile(it) } val files = KotlinExactPackagesIndex.getInstance()[fqName.asString(), project, scope]
return cacheProvider.getFirFilesByPackage(fqName) files.forEach { getOrBuildFile(it) }
cacheProvider.getFirFilesByPackage(fqName)
} catch (e: ProcessCanceledException) {
emptyList()
}
} }
override fun getClassDeclaredMemberScope(classId: ClassId): FirScope? { override fun getClassDeclaredMemberScope(classId: ClassId): FirScope? {