AA FIR: gracefully ignore some FIR element kinds

^KTIJ-23263 Fixed
diff --git a/analysis/analysis-api-fe10/tests-gen/org/jetbrains/kotlin/analysis/api/fe10/test/cases/generated/cases/components/compileTimeConstantProvider/Fe10IdeNormalAnalysisSourceModuleCompileTimeConstantEvaluatorTestGenerated.java b/analysis/analysis-api-fe10/tests-gen/org/jetbrains/kotlin/analysis/api/fe10/test/cases/generated/cases/components/compileTimeConstantProvider/Fe10IdeNormalAnalysisSourceModuleCompileTimeConstantEvaluatorTestGenerated.java
index 9b1ec5d..714931c 100644
--- a/analysis/analysis-api-fe10/tests-gen/org/jetbrains/kotlin/analysis/api/fe10/test/cases/generated/cases/components/compileTimeConstantProvider/Fe10IdeNormalAnalysisSourceModuleCompileTimeConstantEvaluatorTestGenerated.java
+++ b/analysis/analysis-api-fe10/tests-gen/org/jetbrains/kotlin/analysis/api/fe10/test/cases/generated/cases/components/compileTimeConstantProvider/Fe10IdeNormalAnalysisSourceModuleCompileTimeConstantEvaluatorTestGenerated.java
@@ -242,12 +242,24 @@
         }
 
         @Test
+        @TestMetadata("commaInWhenCondition.kt")
+        public void testCommaInWhenCondition() throws Exception {
+            runTest("analysis/analysis-api/testData/components/compileTimeConstantProvider/evaluate/incompleteCode/commaInWhenCondition.kt");
+        }
+
+        @Test
         @TestMetadata("incompleteRange.kt")
         public void testIncompleteRange() throws Exception {
             runTest("analysis/analysis-api/testData/components/compileTimeConstantProvider/evaluate/incompleteCode/incompleteRange.kt");
         }
 
         @Test
+        @TestMetadata("invalidLPARinPropertyName.kt")
+        public void testInvalidLPARinPropertyName() throws Exception {
+            runTest("analysis/analysis-api/testData/components/compileTimeConstantProvider/evaluate/incompleteCode/invalidLPARinPropertyName.kt");
+        }
+
+        @Test
         @TestMetadata("noRightOperand.kt")
         public void testNoRightOperand() throws Exception {
             runTest("analysis/analysis-api/testData/components/compileTimeConstantProvider/evaluate/incompleteCode/noRightOperand.kt");
diff --git a/analysis/analysis-api-fe10/tests-gen/org/jetbrains/kotlin/analysis/api/fe10/test/cases/generated/cases/components/expressionTypeProvider/Fe10IdeNormalAnalysisSourceModuleHLExpressionTypeTestGenerated.java b/analysis/analysis-api-fe10/tests-gen/org/jetbrains/kotlin/analysis/api/fe10/test/cases/generated/cases/components/expressionTypeProvider/Fe10IdeNormalAnalysisSourceModuleHLExpressionTypeTestGenerated.java
index 14251d9..c0aff6b 100644
--- a/analysis/analysis-api-fe10/tests-gen/org/jetbrains/kotlin/analysis/api/fe10/test/cases/generated/cases/components/expressionTypeProvider/Fe10IdeNormalAnalysisSourceModuleHLExpressionTypeTestGenerated.java
+++ b/analysis/analysis-api-fe10/tests-gen/org/jetbrains/kotlin/analysis/api/fe10/test/cases/generated/cases/components/expressionTypeProvider/Fe10IdeNormalAnalysisSourceModuleHLExpressionTypeTestGenerated.java
@@ -277,4 +277,26 @@
             runTest("analysis/analysis-api/testData/components/expressionTypeProvider/expressionType/assignment/readArrayElement.kt");
         }
     }
+
+    @Nested
+    @TestMetadata("analysis/analysis-api/testData/components/expressionTypeProvider/expressionType/incompleteCode")
+    @TestDataPath("$PROJECT_ROOT")
+    public class IncompleteCode {
+        @Test
+        public void testAllFilesPresentInIncompleteCode() throws Exception {
+            KtTestUtil.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("analysis/analysis-api/testData/components/expressionTypeProvider/expressionType/incompleteCode"), Pattern.compile("^(.+)\\.kt$"), null, true);
+        }
+
+        @Test
+        @TestMetadata("commaInWhenCondition.kt")
+        public void testCommaInWhenCondition() throws Exception {
+            runTest("analysis/analysis-api/testData/components/expressionTypeProvider/expressionType/incompleteCode/commaInWhenCondition.kt");
+        }
+
+        @Test
+        @TestMetadata("invalidLPARinPropertyName.kt")
+        public void testInvalidLPARinPropertyName() throws Exception {
+            runTest("analysis/analysis-api/testData/components/expressionTypeProvider/expressionType/incompleteCode/invalidLPARinPropertyName.kt");
+        }
+    }
 }
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 0b4aa6d..959d51e 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
@@ -12,8 +12,9 @@
 import org.jetbrains.kotlin.analysis.api.fir.evaluate.FirCompileTimeConstantEvaluator
 import org.jetbrains.kotlin.analysis.api.lifetime.KtLifetimeToken
 import org.jetbrains.kotlin.analysis.low.level.api.fir.api.getOrBuildFir
-import org.jetbrains.kotlin.analysis.low.level.api.fir.api.throwUnexpectedFirElementError
+import org.jetbrains.kotlin.analysis.low.level.api.fir.api.throwUnexpectedFirElementErrorWithExceptions
 import org.jetbrains.kotlin.fir.FirElement
+import org.jetbrains.kotlin.fir.declarations.FirClass
 import org.jetbrains.kotlin.fir.expressions.FirExpression
 import org.jetbrains.kotlin.fir.expressions.FirPropertyAccessExpression
 import org.jetbrains.kotlin.fir.expressions.FirWhenBranch
@@ -47,16 +48,14 @@
                     KtConstantValue.KtErrorConstantValue(e.localizedMessage, sourcePsi)
                 }
             }
-            // 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, sourcePsi)
+            else -> throwUnexpectedFirElementErrorWithExceptions(
+                fir,
+                sourcePsi,
+                exceptionalFirClasses = listOf(
+                    FirClass::class,
+                    FirWhenBranch::class,
+                )
+            )
         }
     }
 
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 1bb1ada..ce96a61 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
@@ -11,16 +11,15 @@
 import org.jetbrains.kotlin.analysis.api.fir.utils.getReferencedElementType
 import org.jetbrains.kotlin.analysis.api.fir.utils.unwrap
 import org.jetbrains.kotlin.analysis.api.lifetime.KtLifetimeToken
-import org.jetbrains.kotlin.analysis.api.lifetime.withValidityAssertion
 import org.jetbrains.kotlin.analysis.api.types.KtType
 import org.jetbrains.kotlin.analysis.low.level.api.fir.api.getOrBuildFir
 import org.jetbrains.kotlin.analysis.low.level.api.fir.api.getOrBuildFirOfType
 import org.jetbrains.kotlin.analysis.low.level.api.fir.api.getOrBuildFirSafe
+import org.jetbrains.kotlin.analysis.low.level.api.fir.api.throwUnexpectedFirElementErrorWithExceptions
 import org.jetbrains.kotlin.fir.FirLabel
 import org.jetbrains.kotlin.fir.FirPackageDirective
 import org.jetbrains.kotlin.fir.declarations.*
 import org.jetbrains.kotlin.fir.declarations.utils.isSuspend
-import org.jetbrains.kotlin.fir.declarations.utils.superConeTypes
 import org.jetbrains.kotlin.fir.expressions.*
 import org.jetbrains.kotlin.fir.psi
 import org.jetbrains.kotlin.fir.references.FirNamedReference
@@ -68,17 +67,17 @@
             is FirExpression -> fir.typeRef.coneType.asKtType()
             is FirNamedReference -> fir.getReferencedElementType().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}`")
+            else -> throwUnexpectedFirElementErrorWithExceptions(
+                fir,
+                expression,
+                exceptionalFirClasses = listOf(
+                    FirImport::class,
+                    FirLabel::class,
+                    FirPackageDirective::class,
+                    FirTypeRef::class,
+                    FirWhenBranch::class
+                )
+            )
         }
     }
 
diff --git a/analysis/analysis-api-fir/tests-gen/org/jetbrains/kotlin/analysis/api/fir/test/cases/generated/cases/components/compileTimeConstantProvider/FirIdeDependentAnalysisSourceModuleCompileTimeConstantEvaluatorTestGenerated.java b/analysis/analysis-api-fir/tests-gen/org/jetbrains/kotlin/analysis/api/fir/test/cases/generated/cases/components/compileTimeConstantProvider/FirIdeDependentAnalysisSourceModuleCompileTimeConstantEvaluatorTestGenerated.java
index 7faea64..75e3868 100644
--- a/analysis/analysis-api-fir/tests-gen/org/jetbrains/kotlin/analysis/api/fir/test/cases/generated/cases/components/compileTimeConstantProvider/FirIdeDependentAnalysisSourceModuleCompileTimeConstantEvaluatorTestGenerated.java
+++ b/analysis/analysis-api-fir/tests-gen/org/jetbrains/kotlin/analysis/api/fir/test/cases/generated/cases/components/compileTimeConstantProvider/FirIdeDependentAnalysisSourceModuleCompileTimeConstantEvaluatorTestGenerated.java
@@ -242,12 +242,24 @@
         }
 
         @Test
+        @TestMetadata("commaInWhenCondition.kt")
+        public void testCommaInWhenCondition() throws Exception {
+            runTest("analysis/analysis-api/testData/components/compileTimeConstantProvider/evaluate/incompleteCode/commaInWhenCondition.kt");
+        }
+
+        @Test
         @TestMetadata("incompleteRange.kt")
         public void testIncompleteRange() throws Exception {
             runTest("analysis/analysis-api/testData/components/compileTimeConstantProvider/evaluate/incompleteCode/incompleteRange.kt");
         }
 
         @Test
+        @TestMetadata("invalidLPARinPropertyName.kt")
+        public void testInvalidLPARinPropertyName() throws Exception {
+            runTest("analysis/analysis-api/testData/components/compileTimeConstantProvider/evaluate/incompleteCode/invalidLPARinPropertyName.kt");
+        }
+
+        @Test
         @TestMetadata("noRightOperand.kt")
         public void testNoRightOperand() throws Exception {
             runTest("analysis/analysis-api/testData/components/compileTimeConstantProvider/evaluate/incompleteCode/noRightOperand.kt");
diff --git a/analysis/analysis-api-fir/tests-gen/org/jetbrains/kotlin/analysis/api/fir/test/cases/generated/cases/components/compileTimeConstantProvider/FirIdeNormalAnalysisSourceModuleCompileTimeConstantEvaluatorTestGenerated.java b/analysis/analysis-api-fir/tests-gen/org/jetbrains/kotlin/analysis/api/fir/test/cases/generated/cases/components/compileTimeConstantProvider/FirIdeNormalAnalysisSourceModuleCompileTimeConstantEvaluatorTestGenerated.java
index f0e3302..da44098 100644
--- a/analysis/analysis-api-fir/tests-gen/org/jetbrains/kotlin/analysis/api/fir/test/cases/generated/cases/components/compileTimeConstantProvider/FirIdeNormalAnalysisSourceModuleCompileTimeConstantEvaluatorTestGenerated.java
+++ b/analysis/analysis-api-fir/tests-gen/org/jetbrains/kotlin/analysis/api/fir/test/cases/generated/cases/components/compileTimeConstantProvider/FirIdeNormalAnalysisSourceModuleCompileTimeConstantEvaluatorTestGenerated.java
@@ -242,12 +242,24 @@
         }
 
         @Test
+        @TestMetadata("commaInWhenCondition.kt")
+        public void testCommaInWhenCondition() throws Exception {
+            runTest("analysis/analysis-api/testData/components/compileTimeConstantProvider/evaluate/incompleteCode/commaInWhenCondition.kt");
+        }
+
+        @Test
         @TestMetadata("incompleteRange.kt")
         public void testIncompleteRange() throws Exception {
             runTest("analysis/analysis-api/testData/components/compileTimeConstantProvider/evaluate/incompleteCode/incompleteRange.kt");
         }
 
         @Test
+        @TestMetadata("invalidLPARinPropertyName.kt")
+        public void testInvalidLPARinPropertyName() throws Exception {
+            runTest("analysis/analysis-api/testData/components/compileTimeConstantProvider/evaluate/incompleteCode/invalidLPARinPropertyName.kt");
+        }
+
+        @Test
         @TestMetadata("noRightOperand.kt")
         public void testNoRightOperand() throws Exception {
             runTest("analysis/analysis-api/testData/components/compileTimeConstantProvider/evaluate/incompleteCode/noRightOperand.kt");
diff --git a/analysis/analysis-api-fir/tests-gen/org/jetbrains/kotlin/analysis/api/fir/test/cases/generated/cases/components/expressionTypeProvider/FirIdeDependentAnalysisSourceModuleHLExpressionTypeTestGenerated.java b/analysis/analysis-api-fir/tests-gen/org/jetbrains/kotlin/analysis/api/fir/test/cases/generated/cases/components/expressionTypeProvider/FirIdeDependentAnalysisSourceModuleHLExpressionTypeTestGenerated.java
index 00cadc8..996d205 100644
--- a/analysis/analysis-api-fir/tests-gen/org/jetbrains/kotlin/analysis/api/fir/test/cases/generated/cases/components/expressionTypeProvider/FirIdeDependentAnalysisSourceModuleHLExpressionTypeTestGenerated.java
+++ b/analysis/analysis-api-fir/tests-gen/org/jetbrains/kotlin/analysis/api/fir/test/cases/generated/cases/components/expressionTypeProvider/FirIdeDependentAnalysisSourceModuleHLExpressionTypeTestGenerated.java
@@ -277,4 +277,26 @@
             runTest("analysis/analysis-api/testData/components/expressionTypeProvider/expressionType/assignment/readArrayElement.kt");
         }
     }
+
+    @Nested
+    @TestMetadata("analysis/analysis-api/testData/components/expressionTypeProvider/expressionType/incompleteCode")
+    @TestDataPath("$PROJECT_ROOT")
+    public class IncompleteCode {
+        @Test
+        public void testAllFilesPresentInIncompleteCode() throws Exception {
+            KtTestUtil.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("analysis/analysis-api/testData/components/expressionTypeProvider/expressionType/incompleteCode"), Pattern.compile("^(.+)\\.kt$"), null, true);
+        }
+
+        @Test
+        @TestMetadata("commaInWhenCondition.kt")
+        public void testCommaInWhenCondition() throws Exception {
+            runTest("analysis/analysis-api/testData/components/expressionTypeProvider/expressionType/incompleteCode/commaInWhenCondition.kt");
+        }
+
+        @Test
+        @TestMetadata("invalidLPARinPropertyName.kt")
+        public void testInvalidLPARinPropertyName() throws Exception {
+            runTest("analysis/analysis-api/testData/components/expressionTypeProvider/expressionType/incompleteCode/invalidLPARinPropertyName.kt");
+        }
+    }
 }
diff --git a/analysis/analysis-api-fir/tests-gen/org/jetbrains/kotlin/analysis/api/fir/test/cases/generated/cases/components/expressionTypeProvider/FirIdeNormalAnalysisSourceModuleHLExpressionTypeTestGenerated.java b/analysis/analysis-api-fir/tests-gen/org/jetbrains/kotlin/analysis/api/fir/test/cases/generated/cases/components/expressionTypeProvider/FirIdeNormalAnalysisSourceModuleHLExpressionTypeTestGenerated.java
index 4fe8a5f..1da1c63 100644
--- a/analysis/analysis-api-fir/tests-gen/org/jetbrains/kotlin/analysis/api/fir/test/cases/generated/cases/components/expressionTypeProvider/FirIdeNormalAnalysisSourceModuleHLExpressionTypeTestGenerated.java
+++ b/analysis/analysis-api-fir/tests-gen/org/jetbrains/kotlin/analysis/api/fir/test/cases/generated/cases/components/expressionTypeProvider/FirIdeNormalAnalysisSourceModuleHLExpressionTypeTestGenerated.java
@@ -277,4 +277,26 @@
             runTest("analysis/analysis-api/testData/components/expressionTypeProvider/expressionType/assignment/readArrayElement.kt");
         }
     }
+
+    @Nested
+    @TestMetadata("analysis/analysis-api/testData/components/expressionTypeProvider/expressionType/incompleteCode")
+    @TestDataPath("$PROJECT_ROOT")
+    public class IncompleteCode {
+        @Test
+        public void testAllFilesPresentInIncompleteCode() throws Exception {
+            KtTestUtil.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("analysis/analysis-api/testData/components/expressionTypeProvider/expressionType/incompleteCode"), Pattern.compile("^(.+)\\.kt$"), null, true);
+        }
+
+        @Test
+        @TestMetadata("commaInWhenCondition.kt")
+        public void testCommaInWhenCondition() throws Exception {
+            runTest("analysis/analysis-api/testData/components/expressionTypeProvider/expressionType/incompleteCode/commaInWhenCondition.kt");
+        }
+
+        @Test
+        @TestMetadata("invalidLPARinPropertyName.kt")
+        public void testInvalidLPARinPropertyName() throws Exception {
+            runTest("analysis/analysis-api/testData/components/expressionTypeProvider/expressionType/incompleteCode/invalidLPARinPropertyName.kt");
+        }
+    }
 }
diff --git a/analysis/analysis-api-impl-base/tests/org/jetbrains/kotlin/analysis/api/impl/base/test/cases/components/compileTimeConstantProvider/AbstractCompileTimeConstantEvaluatorTest.kt b/analysis/analysis-api-impl-base/tests/org/jetbrains/kotlin/analysis/api/impl/base/test/cases/components/compileTimeConstantProvider/AbstractCompileTimeConstantEvaluatorTest.kt
index 66041eb..4949cd6 100644
--- a/analysis/analysis-api-impl-base/tests/org/jetbrains/kotlin/analysis/api/impl/base/test/cases/components/compileTimeConstantProvider/AbstractCompileTimeConstantEvaluatorTest.kt
+++ b/analysis/analysis-api-impl-base/tests/org/jetbrains/kotlin/analysis/api/impl/base/test/cases/components/compileTimeConstantProvider/AbstractCompileTimeConstantEvaluatorTest.kt
@@ -12,6 +12,7 @@
 import org.jetbrains.kotlin.psi.KtExpression
 import org.jetbrains.kotlin.psi.KtFile
 import org.jetbrains.kotlin.psi.KtValueArgument
+import org.jetbrains.kotlin.psi.KtWhenConditionWithExpression
 import org.jetbrains.kotlin.test.model.TestModule
 import org.jetbrains.kotlin.test.services.TestServices
 import org.jetbrains.kotlin.test.services.assertions
@@ -22,6 +23,7 @@
         val expression = when (element) {
             is KtExpression -> element
             is KtValueArgument -> element.getArgumentExpression()
+            is KtWhenConditionWithExpression -> element.expression
             else -> null
         } ?: testServices.assertions.fail { "Unsupported expression: $element" }
         val constantValue = executeOnPooledThreadInReadAction {
diff --git a/analysis/analysis-api-impl-base/tests/org/jetbrains/kotlin/analysis/api/impl/base/test/cases/components/expressionTypeProvider/AbstractHLExpressionTypeTest.kt b/analysis/analysis-api-impl-base/tests/org/jetbrains/kotlin/analysis/api/impl/base/test/cases/components/expressionTypeProvider/AbstractHLExpressionTypeTest.kt
index 7d121e0..ac090ba 100644
--- a/analysis/analysis-api-impl-base/tests/org/jetbrains/kotlin/analysis/api/impl/base/test/cases/components/expressionTypeProvider/AbstractHLExpressionTypeTest.kt
+++ b/analysis/analysis-api-impl-base/tests/org/jetbrains/kotlin/analysis/api/impl/base/test/cases/components/expressionTypeProvider/AbstractHLExpressionTypeTest.kt
@@ -9,10 +9,7 @@
 import org.jetbrains.kotlin.analysis.test.framework.services.expressionMarkerProvider
 import org.jetbrains.kotlin.analysis.test.framework.base.AbstractAnalysisApiSingleFileTest
 import org.jetbrains.kotlin.analysis.test.framework.utils.executeOnPooledThreadInReadAction
-import org.jetbrains.kotlin.psi.KtBlockExpression
-import org.jetbrains.kotlin.psi.KtExpression
-import org.jetbrains.kotlin.psi.KtFile
-import org.jetbrains.kotlin.psi.KtValueArgument
+import org.jetbrains.kotlin.psi.*
 import org.jetbrains.kotlin.test.model.TestModule
 import org.jetbrains.kotlin.test.services.TestServices
 import org.jetbrains.kotlin.test.services.assertions
@@ -29,6 +26,7 @@
         val expression = when (selected) {
             is KtExpression -> selected
             is KtValueArgument -> selected.getArgumentExpression()
+            is KtWhenConditionWithExpression -> selected.expression
             else -> null
         } ?: error("expect an expression but got ${selected.text}")
         val type = executeOnPooledThreadInReadAction {
diff --git a/analysis/analysis-api-standalone/tests-gen/org/jetbrains/kotlin/analysis/api/standalone/fir/test/cases/generated/cases/components/compileTimeConstantProvider/FirStandaloneNormalAnalysisSourceModuleCompileTimeConstantEvaluatorTestGenerated.java b/analysis/analysis-api-standalone/tests-gen/org/jetbrains/kotlin/analysis/api/standalone/fir/test/cases/generated/cases/components/compileTimeConstantProvider/FirStandaloneNormalAnalysisSourceModuleCompileTimeConstantEvaluatorTestGenerated.java
index ebfd34b..9bac8c2 100644
--- a/analysis/analysis-api-standalone/tests-gen/org/jetbrains/kotlin/analysis/api/standalone/fir/test/cases/generated/cases/components/compileTimeConstantProvider/FirStandaloneNormalAnalysisSourceModuleCompileTimeConstantEvaluatorTestGenerated.java
+++ b/analysis/analysis-api-standalone/tests-gen/org/jetbrains/kotlin/analysis/api/standalone/fir/test/cases/generated/cases/components/compileTimeConstantProvider/FirStandaloneNormalAnalysisSourceModuleCompileTimeConstantEvaluatorTestGenerated.java
@@ -242,12 +242,24 @@
         }
 
         @Test
+        @TestMetadata("commaInWhenCondition.kt")
+        public void testCommaInWhenCondition() throws Exception {
+            runTest("analysis/analysis-api/testData/components/compileTimeConstantProvider/evaluate/incompleteCode/commaInWhenCondition.kt");
+        }
+
+        @Test
         @TestMetadata("incompleteRange.kt")
         public void testIncompleteRange() throws Exception {
             runTest("analysis/analysis-api/testData/components/compileTimeConstantProvider/evaluate/incompleteCode/incompleteRange.kt");
         }
 
         @Test
+        @TestMetadata("invalidLPARinPropertyName.kt")
+        public void testInvalidLPARinPropertyName() throws Exception {
+            runTest("analysis/analysis-api/testData/components/compileTimeConstantProvider/evaluate/incompleteCode/invalidLPARinPropertyName.kt");
+        }
+
+        @Test
         @TestMetadata("noRightOperand.kt")
         public void testNoRightOperand() throws Exception {
             runTest("analysis/analysis-api/testData/components/compileTimeConstantProvider/evaluate/incompleteCode/noRightOperand.kt");
diff --git a/analysis/analysis-api-standalone/tests-gen/org/jetbrains/kotlin/analysis/api/standalone/fir/test/cases/generated/cases/components/expressionTypeProvider/FirStandaloneNormalAnalysisSourceModuleHLExpressionTypeTestGenerated.java b/analysis/analysis-api-standalone/tests-gen/org/jetbrains/kotlin/analysis/api/standalone/fir/test/cases/generated/cases/components/expressionTypeProvider/FirStandaloneNormalAnalysisSourceModuleHLExpressionTypeTestGenerated.java
index 6947201..87fae7a 100644
--- a/analysis/analysis-api-standalone/tests-gen/org/jetbrains/kotlin/analysis/api/standalone/fir/test/cases/generated/cases/components/expressionTypeProvider/FirStandaloneNormalAnalysisSourceModuleHLExpressionTypeTestGenerated.java
+++ b/analysis/analysis-api-standalone/tests-gen/org/jetbrains/kotlin/analysis/api/standalone/fir/test/cases/generated/cases/components/expressionTypeProvider/FirStandaloneNormalAnalysisSourceModuleHLExpressionTypeTestGenerated.java
@@ -277,4 +277,26 @@
             runTest("analysis/analysis-api/testData/components/expressionTypeProvider/expressionType/assignment/readArrayElement.kt");
         }
     }
+
+    @Nested
+    @TestMetadata("analysis/analysis-api/testData/components/expressionTypeProvider/expressionType/incompleteCode")
+    @TestDataPath("$PROJECT_ROOT")
+    public class IncompleteCode {
+        @Test
+        public void testAllFilesPresentInIncompleteCode() throws Exception {
+            KtTestUtil.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("analysis/analysis-api/testData/components/expressionTypeProvider/expressionType/incompleteCode"), Pattern.compile("^(.+)\\.kt$"), null, true);
+        }
+
+        @Test
+        @TestMetadata("commaInWhenCondition.kt")
+        public void testCommaInWhenCondition() throws Exception {
+            runTest("analysis/analysis-api/testData/components/expressionTypeProvider/expressionType/incompleteCode/commaInWhenCondition.kt");
+        }
+
+        @Test
+        @TestMetadata("invalidLPARinPropertyName.kt")
+        public void testInvalidLPARinPropertyName() throws Exception {
+            runTest("analysis/analysis-api/testData/components/expressionTypeProvider/expressionType/incompleteCode/invalidLPARinPropertyName.kt");
+        }
+    }
 }
diff --git a/analysis/analysis-api/testData/components/compileTimeConstantProvider/evaluate/incompleteCode/commaInWhenCondition.descriptors.txt b/analysis/analysis-api/testData/components/compileTimeConstantProvider/evaluate/incompleteCode/commaInWhenCondition.descriptors.txt
new file mode 100644
index 0000000..8c1ec53
--- /dev/null
+++ b/analysis/analysis-api/testData/components/compileTimeConstantProvider/evaluate/incompleteCode/commaInWhenCondition.descriptors.txt
@@ -0,0 +1,9 @@
+expression: false
+
+CONSTANT_EXPRESSION_EVALUATION
+constant: false
+constantValueKind: Boolean
+
+CONSTANT_LIKE_EXPRESSION_EVALUATION
+constantLike: false
+constantLikeValueKind: Boolean
diff --git a/analysis/analysis-api/testData/components/compileTimeConstantProvider/evaluate/incompleteCode/commaInWhenCondition.kt b/analysis/analysis-api/testData/components/compileTimeConstantProvider/evaluate/incompleteCode/commaInWhenCondition.kt
new file mode 100644
index 0000000..a3ef63e
--- /dev/null
+++ b/analysis/analysis-api/testData/components/compileTimeConstantProvider/evaluate/incompleteCode/commaInWhenCondition.kt
@@ -0,0 +1,5 @@
+fun foo() {
+    when {
+        true, <expr>false</expr> -> {}
+    }
+}
\ No newline at end of file
diff --git a/analysis/analysis-api/testData/components/compileTimeConstantProvider/evaluate/incompleteCode/commaInWhenCondition.txt b/analysis/analysis-api/testData/components/compileTimeConstantProvider/evaluate/incompleteCode/commaInWhenCondition.txt
new file mode 100644
index 0000000..844652a
--- /dev/null
+++ b/analysis/analysis-api/testData/components/compileTimeConstantProvider/evaluate/incompleteCode/commaInWhenCondition.txt
@@ -0,0 +1,9 @@
+expression: false
+
+CONSTANT_EXPRESSION_EVALUATION
+constant: NOT_EVALUATED
+constantValueKind: NOT_EVALUATED
+
+CONSTANT_LIKE_EXPRESSION_EVALUATION
+constantLike: NOT_EVALUATED
+constantLikeValueKind: NOT_EVALUATED
diff --git a/analysis/analysis-api/testData/components/compileTimeConstantProvider/evaluate/incompleteCode/invalidLPARinPropertyName.kt b/analysis/analysis-api/testData/components/compileTimeConstantProvider/evaluate/incompleteCode/invalidLPARinPropertyName.kt
new file mode 100644
index 0000000..cfe411b
--- /dev/null
+++ b/analysis/analysis-api/testData/components/compileTimeConstantProvider/evaluate/incompleteCode/invalidLPARinPropertyName.kt
@@ -0,0 +1,3 @@
+class InitOrderDemo(name: String) {
+    val (firstProperty = <expr>"First property"</expr>
+}
\ No newline at end of file
diff --git a/analysis/analysis-api/testData/components/compileTimeConstantProvider/evaluate/incompleteCode/invalidLPARinPropertyName.txt b/analysis/analysis-api/testData/components/compileTimeConstantProvider/evaluate/incompleteCode/invalidLPARinPropertyName.txt
new file mode 100644
index 0000000..0da04d6
--- /dev/null
+++ b/analysis/analysis-api/testData/components/compileTimeConstantProvider/evaluate/incompleteCode/invalidLPARinPropertyName.txt
@@ -0,0 +1,9 @@
+expression: "First property"
+
+CONSTANT_EXPRESSION_EVALUATION
+constant: NOT_EVALUATED
+constantValueKind: NOT_EVALUATED
+
+CONSTANT_LIKE_EXPRESSION_EVALUATION
+constantLike: NOT_EVALUATED
+constantLikeValueKind: NOT_EVALUATED
diff --git a/analysis/analysis-api/testData/components/expressionTypeProvider/expressionType/incompleteCode/commaInWhenCondition.descriptors.txt b/analysis/analysis-api/testData/components/expressionTypeProvider/expressionType/incompleteCode/commaInWhenCondition.descriptors.txt
new file mode 100644
index 0000000..e6771e4
--- /dev/null
+++ b/analysis/analysis-api/testData/components/expressionTypeProvider/expressionType/incompleteCode/commaInWhenCondition.descriptors.txt
@@ -0,0 +1,2 @@
+expression: false
+type: kotlin.Boolean
diff --git a/analysis/analysis-api/testData/components/expressionTypeProvider/expressionType/incompleteCode/commaInWhenCondition.kt b/analysis/analysis-api/testData/components/expressionTypeProvider/expressionType/incompleteCode/commaInWhenCondition.kt
new file mode 100644
index 0000000..a3ef63e
--- /dev/null
+++ b/analysis/analysis-api/testData/components/expressionTypeProvider/expressionType/incompleteCode/commaInWhenCondition.kt
@@ -0,0 +1,5 @@
+fun foo() {
+    when {
+        true, <expr>false</expr> -> {}
+    }
+}
\ No newline at end of file
diff --git a/analysis/analysis-api/testData/components/expressionTypeProvider/expressionType/incompleteCode/commaInWhenCondition.txt b/analysis/analysis-api/testData/components/expressionTypeProvider/expressionType/incompleteCode/commaInWhenCondition.txt
new file mode 100644
index 0000000..4a5532e
--- /dev/null
+++ b/analysis/analysis-api/testData/components/expressionTypeProvider/expressionType/incompleteCode/commaInWhenCondition.txt
@@ -0,0 +1,2 @@
+expression: false
+type: null
diff --git a/analysis/analysis-api/testData/components/expressionTypeProvider/expressionType/incompleteCode/invalidLPARinPropertyName.kt b/analysis/analysis-api/testData/components/expressionTypeProvider/expressionType/incompleteCode/invalidLPARinPropertyName.kt
new file mode 100644
index 0000000..cfe411b
--- /dev/null
+++ b/analysis/analysis-api/testData/components/expressionTypeProvider/expressionType/incompleteCode/invalidLPARinPropertyName.kt
@@ -0,0 +1,3 @@
+class InitOrderDemo(name: String) {
+    val (firstProperty = <expr>"First property"</expr>
+}
\ No newline at end of file
diff --git a/analysis/analysis-api/testData/components/expressionTypeProvider/expressionType/incompleteCode/invalidLPARinPropertyName.txt b/analysis/analysis-api/testData/components/expressionTypeProvider/expressionType/incompleteCode/invalidLPARinPropertyName.txt
new file mode 100644
index 0000000..fbe3a58
--- /dev/null
+++ b/analysis/analysis-api/testData/components/expressionTypeProvider/expressionType/incompleteCode/invalidLPARinPropertyName.txt
@@ -0,0 +1,2 @@
+expression: "First property"
+type: kotlin.Unit
diff --git a/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/api/InvalidFirElementTypeException.kt b/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/api/InvalidFirElementTypeException.kt
index 0e7a9c2..a6f33f0 100644
--- a/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/api/InvalidFirElementTypeException.kt
+++ b/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/api/InvalidFirElementTypeException.kt
@@ -52,11 +52,38 @@
     }
 }
 
-
 fun throwUnexpectedFirElementError(
     firElement: Any?,
     ktElement: KtElement? = null,
     vararg expectedFirClasses: KClass<*>
 ): Nothing {
     throw InvalidFirElementTypeException(firElement, ktElement, expectedFirClasses.toList())
+}
+
+fun throwUnexpectedFirElementErrorWithExceptions(
+    firElement: Any?,
+    ktElement: KtElement? = null,
+    exceptionalFirClasses: List<KClass<*>> = emptyList(),
+    expectedFirClasses: List<KClass<*>> = emptyList(),
+): Nothing? {
+    // For invalid code, the closest element is returned, e.g.,
+    // ```
+    // when {
+    //   true, false -> {}
+    // }
+    // ```
+    // `false` does not have a corresponding elements on the FIR side and hence the containing `FirWhenBranch` is returned.
+    //
+    // ```
+    // class InitOrderDemo(name: String) {
+    //   val (firstProperty = "First property"
+    // }
+    // ```
+    // "First Property" is mapped to its containing `FirRegularClass`.
+    //
+    // In these cases, some providers can simply report null since FIR does not know about it.
+    exceptionalFirClasses.forEach { exceptional ->
+        if (exceptional.isInstance(firElement)) return null
+    }
+    throw InvalidFirElementTypeException(firElement, ktElement, expectedFirClasses)
 }
\ No newline at end of file