From e07b85ff34ba02c2f8d573b081c037a3665c6889 Mon Sep 17 00:00:00 2001 From: Mikhail Glukhikh Date: Mon, 9 Dec 2019 11:36:34 +0300 Subject: [PATCH] FIR Java providers: insert some protection against ProcessCanceledException --- .../kotlin/fir/java/JavaSymbolProvider.kt | 25 ++++++++++++++----- .../KotlinDeserializedJvmSymbolsProvider.kt | 20 ++++++++++++--- 2 files changed, 36 insertions(+), 9 deletions(-) diff --git a/compiler/fir/java/src/org/jetbrains/kotlin/fir/java/JavaSymbolProvider.kt b/compiler/fir/java/src/org/jetbrains/kotlin/fir/java/JavaSymbolProvider.kt index 1b9e209a255..6fcfdeff655 100644 --- a/compiler/fir/java/src/org/jetbrains/kotlin/fir/java/JavaSymbolProvider.kt +++ b/compiler/fir/java/src/org/jetbrains/kotlin/fir/java/JavaSymbolProvider.kt @@ -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 + } } } diff --git a/compiler/fir/java/src/org/jetbrains/kotlin/fir/java/deserialization/KotlinDeserializedJvmSymbolsProvider.kt b/compiler/fir/java/src/org/jetbrains/kotlin/fir/java/deserialization/KotlinDeserializedJvmSymbolsProvider.kt index 5ffb8617fd1..ea0005265b3 100644 --- a/compiler/fir/java/src/org/jetbrains/kotlin/fir/java/deserialization/KotlinDeserializedJvmSymbolsProvider.kt +++ b/compiler/fir/java/src/org/jetbrains/kotlin/fir/java/deserialization/KotlinDeserializedJvmSymbolsProvider.kt @@ -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 { return packagePartsCache.getOrPut(packageFqName) { - computePackagePartsInfos(packageFqName) + try { + computePackagePartsInfos(packageFqName) + } catch (e: ProcessCanceledException) { + emptyList() + } } }