diff --git a/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/references/KtFirReferenceResolver.kt b/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/references/KtFirReferenceResolver.kt index b57508ac81f..7c4541c302d 100644 --- a/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/references/KtFirReferenceResolver.kt +++ b/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/references/KtFirReferenceResolver.kt @@ -14,6 +14,7 @@ import com.intellij.psi.impl.source.resolve.ResolveCache import org.jetbrains.kotlin.analysis.api.KtAllowAnalysisOnEdt import org.jetbrains.kotlin.analysis.api.analyze import org.jetbrains.kotlin.analysis.api.lifetime.allowAnalysisOnEdt +import org.jetbrains.kotlin.analysis.utils.errors.shouldIjPlatformExceptionBeRethrown import org.jetbrains.kotlin.analysis.utils.printer.getElementTextInContext object KtFirReferenceResolver : ResolveCache.PolyVariantResolver { @@ -27,7 +28,7 @@ object KtFirReferenceResolver : ResolveCache.PolyVariantResolver { val resolveToPsiElements = try { analyze(ref.expression) { ref.getResolvedToPsi(this) } } catch (e: Throwable) { - if (e is ControlFlowException || e is IndexNotReadyException) throw e + if (shouldIjPlatformExceptionBeRethrown(e)) throw e throw KtReferenceResolveException(ref, e) } diff --git a/analysis/analysis-internal-utils/src/org/jetbrains/kotlin/analysis/utils/errors/platformExceptionUtils.kt b/analysis/analysis-internal-utils/src/org/jetbrains/kotlin/analysis/utils/errors/platformExceptionUtils.kt new file mode 100644 index 00000000000..b0ace4e081c --- /dev/null +++ b/analysis/analysis-internal-utils/src/org/jetbrains/kotlin/analysis/utils/errors/platformExceptionUtils.kt @@ -0,0 +1,15 @@ +/* + * Copyright 2010-2022 JetBrains s.r.o. and Kotlin Programming Language contributors. + * Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file. + */ + +package org.jetbrains.kotlin.analysis.utils.errors + +import com.intellij.openapi.diagnostic.ControlFlowException +import com.intellij.openapi.project.IndexNotReadyException + +public fun shouldIjPlatformExceptionBeRethrown(exception: Throwable): Boolean = when (exception) { + is ControlFlowException -> true + is IndexNotReadyException -> true + else -> false +} \ No newline at end of file diff --git a/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/caches/ValueWithPostCompute.kt b/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/caches/ValueWithPostCompute.kt index 35d8dcf158e..0da7421a185 100644 --- a/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/caches/ValueWithPostCompute.kt +++ b/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/caches/ValueWithPostCompute.kt @@ -8,6 +8,7 @@ package org.jetbrains.kotlin.analysis.low.level.api.fir.fir.caches import com.intellij.openapi.progress.ProcessCanceledException import com.intellij.openapi.project.IndexNotReadyException import com.intellij.openapi.diagnostic.ControlFlowException +import org.jetbrains.kotlin.analysis.utils.errors.shouldIjPlatformExceptionBeRethrown /** * Lazily calculated value which runs postCompute in the same thread, @@ -101,11 +102,8 @@ internal class ValueWithPostCompute( } } - private fun exceptionShouldBeSavedInCache(e: Throwable): Boolean = when (e) { - is IndexNotReadyException -> false - is ControlFlowException -> false - else -> true - } + private fun exceptionShouldBeSavedInCache(exception: Throwable): Boolean = + !shouldIjPlatformExceptionBeRethrown(exception) @Suppress("UNCHECKED_CAST") diff --git a/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/lazy/resolve/FirLazyDeclarationResolver.kt b/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/lazy/resolve/FirLazyDeclarationResolver.kt index d1fcea3f984..cfaf92a2232 100644 --- a/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/lazy/resolve/FirLazyDeclarationResolver.kt +++ b/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/lazy/resolve/FirLazyDeclarationResolver.kt @@ -20,6 +20,7 @@ import org.jetbrains.kotlin.analysis.low.level.api.fir.transformers.LazyTransfor import org.jetbrains.kotlin.analysis.low.level.api.fir.util.checkCanceled import org.jetbrains.kotlin.analysis.low.level.api.fir.util.findSourceNonLocalFirDeclaration import org.jetbrains.kotlin.analysis.low.level.api.fir.util.withFirAttachment +import org.jetbrains.kotlin.analysis.utils.errors.shouldIjPlatformExceptionBeRethrown import org.jetbrains.kotlin.fir.FirElement import org.jetbrains.kotlin.fir.declarations.* import org.jetbrains.kotlin.fir.declarations.synthetic.FirSyntheticProperty @@ -428,7 +429,7 @@ private fun rethrowWithDetails( fromPhase: FirResolvePhase, toPhase: FirResolvePhase? ): Nothing { - if (e is ControlFlowException) throw e + if (shouldIjPlatformExceptionBeRethrown(e)) throw e errorWithAttachment( buildString { val moduleData = firDeclarationToResolve.llFirModuleData