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