From f80ed4592da543c2d5a16a1283926609cf1394b6 Mon Sep 17 00:00:00 2001 From: Anna Kozlova Date: Wed, 14 Jun 2023 14:09:53 +0200 Subject: [PATCH] [AA] Handle KtTypeReference children in CompileTimeConstantProvider CompileTimeConstantProvider could receive a reference expression, whose grandparent is KtTypeReference (seen that in UAST inspection). FIR would not contain anything explicit for this reference, FirResolvedTypeRef would be received as the nearest parent. Of course, in this case, there could be no compile time constant anyway. --- ...eModuleCompileTimeConstantEvaluatorTestGenerated.java | 6 ++++++ .../fir/components/KtFirCompileTimeConstantProvider.kt | 2 ++ ...eModuleCompileTimeConstantEvaluatorTestGenerated.java | 6 ++++++ ...eModuleCompileTimeConstantEvaluatorTestGenerated.java | 6 ++++++ .../AbstractCompileTimeConstantEvaluatorTest.kt | 2 +- ...eModuleCompileTimeConstantEvaluatorTestGenerated.java | 6 ++++++ .../evaluate/namedReference_userType.kt | 6 ++++++ .../evaluate/namedReference_userType.txt | 9 +++++++++ 8 files changed, 42 insertions(+), 1 deletion(-) create mode 100644 analysis/analysis-api/testData/components/compileTimeConstantProvider/evaluate/namedReference_userType.kt create mode 100644 analysis/analysis-api/testData/components/compileTimeConstantProvider/evaluate/namedReference_userType.txt diff --git a/analysis/analysis-api-fe10/tests-gen/org/jetbrains/kotlin/analysis/api/fe10/test/cases/generated/cases/components/compileTimeConstantProvider/Fe10IdeNormalAnalysisSourceModuleCompileTimeConstantEvaluatorTestGenerated.java b/analysis/analysis-api-fe10/tests-gen/org/jetbrains/kotlin/analysis/api/fe10/test/cases/generated/cases/components/compileTimeConstantProvider/Fe10IdeNormalAnalysisSourceModuleCompileTimeConstantEvaluatorTestGenerated.java index 0c4c02180ef..3bf2de9a2da 100644 --- a/analysis/analysis-api-fe10/tests-gen/org/jetbrains/kotlin/analysis/api/fe10/test/cases/generated/cases/components/compileTimeConstantProvider/Fe10IdeNormalAnalysisSourceModuleCompileTimeConstantEvaluatorTestGenerated.java +++ b/analysis/analysis-api-fe10/tests-gen/org/jetbrains/kotlin/analysis/api/fe10/test/cases/generated/cases/components/compileTimeConstantProvider/Fe10IdeNormalAnalysisSourceModuleCompileTimeConstantEvaluatorTestGenerated.java @@ -112,6 +112,12 @@ public class Fe10IdeNormalAnalysisSourceModuleCompileTimeConstantEvaluatorTestGe runTest("analysis/analysis-api/testData/components/compileTimeConstantProvider/evaluate/namedReference_const.kt"); } + @Test + @TestMetadata("namedReference_userType.kt") + public void testNamedReference_userType() throws Exception { + runTest("analysis/analysis-api/testData/components/compileTimeConstantProvider/evaluate/namedReference_userType.kt"); + } + @Test @TestMetadata("namedReference_val.kt") public void testNamedReference_val() throws Exception { 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 9579734f6a4..ca3ed5edef4 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 @@ -24,6 +24,7 @@ import org.jetbrains.kotlin.fir.expressions.FirPropertyAccessExpression import org.jetbrains.kotlin.fir.expressions.FirVariableAssignment import org.jetbrains.kotlin.fir.expressions.FirWhenBranch import org.jetbrains.kotlin.fir.references.FirNamedReference +import org.jetbrains.kotlin.fir.types.FirTypeRef import org.jetbrains.kotlin.psi import org.jetbrains.kotlin.psi.KtExpression @@ -67,6 +68,7 @@ internal class KtFirCompileTimeConstantProvider( // case, we simply report null since FIR does not know about it. fir is FirWhenBranch -> null fir is FirVariableAssignment && fir.source?.kind == KtFakeSourceElementKind.DesugaredIncrementOrDecrement -> null + fir is FirTypeRef -> null else -> throwUnexpectedFirElementError(fir, sourcePsi) } } diff --git a/analysis/analysis-api-fir/tests-gen/org/jetbrains/kotlin/analysis/api/fir/test/cases/generated/cases/components/compileTimeConstantProvider/FirIdeDependentAnalysisSourceModuleCompileTimeConstantEvaluatorTestGenerated.java b/analysis/analysis-api-fir/tests-gen/org/jetbrains/kotlin/analysis/api/fir/test/cases/generated/cases/components/compileTimeConstantProvider/FirIdeDependentAnalysisSourceModuleCompileTimeConstantEvaluatorTestGenerated.java index bbf9259be5e..f394835f1ce 100644 --- a/analysis/analysis-api-fir/tests-gen/org/jetbrains/kotlin/analysis/api/fir/test/cases/generated/cases/components/compileTimeConstantProvider/FirIdeDependentAnalysisSourceModuleCompileTimeConstantEvaluatorTestGenerated.java +++ b/analysis/analysis-api-fir/tests-gen/org/jetbrains/kotlin/analysis/api/fir/test/cases/generated/cases/components/compileTimeConstantProvider/FirIdeDependentAnalysisSourceModuleCompileTimeConstantEvaluatorTestGenerated.java @@ -112,6 +112,12 @@ public class FirIdeDependentAnalysisSourceModuleCompileTimeConstantEvaluatorTest runTest("analysis/analysis-api/testData/components/compileTimeConstantProvider/evaluate/namedReference_const.kt"); } + @Test + @TestMetadata("namedReference_userType.kt") + public void testNamedReference_userType() throws Exception { + runTest("analysis/analysis-api/testData/components/compileTimeConstantProvider/evaluate/namedReference_userType.kt"); + } + @Test @TestMetadata("namedReference_val.kt") public void testNamedReference_val() throws Exception { diff --git a/analysis/analysis-api-fir/tests-gen/org/jetbrains/kotlin/analysis/api/fir/test/cases/generated/cases/components/compileTimeConstantProvider/FirIdeNormalAnalysisSourceModuleCompileTimeConstantEvaluatorTestGenerated.java b/analysis/analysis-api-fir/tests-gen/org/jetbrains/kotlin/analysis/api/fir/test/cases/generated/cases/components/compileTimeConstantProvider/FirIdeNormalAnalysisSourceModuleCompileTimeConstantEvaluatorTestGenerated.java index 2b40bc8151b..f3fec2c36d1 100644 --- a/analysis/analysis-api-fir/tests-gen/org/jetbrains/kotlin/analysis/api/fir/test/cases/generated/cases/components/compileTimeConstantProvider/FirIdeNormalAnalysisSourceModuleCompileTimeConstantEvaluatorTestGenerated.java +++ b/analysis/analysis-api-fir/tests-gen/org/jetbrains/kotlin/analysis/api/fir/test/cases/generated/cases/components/compileTimeConstantProvider/FirIdeNormalAnalysisSourceModuleCompileTimeConstantEvaluatorTestGenerated.java @@ -112,6 +112,12 @@ public class FirIdeNormalAnalysisSourceModuleCompileTimeConstantEvaluatorTestGen runTest("analysis/analysis-api/testData/components/compileTimeConstantProvider/evaluate/namedReference_const.kt"); } + @Test + @TestMetadata("namedReference_userType.kt") + public void testNamedReference_userType() throws Exception { + runTest("analysis/analysis-api/testData/components/compileTimeConstantProvider/evaluate/namedReference_userType.kt"); + } + @Test @TestMetadata("namedReference_val.kt") public void testNamedReference_val() throws Exception { diff --git a/analysis/analysis-api-impl-base/tests/org/jetbrains/kotlin/analysis/api/impl/base/test/cases/components/compileTimeConstantProvider/AbstractCompileTimeConstantEvaluatorTest.kt b/analysis/analysis-api-impl-base/tests/org/jetbrains/kotlin/analysis/api/impl/base/test/cases/components/compileTimeConstantProvider/AbstractCompileTimeConstantEvaluatorTest.kt index 66041ebfc20..67d4594f120 100644 --- a/analysis/analysis-api-impl-base/tests/org/jetbrains/kotlin/analysis/api/impl/base/test/cases/components/compileTimeConstantProvider/AbstractCompileTimeConstantEvaluatorTest.kt +++ b/analysis/analysis-api-impl-base/tests/org/jetbrains/kotlin/analysis/api/impl/base/test/cases/components/compileTimeConstantProvider/AbstractCompileTimeConstantEvaluatorTest.kt @@ -18,7 +18,7 @@ import org.jetbrains.kotlin.test.services.assertions abstract class AbstractCompileTimeConstantEvaluatorTest : AbstractAnalysisApiSingleFileTest() { override fun doTestByFileStructure(ktFile: KtFile, module: TestModule, testServices: TestServices) { - val element = testServices.expressionMarkerProvider.getSelectedElement(ktFile) + val element = testServices.expressionMarkerProvider.getSelectedElementOfTypeByDirective(ktFile, module) val expression = when (element) { is KtExpression -> element is KtValueArgument -> element.getArgumentExpression() diff --git a/analysis/analysis-api-standalone/tests-gen/org/jetbrains/kotlin/analysis/api/standalone/fir/test/cases/generated/cases/components/compileTimeConstantProvider/FirStandaloneNormalAnalysisSourceModuleCompileTimeConstantEvaluatorTestGenerated.java b/analysis/analysis-api-standalone/tests-gen/org/jetbrains/kotlin/analysis/api/standalone/fir/test/cases/generated/cases/components/compileTimeConstantProvider/FirStandaloneNormalAnalysisSourceModuleCompileTimeConstantEvaluatorTestGenerated.java index 00142ea12e6..e450a8f4f3e 100644 --- a/analysis/analysis-api-standalone/tests-gen/org/jetbrains/kotlin/analysis/api/standalone/fir/test/cases/generated/cases/components/compileTimeConstantProvider/FirStandaloneNormalAnalysisSourceModuleCompileTimeConstantEvaluatorTestGenerated.java +++ b/analysis/analysis-api-standalone/tests-gen/org/jetbrains/kotlin/analysis/api/standalone/fir/test/cases/generated/cases/components/compileTimeConstantProvider/FirStandaloneNormalAnalysisSourceModuleCompileTimeConstantEvaluatorTestGenerated.java @@ -112,6 +112,12 @@ public class FirStandaloneNormalAnalysisSourceModuleCompileTimeConstantEvaluator runTest("analysis/analysis-api/testData/components/compileTimeConstantProvider/evaluate/namedReference_const.kt"); } + @Test + @TestMetadata("namedReference_userType.kt") + public void testNamedReference_userType() throws Exception { + runTest("analysis/analysis-api/testData/components/compileTimeConstantProvider/evaluate/namedReference_userType.kt"); + } + @Test @TestMetadata("namedReference_val.kt") public void testNamedReference_val() throws Exception { diff --git a/analysis/analysis-api/testData/components/compileTimeConstantProvider/evaluate/namedReference_userType.kt b/analysis/analysis-api/testData/components/compileTimeConstantProvider/evaluate/namedReference_userType.kt new file mode 100644 index 00000000000..95c7bb893f4 --- /dev/null +++ b/analysis/analysis-api/testData/components/compileTimeConstantProvider/evaluate/namedReference_userType.kt @@ -0,0 +1,6 @@ +// LOOK_UP_FOR_ELEMENT_OF_TYPE: KtNameReferenceExpression +class Test { + fun box(t : Test?) { + val inst = t is Test + } +} diff --git a/analysis/analysis-api/testData/components/compileTimeConstantProvider/evaluate/namedReference_userType.txt b/analysis/analysis-api/testData/components/compileTimeConstantProvider/evaluate/namedReference_userType.txt new file mode 100644 index 00000000000..85eeb6ecf9b --- /dev/null +++ b/analysis/analysis-api/testData/components/compileTimeConstantProvider/evaluate/namedReference_userType.txt @@ -0,0 +1,9 @@ +expression: Test + +CONSTANT_EXPRESSION_EVALUATION +constant: NOT_EVALUATED +constantValueKind: NOT_EVALUATED + +CONSTANT_LIKE_EXPRESSION_EVALUATION +constantLike: NOT_EVALUATED +constantLikeValueKind: NOT_EVALUATED