FIR Java providers: insert some protection against ProcessCanceledException

This commit is contained in:
Mikhail Glukhikh
2019-12-09 11:36:34 +03:00
parent cd089658bd
commit e07b85ff34
2 changed files with 36 additions and 9 deletions
@@ -5,6 +5,7 @@
package org.jetbrains.kotlin.fir.java
import com.intellij.openapi.progress.ProcessCanceledException
import com.intellij.openapi.project.Project
import com.intellij.psi.PsiElement
import com.intellij.psi.search.GlobalSearchScope
@@ -124,8 +125,10 @@ class JavaSymbolProvider(
FirSuperTypeScope.prepareSupertypeScope(
useSiteSession,
JavaOverrideChecker(
useSiteSession, if (regularClass is FirJavaClass) regularClass
.javaTypeParameterStack else JavaTypeParameterStack.EMPTY),
useSiteSession,
if (regularClass is FirJavaClass) regularClass.javaTypeParameterStack
else JavaTypeParameterStack.EMPTY
),
superTypeEnhancementScopes
), wrappedDeclaredScope
)
@@ -171,7 +174,13 @@ class JavaSymbolProvider(
}
}
override fun getClassLikeSymbolByFqName(classId: ClassId): FirRegularClassSymbol? = getFirJavaClass(classId)
override fun getClassLikeSymbolByFqName(classId: ClassId): FirRegularClassSymbol? {
return try {
getFirJavaClass(classId)
} catch (e: ProcessCanceledException) {
null
}
}
fun getFirJavaClass(classId: ClassId, content: KotlinClassFinder.Result.ClassFileContent? = null): FirRegularClassSymbol? {
if (!hasTopLevelClassOf(classId)) return null
@@ -309,9 +318,13 @@ class JavaSymbolProvider(
override fun getPackage(fqName: FqName): FqName? {
return packageCache.lookupCacheOrCalculate(fqName) {
val facade = KotlinJavaPsiFacade.getInstance(project)
val javaPackage = facade.findPackage(fqName.asString(), searchScope) ?: return@lookupCacheOrCalculate null
FqName(javaPackage.qualifiedName)
try {
val facade = KotlinJavaPsiFacade.getInstance(project)
val javaPackage = facade.findPackage(fqName.asString(), searchScope) ?: return@lookupCacheOrCalculate null
FqName(javaPackage.qualifiedName)
} catch (e: ProcessCanceledException) {
return@lookupCacheOrCalculate null
}
}
}
@@ -5,6 +5,7 @@
package org.jetbrains.kotlin.fir.java.deserialization
import com.intellij.openapi.progress.ProcessCanceledException
import com.intellij.openapi.project.Project
import org.jetbrains.kotlin.descriptors.SourceElement
import org.jetbrains.kotlin.fir.FirSession
@@ -312,11 +313,20 @@ class KotlinDeserializedJvmSymbolsProvider(
if (classId in handledByJava) return null
val kotlinJvmBinaryClass = when (val result = kotlinClassFinder.findKotlinClassOrContent(classId)) {
val result = try {
kotlinClassFinder.findKotlinClassOrContent(classId)
} catch (e: ProcessCanceledException) {
return null
}
val kotlinJvmBinaryClass = when (result) {
is KotlinClassFinder.Result.KotlinClass -> result.kotlinJvmBinaryClass
is KotlinClassFinder.Result.ClassFileContent -> {
handledByJava.add(classId)
return javaSymbolProvider.getFirJavaClass(classId, result)
return try {
javaSymbolProvider.getFirJavaClass(classId, result)
} catch (e: ProcessCanceledException) {
null
}
}
null -> null
}
@@ -388,7 +398,11 @@ class KotlinDeserializedJvmSymbolsProvider(
private fun getPackageParts(packageFqName: FqName): Collection<PackagePartsCacheData> {
return packagePartsCache.getOrPut(packageFqName) {
computePackagePartsInfos(packageFqName)
try {
computePackagePartsInfos(packageFqName)
} catch (e: ProcessCanceledException) {
emptyList()
}
}
}