IdeFirProvider: insert protection against ProcessCanceledException
This commit is contained in:
@@ -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? {
|
||||||
|
|||||||
Reference in New Issue
Block a user