diff --git a/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/components/KtFirCompileTimeConstantProvider.kt b/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/components/KtFirCompileTimeConstantProvider.kt index b5f73c67e38..ea8ba14ed2f 100644 --- a/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/components/KtFirCompileTimeConstantProvider.kt +++ b/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/components/KtFirCompileTimeConstantProvider.kt @@ -15,6 +15,7 @@ import org.jetbrains.kotlin.analysis.api.fir.evaluate.KtFirConstantValueConverte import org.jetbrains.kotlin.analysis.api.symbols.markers.* import org.jetbrains.kotlin.analysis.api.tokens.ValidityToken import org.jetbrains.kotlin.analysis.api.withValidityAssertion +import org.jetbrains.kotlin.fir.expressions.FirWhenBranch import org.jetbrains.kotlin.psi.KtExpression internal class KtFirCompileTimeConstantProvider( @@ -28,6 +29,15 @@ internal class KtFirCompileTimeConstantProvider( FirCompileTimeConstantEvaluator.evaluate(fir)?.let { KtFirConstantValueConverter.toConstantValue(it) } ?: KtFirConstantValueConverter.toConstantValue(fir, firResolveState.rootModuleSession) } + // For invalid code like the following, + // ``` + // when { + // true, false -> {} + // } + // ``` + // `false` does not have a corresponding elements on the FIR side and hence the containing `FirWhenBranch` is returned. In this + // case, we simply report null since FIR does not know about it. + is FirWhenBranch -> null else -> throwUnexpectedFirElementError(fir, expression) } } diff --git a/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/components/KtFirExpressionTypeProvider.kt b/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/components/KtFirExpressionTypeProvider.kt index b86f478f488..6f8d1b0cdba 100644 --- a/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/components/KtFirExpressionTypeProvider.kt +++ b/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/components/KtFirExpressionTypeProvider.kt @@ -43,6 +43,15 @@ internal class KtFirExpressionTypeProvider( is FirNamedReference -> fir.getReferencedElementType(firResolveState).asKtType() is FirStatement -> with(analysisSession) { builtinTypes.UNIT } is FirTypeRef, is FirImport, is FirPackageDirective, is FirLabel -> null + // For invalid code like the following, + // ``` + // when { + // true, false -> {} + // } + // ``` + // `false` does not have a corresponding elements on the FIR side and hence the containing `FirWhenBranch` is returned. In this + // case, we simply report null since FIR does not know about it. + is FirWhenBranch -> null else -> error("Unexpected ${fir?.let { it::class }} for ${expression::class} with text `${expression.text}`") } }