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 package org.jetbrains.kotlin.fir.java
import com.intellij.openapi.progress.ProcessCanceledException
import com.intellij.openapi.project.Project import com.intellij.openapi.project.Project
import com.intellij.psi.PsiElement import com.intellij.psi.PsiElement
import com.intellij.psi.search.GlobalSearchScope import com.intellij.psi.search.GlobalSearchScope
@@ -124,8 +125,10 @@ class JavaSymbolProvider(
FirSuperTypeScope.prepareSupertypeScope( FirSuperTypeScope.prepareSupertypeScope(
useSiteSession, useSiteSession,
JavaOverrideChecker( JavaOverrideChecker(
useSiteSession, if (regularClass is FirJavaClass) regularClass useSiteSession,
.javaTypeParameterStack else JavaTypeParameterStack.EMPTY), if (regularClass is FirJavaClass) regularClass.javaTypeParameterStack
else JavaTypeParameterStack.EMPTY
),
superTypeEnhancementScopes superTypeEnhancementScopes
), wrappedDeclaredScope ), 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? { fun getFirJavaClass(classId: ClassId, content: KotlinClassFinder.Result.ClassFileContent? = null): FirRegularClassSymbol? {
if (!hasTopLevelClassOf(classId)) return null if (!hasTopLevelClassOf(classId)) return null
@@ -309,9 +318,13 @@ class JavaSymbolProvider(
override fun getPackage(fqName: FqName): FqName? { override fun getPackage(fqName: FqName): FqName? {
return packageCache.lookupCacheOrCalculate(fqName) { return packageCache.lookupCacheOrCalculate(fqName) {
val facade = KotlinJavaPsiFacade.getInstance(project) try {
val javaPackage = facade.findPackage(fqName.asString(), searchScope) ?: return@lookupCacheOrCalculate null val facade = KotlinJavaPsiFacade.getInstance(project)
FqName(javaPackage.qualifiedName) 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 package org.jetbrains.kotlin.fir.java.deserialization
import com.intellij.openapi.progress.ProcessCanceledException
import com.intellij.openapi.project.Project import com.intellij.openapi.project.Project
import org.jetbrains.kotlin.descriptors.SourceElement import org.jetbrains.kotlin.descriptors.SourceElement
import org.jetbrains.kotlin.fir.FirSession import org.jetbrains.kotlin.fir.FirSession
@@ -312,11 +313,20 @@ class KotlinDeserializedJvmSymbolsProvider(
if (classId in handledByJava) return null 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.KotlinClass -> result.kotlinJvmBinaryClass
is KotlinClassFinder.Result.ClassFileContent -> { is KotlinClassFinder.Result.ClassFileContent -> {
handledByJava.add(classId) handledByJava.add(classId)
return javaSymbolProvider.getFirJavaClass(classId, result) return try {
javaSymbolProvider.getFirJavaClass(classId, result)
} catch (e: ProcessCanceledException) {
null
}
} }
null -> null null -> null
} }
@@ -388,7 +398,11 @@ class KotlinDeserializedJvmSymbolsProvider(
private fun getPackageParts(packageFqName: FqName): Collection<PackagePartsCacheData> { private fun getPackageParts(packageFqName: FqName): Collection<PackagePartsCacheData> {
return packagePartsCache.getOrPut(packageFqName) { return packagePartsCache.getOrPut(packageFqName) {
computePackagePartsInfos(packageFqName) try {
computePackagePartsInfos(packageFqName)
} catch (e: ProcessCanceledException) {
emptyList()
}
} }
} }