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") } }