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 3721757b16f..9b1ec5d96e4 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 @@ -231,4 +231,38 @@ public class Fe10IdeNormalAnalysisSourceModuleCompileTimeConstantEvaluatorTestGe public void testString_trimIndent() throws Exception { runTest("analysis/analysis-api/testData/components/compileTimeConstantProvider/evaluate/string_trimIndent.kt"); } + + @Nested + @TestMetadata("analysis/analysis-api/testData/components/compileTimeConstantProvider/evaluate/incompleteCode") + @TestDataPath("$PROJECT_ROOT") + public class IncompleteCode { + @Test + public void testAllFilesPresentInIncompleteCode() throws Exception { + KtTestUtil.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("analysis/analysis-api/testData/components/compileTimeConstantProvider/evaluate/incompleteCode"), Pattern.compile("^(.+)\\.kt$"), null, true); + } + + @Test + @TestMetadata("incompleteRange.kt") + public void testIncompleteRange() throws Exception { + runTest("analysis/analysis-api/testData/components/compileTimeConstantProvider/evaluate/incompleteCode/incompleteRange.kt"); + } + + @Test + @TestMetadata("noRightOperand.kt") + public void testNoRightOperand() throws Exception { + runTest("analysis/analysis-api/testData/components/compileTimeConstantProvider/evaluate/incompleteCode/noRightOperand.kt"); + } + + @Test + @TestMetadata("noRightOperandLong.kt") + public void testNoRightOperandLong() throws Exception { + runTest("analysis/analysis-api/testData/components/compileTimeConstantProvider/evaluate/incompleteCode/noRightOperandLong.kt"); + } + + @Test + @TestMetadata("noRightOperandUnsignedLong.kt") + public void testNoRightOperandUnsignedLong() throws Exception { + runTest("analysis/analysis-api/testData/components/compileTimeConstantProvider/evaluate/incompleteCode/noRightOperandUnsignedLong.kt"); + } + } } diff --git a/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/evaluate/FirCompileTimeConstantEvaluator.kt b/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/evaluate/FirCompileTimeConstantEvaluator.kt index 3305290fc57..bd6f3f11f1e 100644 --- a/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/evaluate/FirCompileTimeConstantEvaluator.kt +++ b/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/evaluate/FirCompileTimeConstantEvaluator.kt @@ -7,8 +7,8 @@ package org.jetbrains.kotlin.analysis.api.fir.evaluate import org.jetbrains.kotlin.KtSourceElement import org.jetbrains.kotlin.analysis.api.base.KtConstantValue -import org.jetbrains.kotlin.analysis.api.base.KtConstantValueFactory import org.jetbrains.kotlin.analysis.api.components.KtConstantEvaluationMode +import org.jetbrains.kotlin.analysis.low.level.api.fir.util.errorWithFirSpecificEntries import org.jetbrains.kotlin.fir.FirElement import org.jetbrains.kotlin.fir.declarations.FirCallableDeclaration import org.jetbrains.kotlin.fir.declarations.FirResolvePhase @@ -110,11 +110,42 @@ internal object FirCompileTimeConstantEvaluator { ): KtConstantValue? { val evaluated = evaluate(fir, mode) ?: return null - val ktConstantValue = KtConstantValueFactory.createConstantValue(evaluated.value, evaluated.psi as? KtElement) ?: return null - check(ktConstantValue.constantValueKind == evaluated.kind) { - "Expected ${evaluated.kind} for created KtConstantValue but ${ktConstantValue.constantValueKind} found" + val value = evaluated.value + val psi = evaluated.psi as? KtElement + return when (evaluated.kind) { + ConstantValueKind.Byte -> KtConstantValue.KtByteConstantValue(value as Byte, psi) + ConstantValueKind.Int -> KtConstantValue.KtIntConstantValue(value as Int, psi) + ConstantValueKind.Long -> KtConstantValue.KtLongConstantValue(value as Long, psi) + ConstantValueKind.Short -> KtConstantValue.KtShortConstantValue(value as Short, psi) + + ConstantValueKind.UnsignedByte -> KtConstantValue.KtUnsignedByteConstantValue(value as UByte, psi) + ConstantValueKind.UnsignedInt -> KtConstantValue.KtUnsignedIntConstantValue(value as UInt, psi) + ConstantValueKind.UnsignedLong -> KtConstantValue.KtUnsignedLongConstantValue(value as ULong, psi) + ConstantValueKind.UnsignedShort -> KtConstantValue.KtUnsignedShortConstantValue(value as UShort, psi) + + ConstantValueKind.Double -> KtConstantValue.KtDoubleConstantValue(value as Double, psi) + ConstantValueKind.Float -> KtConstantValue.KtFloatConstantValue(value as Float, psi) + + ConstantValueKind.Boolean -> KtConstantValue.KtBooleanConstantValue(value as Boolean, psi) + ConstantValueKind.Char -> KtConstantValue.KtCharConstantValue(value as Char, psi) + ConstantValueKind.String -> KtConstantValue.KtStringConstantValue(value as String, psi) + ConstantValueKind.Null -> KtConstantValue.KtNullConstantValue(psi) + + + ConstantValueKind.IntegerLiteral -> { + val long = value as Long + if (Int.MIN_VALUE < long && long < Int.MAX_VALUE) KtConstantValue.KtIntConstantValue(long.toInt(), psi) + else KtConstantValue.KtLongConstantValue(long, psi) + } + + ConstantValueKind.UnsignedIntegerLiteral -> { + val long = value as ULong + if (UInt.MIN_VALUE < long && long < UInt.MAX_VALUE) KtConstantValue.KtUnsignedIntConstantValue(long.toUInt(), psi) + else KtConstantValue.KtUnsignedLongConstantValue(long, psi) + } + + ConstantValueKind.Error -> errorWithFirSpecificEntries("Should not be possible to get from FIR tree", fir = fir) } - return ktConstantValue } private fun FirConstExpression<*>.adaptToConstKind(): FirConstExpression<*> { 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 5c13a174303..7faea64abd1 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 @@ -231,4 +231,38 @@ public class FirIdeDependentAnalysisSourceModuleCompileTimeConstantEvaluatorTest public void testString_trimIndent() throws Exception { runTest("analysis/analysis-api/testData/components/compileTimeConstantProvider/evaluate/string_trimIndent.kt"); } + + @Nested + @TestMetadata("analysis/analysis-api/testData/components/compileTimeConstantProvider/evaluate/incompleteCode") + @TestDataPath("$PROJECT_ROOT") + public class IncompleteCode { + @Test + public void testAllFilesPresentInIncompleteCode() throws Exception { + KtTestUtil.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("analysis/analysis-api/testData/components/compileTimeConstantProvider/evaluate/incompleteCode"), Pattern.compile("^(.+)\\.kt$"), null, true); + } + + @Test + @TestMetadata("incompleteRange.kt") + public void testIncompleteRange() throws Exception { + runTest("analysis/analysis-api/testData/components/compileTimeConstantProvider/evaluate/incompleteCode/incompleteRange.kt"); + } + + @Test + @TestMetadata("noRightOperand.kt") + public void testNoRightOperand() throws Exception { + runTest("analysis/analysis-api/testData/components/compileTimeConstantProvider/evaluate/incompleteCode/noRightOperand.kt"); + } + + @Test + @TestMetadata("noRightOperandLong.kt") + public void testNoRightOperandLong() throws Exception { + runTest("analysis/analysis-api/testData/components/compileTimeConstantProvider/evaluate/incompleteCode/noRightOperandLong.kt"); + } + + @Test + @TestMetadata("noRightOperandUnsignedLong.kt") + public void testNoRightOperandUnsignedLong() throws Exception { + runTest("analysis/analysis-api/testData/components/compileTimeConstantProvider/evaluate/incompleteCode/noRightOperandUnsignedLong.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 e3bf1330348..f0e3302d3c9 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 @@ -231,4 +231,38 @@ public class FirIdeNormalAnalysisSourceModuleCompileTimeConstantEvaluatorTestGen public void testString_trimIndent() throws Exception { runTest("analysis/analysis-api/testData/components/compileTimeConstantProvider/evaluate/string_trimIndent.kt"); } + + @Nested + @TestMetadata("analysis/analysis-api/testData/components/compileTimeConstantProvider/evaluate/incompleteCode") + @TestDataPath("$PROJECT_ROOT") + public class IncompleteCode { + @Test + public void testAllFilesPresentInIncompleteCode() throws Exception { + KtTestUtil.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("analysis/analysis-api/testData/components/compileTimeConstantProvider/evaluate/incompleteCode"), Pattern.compile("^(.+)\\.kt$"), null, true); + } + + @Test + @TestMetadata("incompleteRange.kt") + public void testIncompleteRange() throws Exception { + runTest("analysis/analysis-api/testData/components/compileTimeConstantProvider/evaluate/incompleteCode/incompleteRange.kt"); + } + + @Test + @TestMetadata("noRightOperand.kt") + public void testNoRightOperand() throws Exception { + runTest("analysis/analysis-api/testData/components/compileTimeConstantProvider/evaluate/incompleteCode/noRightOperand.kt"); + } + + @Test + @TestMetadata("noRightOperandLong.kt") + public void testNoRightOperandLong() throws Exception { + runTest("analysis/analysis-api/testData/components/compileTimeConstantProvider/evaluate/incompleteCode/noRightOperandLong.kt"); + } + + @Test + @TestMetadata("noRightOperandUnsignedLong.kt") + public void testNoRightOperandUnsignedLong() throws Exception { + runTest("analysis/analysis-api/testData/components/compileTimeConstantProvider/evaluate/incompleteCode/noRightOperandUnsignedLong.kt"); + } + } } 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 8e9c56311ec..ebfd34b1b93 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 @@ -231,4 +231,38 @@ public class FirStandaloneNormalAnalysisSourceModuleCompileTimeConstantEvaluator public void testString_trimIndent() throws Exception { runTest("analysis/analysis-api/testData/components/compileTimeConstantProvider/evaluate/string_trimIndent.kt"); } + + @Nested + @TestMetadata("analysis/analysis-api/testData/components/compileTimeConstantProvider/evaluate/incompleteCode") + @TestDataPath("$PROJECT_ROOT") + public class IncompleteCode { + @Test + public void testAllFilesPresentInIncompleteCode() throws Exception { + KtTestUtil.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("analysis/analysis-api/testData/components/compileTimeConstantProvider/evaluate/incompleteCode"), Pattern.compile("^(.+)\\.kt$"), null, true); + } + + @Test + @TestMetadata("incompleteRange.kt") + public void testIncompleteRange() throws Exception { + runTest("analysis/analysis-api/testData/components/compileTimeConstantProvider/evaluate/incompleteCode/incompleteRange.kt"); + } + + @Test + @TestMetadata("noRightOperand.kt") + public void testNoRightOperand() throws Exception { + runTest("analysis/analysis-api/testData/components/compileTimeConstantProvider/evaluate/incompleteCode/noRightOperand.kt"); + } + + @Test + @TestMetadata("noRightOperandLong.kt") + public void testNoRightOperandLong() throws Exception { + runTest("analysis/analysis-api/testData/components/compileTimeConstantProvider/evaluate/incompleteCode/noRightOperandLong.kt"); + } + + @Test + @TestMetadata("noRightOperandUnsignedLong.kt") + public void testNoRightOperandUnsignedLong() throws Exception { + runTest("analysis/analysis-api/testData/components/compileTimeConstantProvider/evaluate/incompleteCode/noRightOperandUnsignedLong.kt"); + } + } } diff --git a/analysis/analysis-api/testData/components/compileTimeConstantProvider/evaluate/incompleteCode/incompleteRange.kt b/analysis/analysis-api/testData/components/compileTimeConstantProvider/evaluate/incompleteCode/incompleteRange.kt new file mode 100644 index 00000000000..3fb9b5d3f88 --- /dev/null +++ b/analysis/analysis-api/testData/components/compileTimeConstantProvider/evaluate/incompleteCode/incompleteRange.kt @@ -0,0 +1,4 @@ +fun main(args: Array) { + for (i in 1..) {} + +} diff --git a/analysis/analysis-api/testData/components/compileTimeConstantProvider/evaluate/incompleteCode/incompleteRange.txt b/analysis/analysis-api/testData/components/compileTimeConstantProvider/evaluate/incompleteCode/incompleteRange.txt new file mode 100644 index 00000000000..ef2899c8865 --- /dev/null +++ b/analysis/analysis-api/testData/components/compileTimeConstantProvider/evaluate/incompleteCode/incompleteRange.txt @@ -0,0 +1,9 @@ +expression: 1 + +CONSTANT_EXPRESSION_EVALUATION +constant: 1 +constantValueKind: Int + +CONSTANT_LIKE_EXPRESSION_EVALUATION +constantLike: 1 +constantLikeValueKind: Int diff --git a/analysis/analysis-api/testData/components/compileTimeConstantProvider/evaluate/incompleteCode/noRightOperand.kt b/analysis/analysis-api/testData/components/compileTimeConstantProvider/evaluate/incompleteCode/noRightOperand.kt new file mode 100644 index 00000000000..dad816c7a29 --- /dev/null +++ b/analysis/analysis-api/testData/components/compileTimeConstantProvider/evaluate/incompleteCode/noRightOperand.kt @@ -0,0 +1,2 @@ +const val c = 1 + + diff --git a/analysis/analysis-api/testData/components/compileTimeConstantProvider/evaluate/incompleteCode/noRightOperand.txt b/analysis/analysis-api/testData/components/compileTimeConstantProvider/evaluate/incompleteCode/noRightOperand.txt new file mode 100644 index 00000000000..ef2899c8865 --- /dev/null +++ b/analysis/analysis-api/testData/components/compileTimeConstantProvider/evaluate/incompleteCode/noRightOperand.txt @@ -0,0 +1,9 @@ +expression: 1 + +CONSTANT_EXPRESSION_EVALUATION +constant: 1 +constantValueKind: Int + +CONSTANT_LIKE_EXPRESSION_EVALUATION +constantLike: 1 +constantLikeValueKind: Int diff --git a/analysis/analysis-api/testData/components/compileTimeConstantProvider/evaluate/incompleteCode/noRightOperandLong.kt b/analysis/analysis-api/testData/components/compileTimeConstantProvider/evaluate/incompleteCode/noRightOperandLong.kt new file mode 100644 index 00000000000..7d1ddbf4e80 --- /dev/null +++ b/analysis/analysis-api/testData/components/compileTimeConstantProvider/evaluate/incompleteCode/noRightOperandLong.kt @@ -0,0 +1,2 @@ +const val c = 2147483648 + + diff --git a/analysis/analysis-api/testData/components/compileTimeConstantProvider/evaluate/incompleteCode/noRightOperandLong.txt b/analysis/analysis-api/testData/components/compileTimeConstantProvider/evaluate/incompleteCode/noRightOperandLong.txt new file mode 100644 index 00000000000..e02d5c591a2 --- /dev/null +++ b/analysis/analysis-api/testData/components/compileTimeConstantProvider/evaluate/incompleteCode/noRightOperandLong.txt @@ -0,0 +1,9 @@ +expression: 2147483648 + +CONSTANT_EXPRESSION_EVALUATION +constant: 2147483648 +constantValueKind: Long + +CONSTANT_LIKE_EXPRESSION_EVALUATION +constantLike: 2147483648 +constantLikeValueKind: Long diff --git a/analysis/analysis-api/testData/components/compileTimeConstantProvider/evaluate/incompleteCode/noRightOperandUnsignedLong.descriptors.txt b/analysis/analysis-api/testData/components/compileTimeConstantProvider/evaluate/incompleteCode/noRightOperandUnsignedLong.descriptors.txt new file mode 100644 index 00000000000..70aa29404b4 --- /dev/null +++ b/analysis/analysis-api/testData/components/compileTimeConstantProvider/evaluate/incompleteCode/noRightOperandUnsignedLong.descriptors.txt @@ -0,0 +1,9 @@ +expression: 4294967296u + +CONSTANT_EXPRESSION_EVALUATION +constant: error("Type cannot be resolved. Please make sure you have the required dependencies for unsigned types in the classpath") +constantValueKind: Error + +CONSTANT_LIKE_EXPRESSION_EVALUATION +constantLike: error("Type cannot be resolved. Please make sure you have the required dependencies for unsigned types in the classpath") +constantLikeValueKind: Error diff --git a/analysis/analysis-api/testData/components/compileTimeConstantProvider/evaluate/incompleteCode/noRightOperandUnsignedLong.kt b/analysis/analysis-api/testData/components/compileTimeConstantProvider/evaluate/incompleteCode/noRightOperandUnsignedLong.kt new file mode 100644 index 00000000000..954a705017a --- /dev/null +++ b/analysis/analysis-api/testData/components/compileTimeConstantProvider/evaluate/incompleteCode/noRightOperandUnsignedLong.kt @@ -0,0 +1,2 @@ +const val c = 4294967296u + + diff --git a/analysis/analysis-api/testData/components/compileTimeConstantProvider/evaluate/incompleteCode/noRightOperandUnsignedLong.txt b/analysis/analysis-api/testData/components/compileTimeConstantProvider/evaluate/incompleteCode/noRightOperandUnsignedLong.txt new file mode 100644 index 00000000000..e0f61a4a941 --- /dev/null +++ b/analysis/analysis-api/testData/components/compileTimeConstantProvider/evaluate/incompleteCode/noRightOperandUnsignedLong.txt @@ -0,0 +1,9 @@ +expression: 4294967296u + +CONSTANT_EXPRESSION_EVALUATION +constant: 4294967296uL +constantValueKind: ULong + +CONSTANT_LIKE_EXPRESSION_EVALUATION +constantLike: 4294967296uL +constantLikeValueKind: ULong