diff --git a/analysis/analysis-api-fe10/src/org/jetbrains/kotlin/analysis/api/descriptors/components/KtFe10CompileTimeConstantProvider.kt b/analysis/analysis-api-fe10/src/org/jetbrains/kotlin/analysis/api/descriptors/components/KtFe10CompileTimeConstantProvider.kt
index 06b95615c7d..2d4bbf1bae4 100644
--- a/analysis/analysis-api-fe10/src/org/jetbrains/kotlin/analysis/api/descriptors/components/KtFe10CompileTimeConstantProvider.kt
+++ b/analysis/analysis-api-fe10/src/org/jetbrains/kotlin/analysis/api/descriptors/components/KtFe10CompileTimeConstantProvider.kt
@@ -9,10 +9,13 @@ import org.jetbrains.kotlin.analysis.api.components.KtCompileTimeConstantProvide
import org.jetbrains.kotlin.analysis.api.descriptors.KtFe10AnalysisSession
import org.jetbrains.kotlin.analysis.api.descriptors.components.base.Fe10KtAnalysisSessionComponent
import org.jetbrains.kotlin.analysis.api.descriptors.symbols.descriptorBased.base.toKtConstantValue
-import org.jetbrains.kotlin.analysis.api.annotations.KtAnnotationValue
import org.jetbrains.kotlin.analysis.api.base.KtConstantValue
+import org.jetbrains.kotlin.analysis.api.components.KtConstantEvaluationMode
import org.jetbrains.kotlin.analysis.api.tokens.ValidityToken
+import org.jetbrains.kotlin.descriptors.PropertyDescriptor
import org.jetbrains.kotlin.psi.KtExpression
+import org.jetbrains.kotlin.psi.KtNameReferenceExpression
+import org.jetbrains.kotlin.resolve.BindingContext
import org.jetbrains.kotlin.resolve.constants.evaluate.ConstantExpressionEvaluator
import org.jetbrains.kotlin.types.TypeUtils
@@ -22,8 +25,23 @@ internal class KtFe10CompileTimeConstantProvider(
override val token: ValidityToken
get() = analysisSession.token
- override fun evaluate(expression: KtExpression): KtConstantValue? {
+ override fun evaluate(
+ expression: KtExpression,
+ mode: KtConstantEvaluationMode,
+ ): KtConstantValue? {
val bindingContext = analysisContext.analyze(expression)
+
+ if (mode == KtConstantEvaluationMode.CONSTANT_EXPRESSION_EVALUATION) {
+ // TODO: how to _not_ evaluate composite expression with a non-const property?
+ // TODO: how to _not_ evaluate expressions with a compilation error, e.g., uninitialized property access
+ when (expression) {
+ is KtNameReferenceExpression -> {
+ val reference = bindingContext[BindingContext.REFERENCE_TARGET, expression]
+ if (reference is PropertyDescriptor && !reference.isConst) return null
+ }
+ }
+ }
+
val constant = ConstantExpressionEvaluator.getPossiblyErrorConstant(expression, bindingContext)
return constant?.toConstantValue(TypeUtils.NO_EXPECTED_TYPE)?.toKtConstantValue()
}
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/Fe10CompileTimeConstantEvaluatorConstantLikeTestGenerated.java
similarity index 67%
rename from analysis/analysis-api-fe10/tests/org/jetbrains/kotlin/analysis/api/fe10/components/compileTimeConstantProvider/Fe10CompileTimeConstantEvaluatorTestGenerated.java
rename to analysis/analysis-api-fe10/tests/org/jetbrains/kotlin/analysis/api/fe10/components/compileTimeConstantProvider/Fe10CompileTimeConstantEvaluatorConstantLikeTestGenerated.java
index 1543a5346bc..a3312d9c382 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/Fe10CompileTimeConstantEvaluatorConstantLikeTestGenerated.java
@@ -10,7 +10,7 @@ import org.jetbrains.kotlin.test.util.KtTestUtil;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.kotlin.analysis.api.impl.barebone.test.FrontendApiTestConfiguratorService;
import org.jetbrains.kotlin.analysis.api.descriptors.test.KtFe10FrontendApiTestConfiguratorService;
-import org.jetbrains.kotlin.analysis.api.impl.base.test.components.compileTimeConstantProvider.AbstractCompileTimeConstantEvaluatorTest;
+import org.jetbrains.kotlin.analysis.api.impl.base.test.components.compileTimeConstantProvider.AbstractCompileTimeConstantEvaluatorConstantLikeTest;
import org.jetbrains.kotlin.test.TestMetadata;
import org.junit.jupiter.api.Nested;
import org.junit.jupiter.api.Test;
@@ -20,9 +20,9 @@ import java.util.regex.Pattern;
/** This class is generated by {@link GenerateNewCompilerTests.kt}. DO NOT MODIFY MANUALLY */
@SuppressWarnings("all")
-@TestMetadata("analysis/analysis-api/testData/components/compileTimeConstantProvider/evaluate")
+@TestMetadata("analysis/analysis-api/testData/components/compileTimeConstantProvider/evaluate_constantLike")
@TestDataPath("$PROJECT_ROOT")
-public class Fe10CompileTimeConstantEvaluatorTestGenerated extends AbstractCompileTimeConstantEvaluatorTest {
+public class Fe10CompileTimeConstantEvaluatorConstantLikeTestGenerated extends AbstractCompileTimeConstantEvaluatorConstantLikeTest {
@NotNull
@Override
public FrontendApiTestConfiguratorService getConfigurator() {
@@ -30,97 +30,109 @@ public class Fe10CompileTimeConstantEvaluatorTestGenerated extends AbstractCompi
}
@Test
- public void testAllFilesPresentInEvaluate() throws Exception {
- KtTestUtil.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("analysis/analysis-api/testData/components/compileTimeConstantProvider/evaluate"), Pattern.compile("^(.+)\\.kt$"), null, true);
+ public void testAllFilesPresentInEvaluate_constantLike() throws Exception {
+ KtTestUtil.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("analysis/analysis-api/testData/components/compileTimeConstantProvider/evaluate_constantLike"), Pattern.compile("^(.+)\\.kt$"), null, true);
}
@Test
@TestMetadata("binaryExpressionWithString.kt")
public void testBinaryExpressionWithString() throws Exception {
- runTest("analysis/analysis-api/testData/components/compileTimeConstantProvider/evaluate/binaryExpressionWithString.kt");
+ runTest("analysis/analysis-api/testData/components/compileTimeConstantProvider/evaluate_constantLike/binaryExpressionWithString.kt");
}
@Test
@TestMetadata("namedReference_const.kt")
public void testNamedReference_const() throws Exception {
- runTest("analysis/analysis-api/testData/components/compileTimeConstantProvider/evaluate/namedReference_const.kt");
+ runTest("analysis/analysis-api/testData/components/compileTimeConstantProvider/evaluate_constantLike/namedReference_const.kt");
}
@Test
@TestMetadata("namedReference_val.kt")
public void testNamedReference_val() throws Exception {
- runTest("analysis/analysis-api/testData/components/compileTimeConstantProvider/evaluate/namedReference_val.kt");
+ runTest("analysis/analysis-api/testData/components/compileTimeConstantProvider/evaluate_constantLike/namedReference_val.kt");
}
@Test
@TestMetadata("namedReference_var.kt")
public void testNamedReference_var() throws Exception {
- runTest("analysis/analysis-api/testData/components/compileTimeConstantProvider/evaluate/namedReference_var.kt");
+ runTest("analysis/analysis-api/testData/components/compileTimeConstantProvider/evaluate_constantLike/namedReference_var.kt");
}
@Test
@TestMetadata("propertyInCompanionObject.kt")
public void testPropertyInCompanionObject() throws Exception {
- runTest("analysis/analysis-api/testData/components/compileTimeConstantProvider/evaluate/propertyInCompanionObject.kt");
+ runTest("analysis/analysis-api/testData/components/compileTimeConstantProvider/evaluate_constantLike/propertyInCompanionObject.kt");
}
@Test
@TestMetadata("propertyInCompanionObject_indirect.kt")
public void testPropertyInCompanionObject_indirect() throws Exception {
- runTest("analysis/analysis-api/testData/components/compileTimeConstantProvider/evaluate/propertyInCompanionObject_indirect.kt");
+ runTest("analysis/analysis-api/testData/components/compileTimeConstantProvider/evaluate_constantLike/propertyInCompanionObject_indirect.kt");
}
@Test
@TestMetadata("propertyInCompanionObject_indirect_twice.kt")
public void testPropertyInCompanionObject_indirect_twice() throws Exception {
- runTest("analysis/analysis-api/testData/components/compileTimeConstantProvider/evaluate/propertyInCompanionObject_indirect_twice.kt");
+ runTest("analysis/analysis-api/testData/components/compileTimeConstantProvider/evaluate_constantLike/propertyInCompanionObject_indirect_twice.kt");
}
@Test
@TestMetadata("propertyInit_Byte.kt")
public void testPropertyInit_Byte() throws Exception {
- runTest("analysis/analysis-api/testData/components/compileTimeConstantProvider/evaluate/propertyInit_Byte.kt");
+ runTest("analysis/analysis-api/testData/components/compileTimeConstantProvider/evaluate_constantLike/propertyInit_Byte.kt");
+ }
+
+ @Test
+ @TestMetadata("propertyInit_DivByOtherProperty_const.kt")
+ public void testPropertyInit_DivByOtherProperty_const() throws Exception {
+ runTest("analysis/analysis-api/testData/components/compileTimeConstantProvider/evaluate_constantLike/propertyInit_DivByOtherProperty_const.kt");
+ }
+
+ @Test
+ @TestMetadata("propertyInit_DivByOtherProperty_val.kt")
+ public void testPropertyInit_DivByOtherProperty_val() throws Exception {
+ runTest("analysis/analysis-api/testData/components/compileTimeConstantProvider/evaluate_constantLike/propertyInit_DivByOtherProperty_val.kt");
}
@Test
@TestMetadata("propertyInit_DivByZero.kt")
public void testPropertyInit_DivByZero() throws Exception {
- runTest("analysis/analysis-api/testData/components/compileTimeConstantProvider/evaluate/propertyInit_DivByZero.kt");
+ runTest("analysis/analysis-api/testData/components/compileTimeConstantProvider/evaluate_constantLike/propertyInit_DivByZero.kt");
}
@Test
@TestMetadata("propertyInit_Double.kt")
public void testPropertyInit_Double() throws Exception {
- runTest("analysis/analysis-api/testData/components/compileTimeConstantProvider/evaluate/propertyInit_Double.kt");
+ runTest("analysis/analysis-api/testData/components/compileTimeConstantProvider/evaluate_constantLike/propertyInit_Double.kt");
}
@Test
@TestMetadata("propertyInit_Float.kt")
public void testPropertyInit_Float() throws Exception {
- runTest("analysis/analysis-api/testData/components/compileTimeConstantProvider/evaluate/propertyInit_Float.kt");
+ runTest("analysis/analysis-api/testData/components/compileTimeConstantProvider/evaluate_constantLike/propertyInit_Float.kt");
}
@Test
@TestMetadata("propertyInit_Int.kt")
public void testPropertyInit_Int() throws Exception {
- runTest("analysis/analysis-api/testData/components/compileTimeConstantProvider/evaluate/propertyInit_Int.kt");
+ runTest("analysis/analysis-api/testData/components/compileTimeConstantProvider/evaluate_constantLike/propertyInit_Int.kt");
}
@Test
@TestMetadata("propertyInit_Long.kt")
public void testPropertyInit_Long() throws Exception {
- runTest("analysis/analysis-api/testData/components/compileTimeConstantProvider/evaluate/propertyInit_Long.kt");
+ runTest("analysis/analysis-api/testData/components/compileTimeConstantProvider/evaluate_constantLike/propertyInit_Long.kt");
}
@Test
@TestMetadata("propertyInit_UInt.kt")
public void testPropertyInit_UInt() throws Exception {
- runTest("analysis/analysis-api/testData/components/compileTimeConstantProvider/evaluate/propertyInit_UInt.kt");
+ runTest("analysis/analysis-api/testData/components/compileTimeConstantProvider/evaluate_constantLike/propertyInit_UInt.kt");
}
@Test
@TestMetadata("stringLiteral.kt")
public void testStringLiteral() throws Exception {
- runTest("analysis/analysis-api/testData/components/compileTimeConstantProvider/evaluate/stringLiteral.kt");
+ runTest("analysis/analysis-api/testData/components/compileTimeConstantProvider/evaluate_constantLike/stringLiteral.kt");
}
}
diff --git a/analysis/analysis-api-fe10/tests/org/jetbrains/kotlin/analysis/api/fe10/components/compileTimeConstantProvider/Fe10CompileTimeConstantEvaluatorConstantTestGenerated.java b/analysis/analysis-api-fe10/tests/org/jetbrains/kotlin/analysis/api/fe10/components/compileTimeConstantProvider/Fe10CompileTimeConstantEvaluatorConstantTestGenerated.java
new file mode 100644
index 00000000000..6b335153590
--- /dev/null
+++ b/analysis/analysis-api-fe10/tests/org/jetbrains/kotlin/analysis/api/fe10/components/compileTimeConstantProvider/Fe10CompileTimeConstantEvaluatorConstantTestGenerated.java
@@ -0,0 +1,60 @@
+/*
+ * Copyright 2010-2021 JetBrains s.r.o. and Kotlin Programming Language contributors.
+ * Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file.
+ */
+
+package org.jetbrains.kotlin.analysis.api.fe10.components.compileTimeConstantProvider;
+
+import com.intellij.testFramework.TestDataPath;
+import org.jetbrains.kotlin.test.util.KtTestUtil;
+import org.jetbrains.annotations.NotNull;
+import org.jetbrains.kotlin.analysis.api.impl.barebone.test.FrontendApiTestConfiguratorService;
+import org.jetbrains.kotlin.analysis.api.descriptors.test.KtFe10FrontendApiTestConfiguratorService;
+import org.jetbrains.kotlin.analysis.api.impl.base.test.components.compileTimeConstantProvider.AbstractCompileTimeConstantEvaluatorConstantTest;
+import org.jetbrains.kotlin.test.TestMetadata;
+import org.junit.jupiter.api.Nested;
+import org.junit.jupiter.api.Test;
+
+import java.io.File;
+import java.util.regex.Pattern;
+
+/** This class is generated by {@link GenerateNewCompilerTests.kt}. DO NOT MODIFY MANUALLY */
+@SuppressWarnings("all")
+@TestMetadata("analysis/analysis-api/testData/components/compileTimeConstantProvider/evaluate_constant")
+@TestDataPath("$PROJECT_ROOT")
+public class Fe10CompileTimeConstantEvaluatorConstantTestGenerated extends AbstractCompileTimeConstantEvaluatorConstantTest {
+ @NotNull
+ @Override
+ public FrontendApiTestConfiguratorService getConfigurator() {
+ return KtFe10FrontendApiTestConfiguratorService.INSTANCE;
+ }
+
+ @Test
+ public void testAllFilesPresentInEvaluate_constant() throws Exception {
+ KtTestUtil.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("analysis/analysis-api/testData/components/compileTimeConstantProvider/evaluate_constant"), Pattern.compile("^(.+)\\.kt$"), null, true);
+ }
+
+ @Test
+ @TestMetadata("namedReference_const.kt")
+ public void testNamedReference_const() throws Exception {
+ runTest("analysis/analysis-api/testData/components/compileTimeConstantProvider/evaluate_constant/namedReference_const.kt");
+ }
+
+ @Test
+ @TestMetadata("namedReference_val.kt")
+ public void testNamedReference_val() throws Exception {
+ runTest("analysis/analysis-api/testData/components/compileTimeConstantProvider/evaluate_constant/namedReference_val.kt");
+ }
+
+ @Test
+ @TestMetadata("propertyInit_DivByOtherProperty_const.kt")
+ public void testPropertyInit_DivByOtherProperty_const() throws Exception {
+ runTest("analysis/analysis-api/testData/components/compileTimeConstantProvider/evaluate_constant/propertyInit_DivByOtherProperty_const.kt");
+ }
+
+ @Test
+ @TestMetadata("propertyInit_DivByOtherProperty_val.kt")
+ public void testPropertyInit_DivByOtherProperty_val() throws Exception {
+ runTest("analysis/analysis-api/testData/components/compileTimeConstantProvider/evaluate_constant/propertyInit_DivByOtherProperty_val.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 d73803c4753..6ca535c757f 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
@@ -7,6 +7,7 @@ package org.jetbrains.kotlin.analysis.api.fir.components
import org.jetbrains.kotlin.analysis.api.base.KtConstantValue
import org.jetbrains.kotlin.analysis.api.components.KtCompileTimeConstantProvider
+import org.jetbrains.kotlin.analysis.api.components.KtConstantEvaluationMode
import org.jetbrains.kotlin.analysis.api.fir.KtFirAnalysisSession
import org.jetbrains.kotlin.analysis.api.fir.evaluate.FirCompileTimeConstantEvaluator
import org.jetbrains.kotlin.analysis.api.tokens.ValidityToken
@@ -15,6 +16,7 @@ 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.fir.FirElement
import org.jetbrains.kotlin.fir.declarations.FirResolvePhase
+import org.jetbrains.kotlin.fir.declarations.utils.isConst
import org.jetbrains.kotlin.fir.declarations.utils.referredPropertySymbol
import org.jetbrains.kotlin.fir.expressions.FirExpression
import org.jetbrains.kotlin.fir.expressions.FirPropertyAccessExpression
@@ -30,14 +32,21 @@ internal class KtFirCompileTimeConstantProvider(
override val token: ValidityToken,
) : KtCompileTimeConstantProvider(), KtFirAnalysisSessionComponent {
- override fun evaluate(expression: KtExpression): KtConstantValue? = withValidityAssertion {
- evaluateFir(expression.getOrBuildFir(firResolveState), expression)
+ override fun evaluate(
+ expression: KtExpression,
+ mode: KtConstantEvaluationMode,
+ ): KtConstantValue? = withValidityAssertion {
+ evaluateFir(expression.getOrBuildFir(firResolveState), expression, mode)
}
- private fun evaluateFir(fir: FirElement?, context: KtExpression): KtConstantValue? = withValidityAssertion {
+ private fun evaluateFir(
+ fir: FirElement?,
+ context: KtExpression,
+ mode: KtConstantEvaluationMode,
+ ): KtConstantValue? = withValidityAssertion {
when (fir) {
is FirPropertyAccessExpression -> {
- fir.referredPropertySymbol?.toKtConstantValue(context)
+ fir.referredPropertySymbol?.toKtConstantValue(context, mode)
}
is FirExpression -> {
try {
@@ -48,7 +57,7 @@ internal class KtFirCompileTimeConstantProvider(
}
is FirNamedReference -> {
when (val resolvedSymbol = fir.resolvedSymbol) {
- is FirPropertySymbol -> resolvedSymbol.toKtConstantValue(context)
+ is FirPropertySymbol -> resolvedSymbol.toKtConstantValue(context, mode)
else -> null
}
}
@@ -65,11 +74,18 @@ internal class KtFirCompileTimeConstantProvider(
}
}
- private fun FirPropertySymbol.toKtConstantValue(context: KtExpression): KtConstantValue? = withValidityAssertion {
+ private fun FirPropertySymbol.toKtConstantValue(
+ context: KtExpression,
+ mode: KtConstantEvaluationMode,
+ ): KtConstantValue? = withValidityAssertion {
if (isVal && hasInitializer) {
- // NB: the initializer could be [FirLazyExpression] in [BodyBuildingMode.LAZY_BODIES].
- this.ensureResolved(FirResolvePhase.BODY_RESOLVE) // to unwrap lazy body
- evaluateFir(fir.initializer, context)
+ if (mode == KtConstantEvaluationMode.CONSTANT_EXPRESSION_EVALUATION && !isConst) {
+ null
+ } else {
+ // NB: the initializer could be [FirLazyExpression] in [BodyBuildingMode.LAZY_BODIES].
+ this.ensureResolved(FirResolvePhase.BODY_RESOLVE) // to unwrap lazy body
+ evaluateFir(fir.initializer, context, mode)
+ }
} else null
}
}
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/FirCompileTimeConstantEvaluatorConstantLikeTestGenerated.java
similarity index 67%
rename from analysis/analysis-api-fir/tests/org/jetbrains/kotlin/analysis/api/fir/components/compileTimeConstantProvider/FirCompileTimeConstantEvaluatorTestGenerated.java
rename to analysis/analysis-api-fir/tests/org/jetbrains/kotlin/analysis/api/fir/components/compileTimeConstantProvider/FirCompileTimeConstantEvaluatorConstantLikeTestGenerated.java
index 2cbc03528b1..88584d286a3 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/FirCompileTimeConstantEvaluatorConstantLikeTestGenerated.java
@@ -10,7 +10,7 @@ import org.jetbrains.kotlin.test.util.KtTestUtil;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.kotlin.analysis.api.impl.barebone.test.FrontendApiTestConfiguratorService;
import org.jetbrains.kotlin.analysis.api.fir.FirFrontendApiTestConfiguratorService;
-import org.jetbrains.kotlin.analysis.api.impl.base.test.components.compileTimeConstantProvider.AbstractCompileTimeConstantEvaluatorTest;
+import org.jetbrains.kotlin.analysis.api.impl.base.test.components.compileTimeConstantProvider.AbstractCompileTimeConstantEvaluatorConstantLikeTest;
import org.jetbrains.kotlin.test.TestMetadata;
import org.junit.jupiter.api.Nested;
import org.junit.jupiter.api.Test;
@@ -20,9 +20,9 @@ import java.util.regex.Pattern;
/** This class is generated by {@link GenerateNewCompilerTests.kt}. DO NOT MODIFY MANUALLY */
@SuppressWarnings("all")
-@TestMetadata("analysis/analysis-api/testData/components/compileTimeConstantProvider/evaluate")
+@TestMetadata("analysis/analysis-api/testData/components/compileTimeConstantProvider/evaluate_constantLike")
@TestDataPath("$PROJECT_ROOT")
-public class FirCompileTimeConstantEvaluatorTestGenerated extends AbstractCompileTimeConstantEvaluatorTest {
+public class FirCompileTimeConstantEvaluatorConstantLikeTestGenerated extends AbstractCompileTimeConstantEvaluatorConstantLikeTest {
@NotNull
@Override
public FrontendApiTestConfiguratorService getConfigurator() {
@@ -30,97 +30,109 @@ public class FirCompileTimeConstantEvaluatorTestGenerated extends AbstractCompil
}
@Test
- public void testAllFilesPresentInEvaluate() throws Exception {
- KtTestUtil.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("analysis/analysis-api/testData/components/compileTimeConstantProvider/evaluate"), Pattern.compile("^(.+)\\.kt$"), null, true);
+ public void testAllFilesPresentInEvaluate_constantLike() throws Exception {
+ KtTestUtil.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("analysis/analysis-api/testData/components/compileTimeConstantProvider/evaluate_constantLike"), Pattern.compile("^(.+)\\.kt$"), null, true);
}
@Test
@TestMetadata("binaryExpressionWithString.kt")
public void testBinaryExpressionWithString() throws Exception {
- runTest("analysis/analysis-api/testData/components/compileTimeConstantProvider/evaluate/binaryExpressionWithString.kt");
+ runTest("analysis/analysis-api/testData/components/compileTimeConstantProvider/evaluate_constantLike/binaryExpressionWithString.kt");
}
@Test
@TestMetadata("namedReference_const.kt")
public void testNamedReference_const() throws Exception {
- runTest("analysis/analysis-api/testData/components/compileTimeConstantProvider/evaluate/namedReference_const.kt");
+ runTest("analysis/analysis-api/testData/components/compileTimeConstantProvider/evaluate_constantLike/namedReference_const.kt");
}
@Test
@TestMetadata("namedReference_val.kt")
public void testNamedReference_val() throws Exception {
- runTest("analysis/analysis-api/testData/components/compileTimeConstantProvider/evaluate/namedReference_val.kt");
+ runTest("analysis/analysis-api/testData/components/compileTimeConstantProvider/evaluate_constantLike/namedReference_val.kt");
}
@Test
@TestMetadata("namedReference_var.kt")
public void testNamedReference_var() throws Exception {
- runTest("analysis/analysis-api/testData/components/compileTimeConstantProvider/evaluate/namedReference_var.kt");
+ runTest("analysis/analysis-api/testData/components/compileTimeConstantProvider/evaluate_constantLike/namedReference_var.kt");
}
@Test
@TestMetadata("propertyInCompanionObject.kt")
public void testPropertyInCompanionObject() throws Exception {
- runTest("analysis/analysis-api/testData/components/compileTimeConstantProvider/evaluate/propertyInCompanionObject.kt");
+ runTest("analysis/analysis-api/testData/components/compileTimeConstantProvider/evaluate_constantLike/propertyInCompanionObject.kt");
}
@Test
@TestMetadata("propertyInCompanionObject_indirect.kt")
public void testPropertyInCompanionObject_indirect() throws Exception {
- runTest("analysis/analysis-api/testData/components/compileTimeConstantProvider/evaluate/propertyInCompanionObject_indirect.kt");
+ runTest("analysis/analysis-api/testData/components/compileTimeConstantProvider/evaluate_constantLike/propertyInCompanionObject_indirect.kt");
}
@Test
@TestMetadata("propertyInCompanionObject_indirect_twice.kt")
public void testPropertyInCompanionObject_indirect_twice() throws Exception {
- runTest("analysis/analysis-api/testData/components/compileTimeConstantProvider/evaluate/propertyInCompanionObject_indirect_twice.kt");
+ runTest("analysis/analysis-api/testData/components/compileTimeConstantProvider/evaluate_constantLike/propertyInCompanionObject_indirect_twice.kt");
}
@Test
@TestMetadata("propertyInit_Byte.kt")
public void testPropertyInit_Byte() throws Exception {
- runTest("analysis/analysis-api/testData/components/compileTimeConstantProvider/evaluate/propertyInit_Byte.kt");
+ runTest("analysis/analysis-api/testData/components/compileTimeConstantProvider/evaluate_constantLike/propertyInit_Byte.kt");
+ }
+
+ @Test
+ @TestMetadata("propertyInit_DivByOtherProperty_const.kt")
+ public void testPropertyInit_DivByOtherProperty_const() throws Exception {
+ runTest("analysis/analysis-api/testData/components/compileTimeConstantProvider/evaluate_constantLike/propertyInit_DivByOtherProperty_const.kt");
+ }
+
+ @Test
+ @TestMetadata("propertyInit_DivByOtherProperty_val.kt")
+ public void testPropertyInit_DivByOtherProperty_val() throws Exception {
+ runTest("analysis/analysis-api/testData/components/compileTimeConstantProvider/evaluate_constantLike/propertyInit_DivByOtherProperty_val.kt");
}
@Test
@TestMetadata("propertyInit_DivByZero.kt")
public void testPropertyInit_DivByZero() throws Exception {
- runTest("analysis/analysis-api/testData/components/compileTimeConstantProvider/evaluate/propertyInit_DivByZero.kt");
+ runTest("analysis/analysis-api/testData/components/compileTimeConstantProvider/evaluate_constantLike/propertyInit_DivByZero.kt");
}
@Test
@TestMetadata("propertyInit_Double.kt")
public void testPropertyInit_Double() throws Exception {
- runTest("analysis/analysis-api/testData/components/compileTimeConstantProvider/evaluate/propertyInit_Double.kt");
+ runTest("analysis/analysis-api/testData/components/compileTimeConstantProvider/evaluate_constantLike/propertyInit_Double.kt");
}
@Test
@TestMetadata("propertyInit_Float.kt")
public void testPropertyInit_Float() throws Exception {
- runTest("analysis/analysis-api/testData/components/compileTimeConstantProvider/evaluate/propertyInit_Float.kt");
+ runTest("analysis/analysis-api/testData/components/compileTimeConstantProvider/evaluate_constantLike/propertyInit_Float.kt");
}
@Test
@TestMetadata("propertyInit_Int.kt")
public void testPropertyInit_Int() throws Exception {
- runTest("analysis/analysis-api/testData/components/compileTimeConstantProvider/evaluate/propertyInit_Int.kt");
+ runTest("analysis/analysis-api/testData/components/compileTimeConstantProvider/evaluate_constantLike/propertyInit_Int.kt");
}
@Test
@TestMetadata("propertyInit_Long.kt")
public void testPropertyInit_Long() throws Exception {
- runTest("analysis/analysis-api/testData/components/compileTimeConstantProvider/evaluate/propertyInit_Long.kt");
+ runTest("analysis/analysis-api/testData/components/compileTimeConstantProvider/evaluate_constantLike/propertyInit_Long.kt");
}
@Test
@TestMetadata("propertyInit_UInt.kt")
public void testPropertyInit_UInt() throws Exception {
- runTest("analysis/analysis-api/testData/components/compileTimeConstantProvider/evaluate/propertyInit_UInt.kt");
+ runTest("analysis/analysis-api/testData/components/compileTimeConstantProvider/evaluate_constantLike/propertyInit_UInt.kt");
}
@Test
@TestMetadata("stringLiteral.kt")
public void testStringLiteral() throws Exception {
- runTest("analysis/analysis-api/testData/components/compileTimeConstantProvider/evaluate/stringLiteral.kt");
+ runTest("analysis/analysis-api/testData/components/compileTimeConstantProvider/evaluate_constantLike/stringLiteral.kt");
}
}
diff --git a/analysis/analysis-api-fir/tests/org/jetbrains/kotlin/analysis/api/fir/components/compileTimeConstantProvider/FirCompileTimeConstantEvaluatorConstantTestGenerated.java b/analysis/analysis-api-fir/tests/org/jetbrains/kotlin/analysis/api/fir/components/compileTimeConstantProvider/FirCompileTimeConstantEvaluatorConstantTestGenerated.java
new file mode 100644
index 00000000000..08e945d092c
--- /dev/null
+++ b/analysis/analysis-api-fir/tests/org/jetbrains/kotlin/analysis/api/fir/components/compileTimeConstantProvider/FirCompileTimeConstantEvaluatorConstantTestGenerated.java
@@ -0,0 +1,60 @@
+/*
+ * Copyright 2010-2021 JetBrains s.r.o. and Kotlin Programming Language contributors.
+ * Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file.
+ */
+
+package org.jetbrains.kotlin.analysis.api.fir.components.compileTimeConstantProvider;
+
+import com.intellij.testFramework.TestDataPath;
+import org.jetbrains.kotlin.test.util.KtTestUtil;
+import org.jetbrains.annotations.NotNull;
+import org.jetbrains.kotlin.analysis.api.impl.barebone.test.FrontendApiTestConfiguratorService;
+import org.jetbrains.kotlin.analysis.api.fir.FirFrontendApiTestConfiguratorService;
+import org.jetbrains.kotlin.analysis.api.impl.base.test.components.compileTimeConstantProvider.AbstractCompileTimeConstantEvaluatorConstantTest;
+import org.jetbrains.kotlin.test.TestMetadata;
+import org.junit.jupiter.api.Nested;
+import org.junit.jupiter.api.Test;
+
+import java.io.File;
+import java.util.regex.Pattern;
+
+/** This class is generated by {@link GenerateNewCompilerTests.kt}. DO NOT MODIFY MANUALLY */
+@SuppressWarnings("all")
+@TestMetadata("analysis/analysis-api/testData/components/compileTimeConstantProvider/evaluate_constant")
+@TestDataPath("$PROJECT_ROOT")
+public class FirCompileTimeConstantEvaluatorConstantTestGenerated extends AbstractCompileTimeConstantEvaluatorConstantTest {
+ @NotNull
+ @Override
+ public FrontendApiTestConfiguratorService getConfigurator() {
+ return FirFrontendApiTestConfiguratorService.INSTANCE;
+ }
+
+ @Test
+ public void testAllFilesPresentInEvaluate_constant() throws Exception {
+ KtTestUtil.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("analysis/analysis-api/testData/components/compileTimeConstantProvider/evaluate_constant"), Pattern.compile("^(.+)\\.kt$"), null, true);
+ }
+
+ @Test
+ @TestMetadata("namedReference_const.kt")
+ public void testNamedReference_const() throws Exception {
+ runTest("analysis/analysis-api/testData/components/compileTimeConstantProvider/evaluate_constant/namedReference_const.kt");
+ }
+
+ @Test
+ @TestMetadata("namedReference_val.kt")
+ public void testNamedReference_val() throws Exception {
+ runTest("analysis/analysis-api/testData/components/compileTimeConstantProvider/evaluate_constant/namedReference_val.kt");
+ }
+
+ @Test
+ @TestMetadata("propertyInit_DivByOtherProperty_const.kt")
+ public void testPropertyInit_DivByOtherProperty_const() throws Exception {
+ runTest("analysis/analysis-api/testData/components/compileTimeConstantProvider/evaluate_constant/propertyInit_DivByOtherProperty_const.kt");
+ }
+
+ @Test
+ @TestMetadata("propertyInit_DivByOtherProperty_val.kt")
+ public void testPropertyInit_DivByOtherProperty_val() throws Exception {
+ runTest("analysis/analysis-api/testData/components/compileTimeConstantProvider/evaluate_constant/propertyInit_DivByOtherProperty_val.kt");
+ }
+}
diff --git a/analysis/analysis-api-impl-base/tests/org/jetbrains/kotlin/analysis/api/impl/base/test/components/compileTimeConstantProvider/AbstractCompileTimeConstantEvaluatorConstantLikeTest.kt b/analysis/analysis-api-impl-base/tests/org/jetbrains/kotlin/analysis/api/impl/base/test/components/compileTimeConstantProvider/AbstractCompileTimeConstantEvaluatorConstantLikeTest.kt
new file mode 100644
index 00000000000..37576540fb4
--- /dev/null
+++ b/analysis/analysis-api-impl-base/tests/org/jetbrains/kotlin/analysis/api/impl/base/test/components/compileTimeConstantProvider/AbstractCompileTimeConstantEvaluatorConstantLikeTest.kt
@@ -0,0 +1,11 @@
+/*
+ * Copyright 2010-2021 JetBrains s.r.o. and Kotlin Programming Language contributors.
+ * Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file.
+ */
+
+package org.jetbrains.kotlin.analysis.api.impl.base.test.components.compileTimeConstantProvider
+
+import org.jetbrains.kotlin.analysis.api.components.KtConstantEvaluationMode
+
+abstract class AbstractCompileTimeConstantEvaluatorConstantLikeTest
+ : AbstractCompileTimeConstantEvaluatorTest(KtConstantEvaluationMode.CONSTANT_LIKE_EXPRESSION_EVALUATION)
diff --git a/analysis/analysis-api-impl-base/tests/org/jetbrains/kotlin/analysis/api/impl/base/test/components/compileTimeConstantProvider/AbstractCompileTimeConstantEvaluatorConstantTest.kt b/analysis/analysis-api-impl-base/tests/org/jetbrains/kotlin/analysis/api/impl/base/test/components/compileTimeConstantProvider/AbstractCompileTimeConstantEvaluatorConstantTest.kt
new file mode 100644
index 00000000000..70f33a83804
--- /dev/null
+++ b/analysis/analysis-api-impl-base/tests/org/jetbrains/kotlin/analysis/api/impl/base/test/components/compileTimeConstantProvider/AbstractCompileTimeConstantEvaluatorConstantTest.kt
@@ -0,0 +1,11 @@
+/*
+ * Copyright 2010-2022 JetBrains s.r.o. and Kotlin Programming Language contributors.
+ * Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file.
+ */
+
+package org.jetbrains.kotlin.analysis.api.impl.base.test.components.compileTimeConstantProvider
+
+import org.jetbrains.kotlin.analysis.api.components.KtConstantEvaluationMode
+
+abstract class AbstractCompileTimeConstantEvaluatorConstantTest
+ : AbstractCompileTimeConstantEvaluatorTest(KtConstantEvaluationMode.CONSTANT_EXPRESSION_EVALUATION)
diff --git a/analysis/analysis-api-impl-base/tests/org/jetbrains/kotlin/analysis/api/impl/base/test/components/compileTimeConstantProvider/AbstractCompileTimeConstantEvaluatorTest.kt b/analysis/analysis-api-impl-base/tests/org/jetbrains/kotlin/analysis/api/impl/base/test/components/compileTimeConstantProvider/AbstractCompileTimeConstantEvaluatorTest.kt
index e7cf60cc5ad..0e4e3950eb2 100644
--- a/analysis/analysis-api-impl-base/tests/org/jetbrains/kotlin/analysis/api/impl/base/test/components/compileTimeConstantProvider/AbstractCompileTimeConstantEvaluatorTest.kt
+++ b/analysis/analysis-api-impl-base/tests/org/jetbrains/kotlin/analysis/api/impl/base/test/components/compileTimeConstantProvider/AbstractCompileTimeConstantEvaluatorTest.kt
@@ -1,11 +1,11 @@
/*
- * Copyright 2010-2021 JetBrains s.r.o. and Kotlin Programming Language contributors.
+ * Copyright 2010-2022 JetBrains s.r.o. and Kotlin Programming Language contributors.
* Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file.
*/
package org.jetbrains.kotlin.analysis.api.impl.base.test.components.compileTimeConstantProvider
-import org.jetbrains.kotlin.analysis.api.impl.barebone.test.FrontendApiTestConfiguratorService
+import org.jetbrains.kotlin.analysis.api.components.KtConstantEvaluationMode
import org.jetbrains.kotlin.analysis.api.impl.barebone.test.expressionMarkerProvider
import org.jetbrains.kotlin.analysis.api.impl.base.test.test.framework.AbstractHLApiSingleFileTest
import org.jetbrains.kotlin.psi.KtExpression
@@ -15,7 +15,9 @@ import org.jetbrains.kotlin.test.model.TestModule
import org.jetbrains.kotlin.test.services.TestServices
import org.jetbrains.kotlin.test.services.assertions
-abstract class AbstractCompileTimeConstantEvaluatorTest : AbstractHLApiSingleFileTest() {
+abstract class AbstractCompileTimeConstantEvaluatorTest(
+ private val mode: KtConstantEvaluationMode
+) : AbstractHLApiSingleFileTest() {
override fun doTestByFileStructure(ktFile: KtFile, module: TestModule, testServices: TestServices) {
val element = testServices.expressionMarkerProvider.getSelectedElement(ktFile)
val expression = when (element) {
@@ -24,7 +26,9 @@ abstract class AbstractCompileTimeConstantEvaluatorTest : AbstractHLApiSingleFil
else -> null
} ?: testServices.assertions.fail { "Unsupported expression: $element" }
val constantValue = executeOnPooledThreadInReadAction {
- analyseForTest(expression) { expression.evaluate() }
+ analyseForTest(expression) {
+ expression.evaluate(mode)
+ }
}
val actual = buildString {
appendLine("expression: ${expression.text}")
@@ -33,5 +37,4 @@ abstract class AbstractCompileTimeConstantEvaluatorTest : AbstractHLApiSingleFil
}
testServices.assertions.assertEqualsToTestDataFileSibling(actual)
}
-
-}
\ No newline at end of file
+}
diff --git a/analysis/analysis-api/src/org/jetbrains/kotlin/analysis/api/components/KtCompileTimeConstantProvider.kt b/analysis/analysis-api/src/org/jetbrains/kotlin/analysis/api/components/KtCompileTimeConstantProvider.kt
index f5fb173abf7..81efdd965d0 100644
--- a/analysis/analysis-api/src/org/jetbrains/kotlin/analysis/api/components/KtCompileTimeConstantProvider.kt
+++ b/analysis/analysis-api/src/org/jetbrains/kotlin/analysis/api/components/KtCompileTimeConstantProvider.kt
@@ -8,11 +8,32 @@ package org.jetbrains.kotlin.analysis.api.components
import org.jetbrains.kotlin.analysis.api.base.KtConstantValue
import org.jetbrains.kotlin.psi.KtExpression
+public enum class KtConstantEvaluationMode {
+ /**
+ * In this mode, what a compiler views as constants will be evaluated. In other words,
+ * expressions and properties that are free from runtime behaviors/changes will be evaluated,
+ * such as `const val` properties or binary expressions whose operands are constants.
+ */
+ CONSTANT_EXPRESSION_EVALUATION,
+
+ /**
+ * In this mode, what a checker can approximate as constants will be evaluated. In other words,
+ * more expressions and properties that could be composites of other constants will be evaluated,
+ * such as `val` properties with constant initializers or binary expressions whose operands could be constants.
+ *
+ * Note that, as an approximation, the result can be sometimes incorrect or present even though there is an error.
+ */
+ CONSTANT_LIKE_EXPRESSION_EVALUATION;
+}
+
public abstract class KtCompileTimeConstantProvider : KtAnalysisSessionComponent() {
- public abstract fun evaluate(expression: KtExpression): KtConstantValue?
+ public abstract fun evaluate(
+ expression: KtExpression,
+ mode: KtConstantEvaluationMode,
+ ): KtConstantValue?
}
public interface KtCompileTimeConstantProviderMixIn : KtAnalysisSessionMixIn {
- public fun KtExpression.evaluate(): KtConstantValue? =
- analysisSession.compileTimeConstantProvider.evaluate(this)
+ public fun KtExpression.evaluate(mode: KtConstantEvaluationMode): KtConstantValue? =
+ analysisSession.compileTimeConstantProvider.evaluate(this, mode)
}
diff --git a/analysis/analysis-api/testData/components/compileTimeConstantProvider/evaluate/namedReference_const.kt b/analysis/analysis-api/testData/components/compileTimeConstantProvider/evaluate_constant/namedReference_const.kt
similarity index 100%
rename from analysis/analysis-api/testData/components/compileTimeConstantProvider/evaluate/namedReference_const.kt
rename to analysis/analysis-api/testData/components/compileTimeConstantProvider/evaluate_constant/namedReference_const.kt
diff --git a/analysis/analysis-api/testData/components/compileTimeConstantProvider/evaluate/namedReference_const.txt b/analysis/analysis-api/testData/components/compileTimeConstantProvider/evaluate_constant/namedReference_const.txt
similarity index 100%
rename from analysis/analysis-api/testData/components/compileTimeConstantProvider/evaluate/namedReference_const.txt
rename to analysis/analysis-api/testData/components/compileTimeConstantProvider/evaluate_constant/namedReference_const.txt
diff --git a/analysis/analysis-api/testData/components/compileTimeConstantProvider/evaluate/namedReference_val.kt b/analysis/analysis-api/testData/components/compileTimeConstantProvider/evaluate_constant/namedReference_val.kt
similarity index 100%
rename from analysis/analysis-api/testData/components/compileTimeConstantProvider/evaluate/namedReference_val.kt
rename to analysis/analysis-api/testData/components/compileTimeConstantProvider/evaluate_constant/namedReference_val.kt
diff --git a/analysis/analysis-api/testData/components/compileTimeConstantProvider/evaluate/namedReference_var.txt b/analysis/analysis-api/testData/components/compileTimeConstantProvider/evaluate_constant/namedReference_val.txt
similarity index 100%
rename from analysis/analysis-api/testData/components/compileTimeConstantProvider/evaluate/namedReference_var.txt
rename to analysis/analysis-api/testData/components/compileTimeConstantProvider/evaluate_constant/namedReference_val.txt
diff --git a/analysis/analysis-api/testData/components/compileTimeConstantProvider/evaluate_constant/propertyInit_DivByOtherProperty_const.descriptors.txt b/analysis/analysis-api/testData/components/compileTimeConstantProvider/evaluate_constant/propertyInit_DivByOtherProperty_const.descriptors.txt
new file mode 100644
index 00000000000..67e5f61e253
--- /dev/null
+++ b/analysis/analysis-api/testData/components/compileTimeConstantProvider/evaluate_constant/propertyInit_DivByOtherProperty_const.descriptors.txt
@@ -0,0 +1,3 @@
+expression: 42 / d
+constant: 42
+constantValueKind: Int
diff --git a/analysis/analysis-api/testData/components/compileTimeConstantProvider/evaluate_constant/propertyInit_DivByOtherProperty_const.kt b/analysis/analysis-api/testData/components/compileTimeConstantProvider/evaluate_constant/propertyInit_DivByOtherProperty_const.kt
new file mode 100644
index 00000000000..8355293e87a
--- /dev/null
+++ b/analysis/analysis-api/testData/components/compileTimeConstantProvider/evaluate_constant/propertyInit_DivByOtherProperty_const.kt
@@ -0,0 +1,4 @@
+class Test {
+ val p = 42 / d // uninitialized d
+ const val d = 1
+}
diff --git a/analysis/analysis-api/testData/components/compileTimeConstantProvider/evaluate_constant/propertyInit_DivByOtherProperty_const.txt b/analysis/analysis-api/testData/components/compileTimeConstantProvider/evaluate_constant/propertyInit_DivByOtherProperty_const.txt
new file mode 100644
index 00000000000..0b934314e80
--- /dev/null
+++ b/analysis/analysis-api/testData/components/compileTimeConstantProvider/evaluate_constant/propertyInit_DivByOtherProperty_const.txt
@@ -0,0 +1,3 @@
+expression: 42 / d
+constant: NOT_EVALUATED
+constantValueKind: NOT_EVALUATED
diff --git a/analysis/analysis-api/testData/components/compileTimeConstantProvider/evaluate_constant/propertyInit_DivByOtherProperty_val.descriptors.txt b/analysis/analysis-api/testData/components/compileTimeConstantProvider/evaluate_constant/propertyInit_DivByOtherProperty_val.descriptors.txt
new file mode 100644
index 00000000000..0fb51ccae55
--- /dev/null
+++ b/analysis/analysis-api/testData/components/compileTimeConstantProvider/evaluate_constant/propertyInit_DivByOtherProperty_val.descriptors.txt
@@ -0,0 +1,3 @@
+expression: 42 / d
+constant: error("Division by zero")
+constantValueKind: Error
diff --git a/analysis/analysis-api/testData/components/compileTimeConstantProvider/evaluate_constant/propertyInit_DivByOtherProperty_val.kt b/analysis/analysis-api/testData/components/compileTimeConstantProvider/evaluate_constant/propertyInit_DivByOtherProperty_val.kt
new file mode 100644
index 00000000000..59e24ec5c67
--- /dev/null
+++ b/analysis/analysis-api/testData/components/compileTimeConstantProvider/evaluate_constant/propertyInit_DivByOtherProperty_val.kt
@@ -0,0 +1,5 @@
+class Test {
+ val p = 42 / d // uninitialized d
+ val d = 0 // should not raise div-by-zero error
+}
+
diff --git a/analysis/analysis-api/testData/components/compileTimeConstantProvider/evaluate_constant/propertyInit_DivByOtherProperty_val.txt b/analysis/analysis-api/testData/components/compileTimeConstantProvider/evaluate_constant/propertyInit_DivByOtherProperty_val.txt
new file mode 100644
index 00000000000..0b934314e80
--- /dev/null
+++ b/analysis/analysis-api/testData/components/compileTimeConstantProvider/evaluate_constant/propertyInit_DivByOtherProperty_val.txt
@@ -0,0 +1,3 @@
+expression: 42 / d
+constant: NOT_EVALUATED
+constantValueKind: NOT_EVALUATED
diff --git a/analysis/analysis-api/testData/components/compileTimeConstantProvider/evaluate/binaryExpressionWithString.kt b/analysis/analysis-api/testData/components/compileTimeConstantProvider/evaluate_constantLike/binaryExpressionWithString.kt
similarity index 100%
rename from analysis/analysis-api/testData/components/compileTimeConstantProvider/evaluate/binaryExpressionWithString.kt
rename to analysis/analysis-api/testData/components/compileTimeConstantProvider/evaluate_constantLike/binaryExpressionWithString.kt
diff --git a/analysis/analysis-api/testData/components/compileTimeConstantProvider/evaluate/binaryExpressionWithString.txt b/analysis/analysis-api/testData/components/compileTimeConstantProvider/evaluate_constantLike/binaryExpressionWithString.txt
similarity index 100%
rename from analysis/analysis-api/testData/components/compileTimeConstantProvider/evaluate/binaryExpressionWithString.txt
rename to analysis/analysis-api/testData/components/compileTimeConstantProvider/evaluate_constantLike/binaryExpressionWithString.txt
diff --git a/analysis/analysis-api/testData/components/compileTimeConstantProvider/evaluate_constantLike/namedReference_const.kt b/analysis/analysis-api/testData/components/compileTimeConstantProvider/evaluate_constantLike/namedReference_const.kt
new file mode 100644
index 00000000000..fd1ee8e96db
--- /dev/null
+++ b/analysis/analysis-api/testData/components/compileTimeConstantProvider/evaluate_constantLike/namedReference_const.kt
@@ -0,0 +1,8 @@
+class Test {
+ const val bar : Int = 42
+}
+
+fun box() {
+ val t = Test()
+ t.bar
+}
diff --git a/analysis/analysis-api/testData/components/compileTimeConstantProvider/evaluate/namedReference_val.txt b/analysis/analysis-api/testData/components/compileTimeConstantProvider/evaluate_constantLike/namedReference_const.txt
similarity index 100%
rename from analysis/analysis-api/testData/components/compileTimeConstantProvider/evaluate/namedReference_val.txt
rename to analysis/analysis-api/testData/components/compileTimeConstantProvider/evaluate_constantLike/namedReference_const.txt
diff --git a/analysis/analysis-api/testData/components/compileTimeConstantProvider/evaluate_constantLike/namedReference_val.kt b/analysis/analysis-api/testData/components/compileTimeConstantProvider/evaluate_constantLike/namedReference_val.kt
new file mode 100644
index 00000000000..58ffcfe01e1
--- /dev/null
+++ b/analysis/analysis-api/testData/components/compileTimeConstantProvider/evaluate_constantLike/namedReference_val.kt
@@ -0,0 +1,8 @@
+class Test {
+ val bar : Int = 42
+}
+
+fun box() {
+ val t = Test()
+ t.bar
+}
diff --git a/analysis/analysis-api/testData/components/compileTimeConstantProvider/evaluate_constantLike/namedReference_val.txt b/analysis/analysis-api/testData/components/compileTimeConstantProvider/evaluate_constantLike/namedReference_val.txt
new file mode 100644
index 00000000000..9ff5cc75772
--- /dev/null
+++ b/analysis/analysis-api/testData/components/compileTimeConstantProvider/evaluate_constantLike/namedReference_val.txt
@@ -0,0 +1,3 @@
+expression: bar
+constant: 42
+constantValueKind: Int
diff --git a/analysis/analysis-api/testData/components/compileTimeConstantProvider/evaluate/namedReference_var.kt b/analysis/analysis-api/testData/components/compileTimeConstantProvider/evaluate_constantLike/namedReference_var.kt
similarity index 100%
rename from analysis/analysis-api/testData/components/compileTimeConstantProvider/evaluate/namedReference_var.kt
rename to analysis/analysis-api/testData/components/compileTimeConstantProvider/evaluate_constantLike/namedReference_var.kt
diff --git a/analysis/analysis-api/testData/components/compileTimeConstantProvider/evaluate_constantLike/namedReference_var.txt b/analysis/analysis-api/testData/components/compileTimeConstantProvider/evaluate_constantLike/namedReference_var.txt
new file mode 100644
index 00000000000..1ef30c1c571
--- /dev/null
+++ b/analysis/analysis-api/testData/components/compileTimeConstantProvider/evaluate_constantLike/namedReference_var.txt
@@ -0,0 +1,3 @@
+expression: bar
+constant: NOT_EVALUATED
+constantValueKind: NOT_EVALUATED
diff --git a/analysis/analysis-api/testData/components/compileTimeConstantProvider/evaluate/propertyInCompanionObject.kt b/analysis/analysis-api/testData/components/compileTimeConstantProvider/evaluate_constantLike/propertyInCompanionObject.kt
similarity index 100%
rename from analysis/analysis-api/testData/components/compileTimeConstantProvider/evaluate/propertyInCompanionObject.kt
rename to analysis/analysis-api/testData/components/compileTimeConstantProvider/evaluate_constantLike/propertyInCompanionObject.kt
diff --git a/analysis/analysis-api/testData/components/compileTimeConstantProvider/evaluate/propertyInCompanionObject.txt b/analysis/analysis-api/testData/components/compileTimeConstantProvider/evaluate_constantLike/propertyInCompanionObject.txt
similarity index 100%
rename from analysis/analysis-api/testData/components/compileTimeConstantProvider/evaluate/propertyInCompanionObject.txt
rename to analysis/analysis-api/testData/components/compileTimeConstantProvider/evaluate_constantLike/propertyInCompanionObject.txt
diff --git a/analysis/analysis-api/testData/components/compileTimeConstantProvider/evaluate/propertyInCompanionObject_indirect.kt b/analysis/analysis-api/testData/components/compileTimeConstantProvider/evaluate_constantLike/propertyInCompanionObject_indirect.kt
similarity index 100%
rename from analysis/analysis-api/testData/components/compileTimeConstantProvider/evaluate/propertyInCompanionObject_indirect.kt
rename to analysis/analysis-api/testData/components/compileTimeConstantProvider/evaluate_constantLike/propertyInCompanionObject_indirect.kt
diff --git a/analysis/analysis-api/testData/components/compileTimeConstantProvider/evaluate/propertyInCompanionObject_indirect.txt b/analysis/analysis-api/testData/components/compileTimeConstantProvider/evaluate_constantLike/propertyInCompanionObject_indirect.txt
similarity index 100%
rename from analysis/analysis-api/testData/components/compileTimeConstantProvider/evaluate/propertyInCompanionObject_indirect.txt
rename to analysis/analysis-api/testData/components/compileTimeConstantProvider/evaluate_constantLike/propertyInCompanionObject_indirect.txt
diff --git a/analysis/analysis-api/testData/components/compileTimeConstantProvider/evaluate/propertyInCompanionObject_indirect_twice.kt b/analysis/analysis-api/testData/components/compileTimeConstantProvider/evaluate_constantLike/propertyInCompanionObject_indirect_twice.kt
similarity index 100%
rename from analysis/analysis-api/testData/components/compileTimeConstantProvider/evaluate/propertyInCompanionObject_indirect_twice.kt
rename to analysis/analysis-api/testData/components/compileTimeConstantProvider/evaluate_constantLike/propertyInCompanionObject_indirect_twice.kt
diff --git a/analysis/analysis-api/testData/components/compileTimeConstantProvider/evaluate/propertyInCompanionObject_indirect_twice.txt b/analysis/analysis-api/testData/components/compileTimeConstantProvider/evaluate_constantLike/propertyInCompanionObject_indirect_twice.txt
similarity index 100%
rename from analysis/analysis-api/testData/components/compileTimeConstantProvider/evaluate/propertyInCompanionObject_indirect_twice.txt
rename to analysis/analysis-api/testData/components/compileTimeConstantProvider/evaluate_constantLike/propertyInCompanionObject_indirect_twice.txt
diff --git a/analysis/analysis-api/testData/components/compileTimeConstantProvider/evaluate/propertyInit_Byte.kt b/analysis/analysis-api/testData/components/compileTimeConstantProvider/evaluate_constantLike/propertyInit_Byte.kt
similarity index 100%
rename from analysis/analysis-api/testData/components/compileTimeConstantProvider/evaluate/propertyInit_Byte.kt
rename to analysis/analysis-api/testData/components/compileTimeConstantProvider/evaluate_constantLike/propertyInit_Byte.kt
diff --git a/analysis/analysis-api/testData/components/compileTimeConstantProvider/evaluate/propertyInit_Byte.txt b/analysis/analysis-api/testData/components/compileTimeConstantProvider/evaluate_constantLike/propertyInit_Byte.txt
similarity index 100%
rename from analysis/analysis-api/testData/components/compileTimeConstantProvider/evaluate/propertyInit_Byte.txt
rename to analysis/analysis-api/testData/components/compileTimeConstantProvider/evaluate_constantLike/propertyInit_Byte.txt
diff --git a/analysis/analysis-api/testData/components/compileTimeConstantProvider/evaluate_constantLike/propertyInit_DivByOtherProperty_const.descriptors.txt b/analysis/analysis-api/testData/components/compileTimeConstantProvider/evaluate_constantLike/propertyInit_DivByOtherProperty_const.descriptors.txt
new file mode 100644
index 00000000000..67e5f61e253
--- /dev/null
+++ b/analysis/analysis-api/testData/components/compileTimeConstantProvider/evaluate_constantLike/propertyInit_DivByOtherProperty_const.descriptors.txt
@@ -0,0 +1,3 @@
+expression: 42 / d
+constant: 42
+constantValueKind: Int
diff --git a/analysis/analysis-api/testData/components/compileTimeConstantProvider/evaluate_constantLike/propertyInit_DivByOtherProperty_const.kt b/analysis/analysis-api/testData/components/compileTimeConstantProvider/evaluate_constantLike/propertyInit_DivByOtherProperty_const.kt
new file mode 100644
index 00000000000..648effeb66d
--- /dev/null
+++ b/analysis/analysis-api/testData/components/compileTimeConstantProvider/evaluate_constantLike/propertyInit_DivByOtherProperty_const.kt
@@ -0,0 +1,2 @@
+const val d = 1
+val p = 42 / d
diff --git a/analysis/analysis-api/testData/components/compileTimeConstantProvider/evaluate_constantLike/propertyInit_DivByOtherProperty_const.txt b/analysis/analysis-api/testData/components/compileTimeConstantProvider/evaluate_constantLike/propertyInit_DivByOtherProperty_const.txt
new file mode 100644
index 00000000000..0b934314e80
--- /dev/null
+++ b/analysis/analysis-api/testData/components/compileTimeConstantProvider/evaluate_constantLike/propertyInit_DivByOtherProperty_const.txt
@@ -0,0 +1,3 @@
+expression: 42 / d
+constant: NOT_EVALUATED
+constantValueKind: NOT_EVALUATED
diff --git a/analysis/analysis-api/testData/components/compileTimeConstantProvider/evaluate_constantLike/propertyInit_DivByOtherProperty_val.descriptors.txt b/analysis/analysis-api/testData/components/compileTimeConstantProvider/evaluate_constantLike/propertyInit_DivByOtherProperty_val.descriptors.txt
new file mode 100644
index 00000000000..67e5f61e253
--- /dev/null
+++ b/analysis/analysis-api/testData/components/compileTimeConstantProvider/evaluate_constantLike/propertyInit_DivByOtherProperty_val.descriptors.txt
@@ -0,0 +1,3 @@
+expression: 42 / d
+constant: 42
+constantValueKind: Int
diff --git a/analysis/analysis-api/testData/components/compileTimeConstantProvider/evaluate_constantLike/propertyInit_DivByOtherProperty_val.kt b/analysis/analysis-api/testData/components/compileTimeConstantProvider/evaluate_constantLike/propertyInit_DivByOtherProperty_val.kt
new file mode 100644
index 00000000000..541382a7ebb
--- /dev/null
+++ b/analysis/analysis-api/testData/components/compileTimeConstantProvider/evaluate_constantLike/propertyInit_DivByOtherProperty_val.kt
@@ -0,0 +1,2 @@
+val d = 1
+val p = 42 / d
diff --git a/analysis/analysis-api/testData/components/compileTimeConstantProvider/evaluate_constantLike/propertyInit_DivByOtherProperty_val.txt b/analysis/analysis-api/testData/components/compileTimeConstantProvider/evaluate_constantLike/propertyInit_DivByOtherProperty_val.txt
new file mode 100644
index 00000000000..0b934314e80
--- /dev/null
+++ b/analysis/analysis-api/testData/components/compileTimeConstantProvider/evaluate_constantLike/propertyInit_DivByOtherProperty_val.txt
@@ -0,0 +1,3 @@
+expression: 42 / d
+constant: NOT_EVALUATED
+constantValueKind: NOT_EVALUATED
diff --git a/analysis/analysis-api/testData/components/compileTimeConstantProvider/evaluate/propertyInit_DivByZero.descriptors.txt b/analysis/analysis-api/testData/components/compileTimeConstantProvider/evaluate_constantLike/propertyInit_DivByZero.descriptors.txt
similarity index 100%
rename from analysis/analysis-api/testData/components/compileTimeConstantProvider/evaluate/propertyInit_DivByZero.descriptors.txt
rename to analysis/analysis-api/testData/components/compileTimeConstantProvider/evaluate_constantLike/propertyInit_DivByZero.descriptors.txt
diff --git a/analysis/analysis-api/testData/components/compileTimeConstantProvider/evaluate/propertyInit_DivByZero.kt b/analysis/analysis-api/testData/components/compileTimeConstantProvider/evaluate_constantLike/propertyInit_DivByZero.kt
similarity index 100%
rename from analysis/analysis-api/testData/components/compileTimeConstantProvider/evaluate/propertyInit_DivByZero.kt
rename to analysis/analysis-api/testData/components/compileTimeConstantProvider/evaluate_constantLike/propertyInit_DivByZero.kt
diff --git a/analysis/analysis-api/testData/components/compileTimeConstantProvider/evaluate/propertyInit_DivByZero.txt b/analysis/analysis-api/testData/components/compileTimeConstantProvider/evaluate_constantLike/propertyInit_DivByZero.txt
similarity index 100%
rename from analysis/analysis-api/testData/components/compileTimeConstantProvider/evaluate/propertyInit_DivByZero.txt
rename to analysis/analysis-api/testData/components/compileTimeConstantProvider/evaluate_constantLike/propertyInit_DivByZero.txt
diff --git a/analysis/analysis-api/testData/components/compileTimeConstantProvider/evaluate/propertyInit_Double.kt b/analysis/analysis-api/testData/components/compileTimeConstantProvider/evaluate_constantLike/propertyInit_Double.kt
similarity index 100%
rename from analysis/analysis-api/testData/components/compileTimeConstantProvider/evaluate/propertyInit_Double.kt
rename to analysis/analysis-api/testData/components/compileTimeConstantProvider/evaluate_constantLike/propertyInit_Double.kt
diff --git a/analysis/analysis-api/testData/components/compileTimeConstantProvider/evaluate/propertyInit_Double.txt b/analysis/analysis-api/testData/components/compileTimeConstantProvider/evaluate_constantLike/propertyInit_Double.txt
similarity index 100%
rename from analysis/analysis-api/testData/components/compileTimeConstantProvider/evaluate/propertyInit_Double.txt
rename to analysis/analysis-api/testData/components/compileTimeConstantProvider/evaluate_constantLike/propertyInit_Double.txt
diff --git a/analysis/analysis-api/testData/components/compileTimeConstantProvider/evaluate/propertyInit_Float.kt b/analysis/analysis-api/testData/components/compileTimeConstantProvider/evaluate_constantLike/propertyInit_Float.kt
similarity index 100%
rename from analysis/analysis-api/testData/components/compileTimeConstantProvider/evaluate/propertyInit_Float.kt
rename to analysis/analysis-api/testData/components/compileTimeConstantProvider/evaluate_constantLike/propertyInit_Float.kt
diff --git a/analysis/analysis-api/testData/components/compileTimeConstantProvider/evaluate/propertyInit_Float.txt b/analysis/analysis-api/testData/components/compileTimeConstantProvider/evaluate_constantLike/propertyInit_Float.txt
similarity index 100%
rename from analysis/analysis-api/testData/components/compileTimeConstantProvider/evaluate/propertyInit_Float.txt
rename to analysis/analysis-api/testData/components/compileTimeConstantProvider/evaluate_constantLike/propertyInit_Float.txt
diff --git a/analysis/analysis-api/testData/components/compileTimeConstantProvider/evaluate/propertyInit_Int.kt b/analysis/analysis-api/testData/components/compileTimeConstantProvider/evaluate_constantLike/propertyInit_Int.kt
similarity index 100%
rename from analysis/analysis-api/testData/components/compileTimeConstantProvider/evaluate/propertyInit_Int.kt
rename to analysis/analysis-api/testData/components/compileTimeConstantProvider/evaluate_constantLike/propertyInit_Int.kt
diff --git a/analysis/analysis-api/testData/components/compileTimeConstantProvider/evaluate/propertyInit_Int.txt b/analysis/analysis-api/testData/components/compileTimeConstantProvider/evaluate_constantLike/propertyInit_Int.txt
similarity index 100%
rename from analysis/analysis-api/testData/components/compileTimeConstantProvider/evaluate/propertyInit_Int.txt
rename to analysis/analysis-api/testData/components/compileTimeConstantProvider/evaluate_constantLike/propertyInit_Int.txt
diff --git a/analysis/analysis-api/testData/components/compileTimeConstantProvider/evaluate/propertyInit_Long.kt b/analysis/analysis-api/testData/components/compileTimeConstantProvider/evaluate_constantLike/propertyInit_Long.kt
similarity index 100%
rename from analysis/analysis-api/testData/components/compileTimeConstantProvider/evaluate/propertyInit_Long.kt
rename to analysis/analysis-api/testData/components/compileTimeConstantProvider/evaluate_constantLike/propertyInit_Long.kt
diff --git a/analysis/analysis-api/testData/components/compileTimeConstantProvider/evaluate/propertyInit_Long.txt b/analysis/analysis-api/testData/components/compileTimeConstantProvider/evaluate_constantLike/propertyInit_Long.txt
similarity index 100%
rename from analysis/analysis-api/testData/components/compileTimeConstantProvider/evaluate/propertyInit_Long.txt
rename to analysis/analysis-api/testData/components/compileTimeConstantProvider/evaluate_constantLike/propertyInit_Long.txt
diff --git a/analysis/analysis-api/testData/components/compileTimeConstantProvider/evaluate/propertyInit_UInt.kt b/analysis/analysis-api/testData/components/compileTimeConstantProvider/evaluate_constantLike/propertyInit_UInt.kt
similarity index 100%
rename from analysis/analysis-api/testData/components/compileTimeConstantProvider/evaluate/propertyInit_UInt.kt
rename to analysis/analysis-api/testData/components/compileTimeConstantProvider/evaluate_constantLike/propertyInit_UInt.kt
diff --git a/analysis/analysis-api/testData/components/compileTimeConstantProvider/evaluate/propertyInit_UInt.txt b/analysis/analysis-api/testData/components/compileTimeConstantProvider/evaluate_constantLike/propertyInit_UInt.txt
similarity index 100%
rename from analysis/analysis-api/testData/components/compileTimeConstantProvider/evaluate/propertyInit_UInt.txt
rename to analysis/analysis-api/testData/components/compileTimeConstantProvider/evaluate_constantLike/propertyInit_UInt.txt
diff --git a/analysis/analysis-api/testData/components/compileTimeConstantProvider/evaluate/stringLiteral.kt b/analysis/analysis-api/testData/components/compileTimeConstantProvider/evaluate_constantLike/stringLiteral.kt
similarity index 100%
rename from analysis/analysis-api/testData/components/compileTimeConstantProvider/evaluate/stringLiteral.kt
rename to analysis/analysis-api/testData/components/compileTimeConstantProvider/evaluate_constantLike/stringLiteral.kt
diff --git a/analysis/analysis-api/testData/components/compileTimeConstantProvider/evaluate/stringLiteral.txt b/analysis/analysis-api/testData/components/compileTimeConstantProvider/evaluate_constantLike/stringLiteral.txt
similarity index 100%
rename from analysis/analysis-api/testData/components/compileTimeConstantProvider/evaluate/stringLiteral.txt
rename to analysis/analysis-api/testData/components/compileTimeConstantProvider/evaluate_constantLike/stringLiteral.txt
diff --git a/generators/analysis-api-generator/tests/org/jetbrains/kotlin/generators/tests/analysis/api/analysisApi.kt b/generators/analysis-api-generator/tests/org/jetbrains/kotlin/generators/tests/analysis/api/analysisApi.kt
index 6dbf59254f2..09516f36500 100644
--- a/generators/analysis-api-generator/tests/org/jetbrains/kotlin/generators/tests/analysis/api/analysisApi.kt
+++ b/generators/analysis-api-generator/tests/org/jetbrains/kotlin/generators/tests/analysis/api/analysisApi.kt
@@ -15,7 +15,8 @@ import org.jetbrains.kotlin.analysis.api.impl.base.test.annotations.AbstractAnal
import org.jetbrains.kotlin.analysis.api.impl.base.test.annotations.AbstractAnalysisApiAnnotationsOnTypesTest
import org.jetbrains.kotlin.analysis.api.impl.base.test.components.AbstractResolveCallTest
import org.jetbrains.kotlin.analysis.api.impl.base.test.components.AbstractResolveCandidatesTest
-import org.jetbrains.kotlin.analysis.api.impl.base.test.components.compileTimeConstantProvider.AbstractCompileTimeConstantEvaluatorTest
+import org.jetbrains.kotlin.analysis.api.impl.base.test.components.compileTimeConstantProvider.AbstractCompileTimeConstantEvaluatorConstantLikeTest
+import org.jetbrains.kotlin.analysis.api.impl.base.test.components.compileTimeConstantProvider.AbstractCompileTimeConstantEvaluatorConstantTest
import org.jetbrains.kotlin.analysis.api.impl.base.test.components.diagnosticProvider.AbstractCollectDiagnosticsTest
import org.jetbrains.kotlin.analysis.api.impl.base.test.components.expressionInfoProvider.AbstractReturnTargetSymbolTest
import org.jetbrains.kotlin.analysis.api.impl.base.test.components.expressionInfoProvider.AbstractWhenMissingCasesTest
@@ -143,8 +144,11 @@ private fun TestGroupSuite.generateAnalysisApiComponentsTests() {
}
component("compileTimeConstantProvider") {
- test(AbstractCompileTimeConstantEvaluatorTest::class) {
- model("evaluate")
+ test(AbstractCompileTimeConstantEvaluatorConstantTest::class) {
+ model("evaluate_constant")
+ }
+ test(AbstractCompileTimeConstantEvaluatorConstantLikeTest::class) {
+ model("evaluate_constantLike")
}
}