diff --git a/analysis/analysis-api-fe10/tests/org/jetbrains/kotlin/analysis/api/fe10/components/compileTimeConstantProvider/Fe10CompileTimeConstantEvaluatorTestGenerated.java b/analysis/analysis-api-fe10/tests/org/jetbrains/kotlin/analysis/api/fe10/components/compileTimeConstantProvider/Fe10CompileTimeConstantEvaluatorTestGenerated.java index c6e81755994..fc874419f10 100644 --- a/analysis/analysis-api-fe10/tests/org/jetbrains/kotlin/analysis/api/fe10/components/compileTimeConstantProvider/Fe10CompileTimeConstantEvaluatorTestGenerated.java +++ b/analysis/analysis-api-fe10/tests/org/jetbrains/kotlin/analysis/api/fe10/components/compileTimeConstantProvider/Fe10CompileTimeConstantEvaluatorTestGenerated.java @@ -34,6 +34,12 @@ public class Fe10CompileTimeConstantEvaluatorTestGenerated extends AbstractCompi KtTestUtil.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("analysis/analysis-api/testData/components/compileTimeConstantProvider/evaluate"), Pattern.compile("^(.+)\\.kt$"), null, true); } + @Test + @TestMetadata("binaryExpressionWithString.kt") + public void testBinaryExpressionWithString() throws Exception { + runTest("analysis/analysis-api/testData/components/compileTimeConstantProvider/evaluate/binaryExpressionWithString.kt"); + } + @Test @TestMetadata("propertyInit_Byte.kt") public void testPropertyInit_Byte() throws Exception { 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 c6e95ef5280..9a96f620d1c 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 @@ -115,12 +115,15 @@ internal object FirCompileTimeConstantEvaluator { // Unary operators private fun FirConstExpression<*>.evaluate(function: FirSimpleFunction): FirConstExpression<*>? { if (value == null) return null - return evalUnaryOp( - function.name.asString(), - kind.toCompileTimeType(), - kind.convertToNumber(value as? Number)!! - )?.let { - it.toConstantValueKind().toConstExpression(source, it) + // TODO: there are a couple operations on String, such as .length and .toString + return kind.convertToNumber(value as? Number)?.let { opr -> + evalUnaryOp( + function.name.asString(), + kind.toCompileTimeType(), + opr + )?.let { + it.toConstantValueKind().toConstExpression(source, it) + } } } @@ -130,14 +133,19 @@ internal object FirCompileTimeConstantEvaluator { other: FirConstExpression<*> ): FirConstExpression<*>? { if (value == null || other.value == null) return null - return evalBinaryOp( - function.name.asString(), - kind.toCompileTimeType(), - kind.convertToNumber(value as? Number)!!, - other.kind.toCompileTimeType(), - other.kind.convertToNumber(other.value as? Number)!! - )?.let { - it.toConstantValueKind().toConstExpression(source, it) + // TODO: there are a couple operations on Strings, such as .compareTo, .equals, or .plus + return kind.convertToNumber(value as? Number)?.let { opr1 -> + other.kind.convertToNumber(other.value as? Number)?.let { opr2 -> + evalBinaryOp( + function.name.asString(), + kind.toCompileTimeType(), + opr1, + other.kind.toCompileTimeType(), + opr2 + )?.let { + it.toConstantValueKind().toConstExpression(source, it) + } + } } } diff --git a/analysis/analysis-api-fir/tests/org/jetbrains/kotlin/analysis/api/fir/components/compileTimeConstantProvider/FirCompileTimeConstantEvaluatorTestGenerated.java b/analysis/analysis-api-fir/tests/org/jetbrains/kotlin/analysis/api/fir/components/compileTimeConstantProvider/FirCompileTimeConstantEvaluatorTestGenerated.java index 2e311521547..eb226ccf41d 100644 --- a/analysis/analysis-api-fir/tests/org/jetbrains/kotlin/analysis/api/fir/components/compileTimeConstantProvider/FirCompileTimeConstantEvaluatorTestGenerated.java +++ b/analysis/analysis-api-fir/tests/org/jetbrains/kotlin/analysis/api/fir/components/compileTimeConstantProvider/FirCompileTimeConstantEvaluatorTestGenerated.java @@ -34,6 +34,12 @@ public class FirCompileTimeConstantEvaluatorTestGenerated extends AbstractCompil KtTestUtil.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("analysis/analysis-api/testData/components/compileTimeConstantProvider/evaluate"), Pattern.compile("^(.+)\\.kt$"), null, true); } + @Test + @TestMetadata("binaryExpressionWithString.kt") + public void testBinaryExpressionWithString() throws Exception { + runTest("analysis/analysis-api/testData/components/compileTimeConstantProvider/evaluate/binaryExpressionWithString.kt"); + } + @Test @TestMetadata("propertyInit_Byte.kt") public void testPropertyInit_Byte() throws Exception { diff --git a/analysis/analysis-api/testData/components/compileTimeConstantProvider/evaluate/binaryExpressionWithString.kt b/analysis/analysis-api/testData/components/compileTimeConstantProvider/evaluate/binaryExpressionWithString.kt new file mode 100644 index 00000000000..f2667afddd6 --- /dev/null +++ b/analysis/analysis-api/testData/components/compileTimeConstantProvider/evaluate/binaryExpressionWithString.kt @@ -0,0 +1,3 @@ +fun box(msg: String): String { + return "message" + msg +} diff --git a/analysis/analysis-api/testData/components/compileTimeConstantProvider/evaluate/binaryExpressionWithString.txt b/analysis/analysis-api/testData/components/compileTimeConstantProvider/evaluate/binaryExpressionWithString.txt new file mode 100644 index 00000000000..77c6bb29e54 --- /dev/null +++ b/analysis/analysis-api/testData/components/compileTimeConstantProvider/evaluate/binaryExpressionWithString.txt @@ -0,0 +1,3 @@ +expression: "message" + msg +constant: NOT_EVALUATED +constantValueKind: NOT_EVALUATED