FIR Java providers: insert some protection against ProcessCanceledException
This commit is contained in:
@@ -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
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
+17
-3
@@ -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()
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user