From 3590c4ea352f8841b19bf4f4ba85b686588ff71b Mon Sep 17 00:00:00 2001 From: Anna Kozlova Date: Mon, 7 Nov 2022 11:39:23 +0100 Subject: [PATCH] [Analysis API FIR] support generated temp properties KTIJ-23492 (array index expression), KTIJ-23138 (inc/dec desugaring) --- ...leCompileTimeConstantEvaluatorTestGenerated.java | 12 ++++++++++++ .../components/KtFirCompileTimeConstantProvider.kt | 13 ++++++++----- ...leCompileTimeConstantEvaluatorTestGenerated.java | 12 ++++++++++++ ...leCompileTimeConstantEvaluatorTestGenerated.java | 12 ++++++++++++ ...leCompileTimeConstantEvaluatorTestGenerated.java | 12 ++++++++++++ .../evaluate/arrayWithInc.kt | 5 +++++ .../evaluate/arrayWithInc.txt | 9 +++++++++ .../evaluate/interpolationWithInc.kt | 4 ++++ .../evaluate/interpolationWithInc.txt | 9 +++++++++ .../expressions/arrayIndexExpressionWithInc.kt | 6 ++++++ .../expressions/arrayIndexExpressionWithInc.txt | 6 ++++++ .../getOrBuildFir/expressions/incExpression.kt | 4 ++++ .../getOrBuildFir/expressions/incExpression.txt | 6 ++++++ .../level/api/fir/GetOrBuildFirTestGenerated.java | 12 ++++++++++++ .../jetbrains/kotlin/fir/builder/BaseFirBuilder.kt | 2 +- .../src/org/jetbrains/kotlin/KtSourceElement.kt | 5 +++++ 16 files changed, 123 insertions(+), 6 deletions(-) create mode 100644 analysis/analysis-api/testData/components/compileTimeConstantProvider/evaluate/arrayWithInc.kt create mode 100644 analysis/analysis-api/testData/components/compileTimeConstantProvider/evaluate/arrayWithInc.txt create mode 100644 analysis/analysis-api/testData/components/compileTimeConstantProvider/evaluate/interpolationWithInc.kt create mode 100644 analysis/analysis-api/testData/components/compileTimeConstantProvider/evaluate/interpolationWithInc.txt create mode 100644 analysis/low-level-api-fir/testdata/getOrBuildFir/expressions/arrayIndexExpressionWithInc.kt create mode 100644 analysis/low-level-api-fir/testdata/getOrBuildFir/expressions/arrayIndexExpressionWithInc.txt create mode 100644 analysis/low-level-api-fir/testdata/getOrBuildFir/expressions/incExpression.kt create mode 100644 analysis/low-level-api-fir/testdata/getOrBuildFir/expressions/incExpression.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 9b1ec5d96e4..40426891931 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 @@ -46,6 +46,12 @@ public class Fe10IdeNormalAnalysisSourceModuleCompileTimeConstantEvaluatorTestGe KtTestUtil.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("analysis/analysis-api/testData/components/compileTimeConstantProvider/evaluate"), Pattern.compile("^(.+)\\.kt$"), null, true); } + @Test + @TestMetadata("arrayWithInc.kt") + public void testArrayWithInc() throws Exception { + runTest("analysis/analysis-api/testData/components/compileTimeConstantProvider/evaluate/arrayWithInc.kt"); + } + @Test @TestMetadata("binaryExpressionWithString.kt") public void testBinaryExpressionWithString() throws Exception { @@ -76,6 +82,12 @@ public class Fe10IdeNormalAnalysisSourceModuleCompileTimeConstantEvaluatorTestGe runTest("analysis/analysis-api/testData/components/compileTimeConstantProvider/evaluate/integerLiteral_plusOne_justOne.kt"); } + @Test + @TestMetadata("interpolationWithInc.kt") + public void testInterpolationWithInc() throws Exception { + runTest("analysis/analysis-api/testData/components/compileTimeConstantProvider/evaluate/interpolationWithInc.kt"); + } + @Test @TestMetadata("javaFinalField.kt") public void testJavaFinalField() 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 0b4aa6d28a2..a45e7972830 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 @@ -5,6 +5,7 @@ package org.jetbrains.kotlin.analysis.api.fir.components +import org.jetbrains.kotlin.KtFakeSourceElementKind import org.jetbrains.kotlin.analysis.api.base.KtConstantValue import org.jetbrains.kotlin.analysis.api.components.KtCompileTimeConstantProvider import org.jetbrains.kotlin.analysis.api.components.KtConstantEvaluationMode @@ -14,10 +15,13 @@ import org.jetbrains.kotlin.analysis.api.lifetime.KtLifetimeToken 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.FirProperty import org.jetbrains.kotlin.fir.expressions.FirExpression 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.psi import org.jetbrains.kotlin.psi.KtExpression internal class KtFirCompileTimeConstantProvider( @@ -37,10 +41,8 @@ internal class KtFirCompileTimeConstantProvider( sourcePsi: KtExpression, mode: KtConstantEvaluationMode, ): KtConstantValue? { - return when (fir) { - is FirPropertyAccessExpression, - is FirExpression, - is FirNamedReference -> { + return when { + fir is FirPropertyAccessExpression || fir is FirExpression || fir is FirNamedReference -> { try { FirCompileTimeConstantEvaluator.evaluateAsKtConstantValue(fir, mode) } catch (e: ArithmeticException) { @@ -55,7 +57,8 @@ internal class KtFirCompileTimeConstantProvider( // ``` // `false` does not have a corresponding elements on the FIR side and hence the containing `FirWhenBranch` is returned. In this // case, we simply report null since FIR does not know about it. - is FirWhenBranch -> null + fir is FirWhenBranch -> null + fir is FirVariableAssignment && fir.source?.kind == KtFakeSourceElementKind.DesugaredIncrementOrDecrement -> 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 7faea64abd1..c02c269fec1 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 @@ -46,6 +46,12 @@ public class FirIdeDependentAnalysisSourceModuleCompileTimeConstantEvaluatorTest KtTestUtil.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("analysis/analysis-api/testData/components/compileTimeConstantProvider/evaluate"), Pattern.compile("^(.+)\\.kt$"), null, true); } + @Test + @TestMetadata("arrayWithInc.kt") + public void testArrayWithInc() throws Exception { + runTest("analysis/analysis-api/testData/components/compileTimeConstantProvider/evaluate/arrayWithInc.kt"); + } + @Test @TestMetadata("binaryExpressionWithString.kt") public void testBinaryExpressionWithString() throws Exception { @@ -76,6 +82,12 @@ public class FirIdeDependentAnalysisSourceModuleCompileTimeConstantEvaluatorTest runTest("analysis/analysis-api/testData/components/compileTimeConstantProvider/evaluate/integerLiteral_plusOne_justOne.kt"); } + @Test + @TestMetadata("interpolationWithInc.kt") + public void testInterpolationWithInc() throws Exception { + runTest("analysis/analysis-api/testData/components/compileTimeConstantProvider/evaluate/interpolationWithInc.kt"); + } + @Test @TestMetadata("javaFinalField.kt") public void testJavaFinalField() 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 f0e3302d3c9..9ec82ccbfc1 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 @@ -46,6 +46,12 @@ public class FirIdeNormalAnalysisSourceModuleCompileTimeConstantEvaluatorTestGen KtTestUtil.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("analysis/analysis-api/testData/components/compileTimeConstantProvider/evaluate"), Pattern.compile("^(.+)\\.kt$"), null, true); } + @Test + @TestMetadata("arrayWithInc.kt") + public void testArrayWithInc() throws Exception { + runTest("analysis/analysis-api/testData/components/compileTimeConstantProvider/evaluate/arrayWithInc.kt"); + } + @Test @TestMetadata("binaryExpressionWithString.kt") public void testBinaryExpressionWithString() throws Exception { @@ -76,6 +82,12 @@ public class FirIdeNormalAnalysisSourceModuleCompileTimeConstantEvaluatorTestGen runTest("analysis/analysis-api/testData/components/compileTimeConstantProvider/evaluate/integerLiteral_plusOne_justOne.kt"); } + @Test + @TestMetadata("interpolationWithInc.kt") + public void testInterpolationWithInc() throws Exception { + runTest("analysis/analysis-api/testData/components/compileTimeConstantProvider/evaluate/interpolationWithInc.kt"); + } + @Test @TestMetadata("javaFinalField.kt") public void testJavaFinalField() throws Exception { 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 ebfd34b1b93..0e4f6ae5dc9 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 @@ -46,6 +46,12 @@ public class FirStandaloneNormalAnalysisSourceModuleCompileTimeConstantEvaluator KtTestUtil.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("analysis/analysis-api/testData/components/compileTimeConstantProvider/evaluate"), Pattern.compile("^(.+)\\.kt$"), null, true); } + @Test + @TestMetadata("arrayWithInc.kt") + public void testArrayWithInc() throws Exception { + runTest("analysis/analysis-api/testData/components/compileTimeConstantProvider/evaluate/arrayWithInc.kt"); + } + @Test @TestMetadata("binaryExpressionWithString.kt") public void testBinaryExpressionWithString() throws Exception { @@ -76,6 +82,12 @@ public class FirStandaloneNormalAnalysisSourceModuleCompileTimeConstantEvaluator runTest("analysis/analysis-api/testData/components/compileTimeConstantProvider/evaluate/integerLiteral_plusOne_justOne.kt"); } + @Test + @TestMetadata("interpolationWithInc.kt") + public void testInterpolationWithInc() throws Exception { + runTest("analysis/analysis-api/testData/components/compileTimeConstantProvider/evaluate/interpolationWithInc.kt"); + } + @Test @TestMetadata("javaFinalField.kt") public void testJavaFinalField() throws Exception { diff --git a/analysis/analysis-api/testData/components/compileTimeConstantProvider/evaluate/arrayWithInc.kt b/analysis/analysis-api/testData/components/compileTimeConstantProvider/evaluate/arrayWithInc.kt new file mode 100644 index 00000000000..e84c903bdc9 --- /dev/null +++ b/analysis/analysis-api/testData/components/compileTimeConstantProvider/evaluate/arrayWithInc.kt @@ -0,0 +1,5 @@ +fun main(args: Array) { + val a = ArrayList() + a.add("") + a[0]++ +} \ No newline at end of file diff --git a/analysis/analysis-api/testData/components/compileTimeConstantProvider/evaluate/arrayWithInc.txt b/analysis/analysis-api/testData/components/compileTimeConstantProvider/evaluate/arrayWithInc.txt new file mode 100644 index 00000000000..23a1cd25c5e --- /dev/null +++ b/analysis/analysis-api/testData/components/compileTimeConstantProvider/evaluate/arrayWithInc.txt @@ -0,0 +1,9 @@ +expression: a + +CONSTANT_EXPRESSION_EVALUATION +constant: NOT_EVALUATED +constantValueKind: NOT_EVALUATED + +CONSTANT_LIKE_EXPRESSION_EVALUATION +constantLike: NOT_EVALUATED +constantLikeValueKind: NOT_EVALUATED diff --git a/analysis/analysis-api/testData/components/compileTimeConstantProvider/evaluate/interpolationWithInc.kt b/analysis/analysis-api/testData/components/compileTimeConstantProvider/evaluate/interpolationWithInc.kt new file mode 100644 index 00000000000..bf89b690e2b --- /dev/null +++ b/analysis/analysis-api/testData/components/compileTimeConstantProvider/evaluate/interpolationWithInc.kt @@ -0,0 +1,4 @@ +fun main(args: Array) { + var nextUnnamedLibraryIndex = 1 + val originalName = "${nextUnnamedLibraryIndex++}" +} \ No newline at end of file diff --git a/analysis/analysis-api/testData/components/compileTimeConstantProvider/evaluate/interpolationWithInc.txt b/analysis/analysis-api/testData/components/compileTimeConstantProvider/evaluate/interpolationWithInc.txt new file mode 100644 index 00000000000..4e3175aaf71 --- /dev/null +++ b/analysis/analysis-api/testData/components/compileTimeConstantProvider/evaluate/interpolationWithInc.txt @@ -0,0 +1,9 @@ +expression: nextUnnamedLibraryIndex++ + +CONSTANT_EXPRESSION_EVALUATION +constant: NOT_EVALUATED +constantValueKind: NOT_EVALUATED + +CONSTANT_LIKE_EXPRESSION_EVALUATION +constantLike: NOT_EVALUATED +constantLikeValueKind: NOT_EVALUATED diff --git a/analysis/low-level-api-fir/testdata/getOrBuildFir/expressions/arrayIndexExpressionWithInc.kt b/analysis/low-level-api-fir/testdata/getOrBuildFir/expressions/arrayIndexExpressionWithInc.kt new file mode 100644 index 00000000000..b67629eae16 --- /dev/null +++ b/analysis/low-level-api-fir/testdata/getOrBuildFir/expressions/arrayIndexExpressionWithInc.kt @@ -0,0 +1,6 @@ +// WITH_STDLIB +fun main(args: Array) { + val a = ArrayList() + a.add("") + a[0]++ +} \ No newline at end of file diff --git a/analysis/low-level-api-fir/testdata/getOrBuildFir/expressions/arrayIndexExpressionWithInc.txt b/analysis/low-level-api-fir/testdata/getOrBuildFir/expressions/arrayIndexExpressionWithInc.txt new file mode 100644 index 00000000000..213b301480e --- /dev/null +++ b/analysis/low-level-api-fir/testdata/getOrBuildFir/expressions/arrayIndexExpressionWithInc.txt @@ -0,0 +1,6 @@ +KT element: KtConstantExpression +FIR element: FirConstExpressionImpl +FIR source kind: KtRealSourceElementKind + +FIR element rendered: +Int(0) \ No newline at end of file diff --git a/analysis/low-level-api-fir/testdata/getOrBuildFir/expressions/incExpression.kt b/analysis/low-level-api-fir/testdata/getOrBuildFir/expressions/incExpression.kt new file mode 100644 index 00000000000..bf89b690e2b --- /dev/null +++ b/analysis/low-level-api-fir/testdata/getOrBuildFir/expressions/incExpression.kt @@ -0,0 +1,4 @@ +fun main(args: Array) { + var nextUnnamedLibraryIndex = 1 + val originalName = "${nextUnnamedLibraryIndex++}" +} \ No newline at end of file diff --git a/analysis/low-level-api-fir/testdata/getOrBuildFir/expressions/incExpression.txt b/analysis/low-level-api-fir/testdata/getOrBuildFir/expressions/incExpression.txt new file mode 100644 index 00000000000..f6eff5c5ba5 --- /dev/null +++ b/analysis/low-level-api-fir/testdata/getOrBuildFir/expressions/incExpression.txt @@ -0,0 +1,6 @@ +KT element: KtPostfixExpression +FIR element: FirVariableAssignmentImpl +FIR source kind: DesugaredIncrementOrDecrement + +FIR element rendered: +R|/nextUnnamedLibraryIndex| = R|/|.R|kotlin/Int.inc|() \ No newline at end of file diff --git a/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/GetOrBuildFirTestGenerated.java b/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/GetOrBuildFirTestGenerated.java index d5913b95425..ebadbcd07a9 100644 --- a/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/GetOrBuildFirTestGenerated.java +++ b/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/GetOrBuildFirTestGenerated.java @@ -255,6 +255,12 @@ public class GetOrBuildFirTestGenerated extends AbstractGetOrBuildFirTest { runTest("analysis/low-level-api-fir/testdata/getOrBuildFir/expressions/arrayAccessExpression.kt"); } + @Test + @TestMetadata("arrayIndexExpressionWithInc.kt") + public void testArrayIndexExpressionWithInc() throws Exception { + runTest("analysis/low-level-api-fir/testdata/getOrBuildFir/expressions/arrayIndexExpressionWithInc.kt"); + } + @Test @TestMetadata("asExpression.kt") public void testAsExpression() throws Exception { @@ -315,6 +321,12 @@ public class GetOrBuildFirTestGenerated extends AbstractGetOrBuildFirTest { runTest("analysis/low-level-api-fir/testdata/getOrBuildFir/expressions/ifExpression.kt"); } + @Test + @TestMetadata("incExpression.kt") + public void testIncExpression() throws Exception { + runTest("analysis/low-level-api-fir/testdata/getOrBuildFir/expressions/incExpression.kt"); + } + @Test @TestMetadata("insidePlusAssignTarget.kt") public void testInsidePlusAssignTarget() throws Exception { diff --git a/compiler/fir/raw-fir/raw-fir.common/src/org/jetbrains/kotlin/fir/builder/BaseFirBuilder.kt b/compiler/fir/raw-fir/raw-fir.common/src/org/jetbrains/kotlin/fir/builder/BaseFirBuilder.kt index a297ce8b9ab..d9df4488367 100644 --- a/compiler/fir/raw-fir/raw-fir.common/src/org/jetbrains/kotlin/fir/builder/BaseFirBuilder.kt +++ b/compiler/fir/raw-fir/raw-fir.common/src/org/jetbrains/kotlin/fir/builder/BaseFirBuilder.kt @@ -810,7 +810,7 @@ abstract class BaseFirBuilder(val baseSession: FirSession, val context: Conte val indexVariables = indices.mapIndexed { i, index -> generateTemporaryVariable( baseModuleData, - index.toFirSourceElement(), + index.toFirSourceElement(KtFakeSourceElementKind.ArrayIndexExpressionReference), name = SpecialNames.subscribeOperatorIndex(i), index.convert() ).also { statements += it } diff --git a/compiler/frontend.common/src/org/jetbrains/kotlin/KtSourceElement.kt b/compiler/frontend.common/src/org/jetbrains/kotlin/KtSourceElement.kt index 310e385f1b8..75563d4af08 100644 --- a/compiler/frontend.common/src/org/jetbrains/kotlin/KtSourceElement.kt +++ b/compiler/frontend.common/src/org/jetbrains/kotlin/KtSourceElement.kt @@ -163,6 +163,11 @@ sealed class KtFakeSourceElementKind : KtSourceElementKind() { // list[0] -> list.get(0) where name reference will have a fake source element object ArrayAccessNameReference : KtFakeSourceElementKind() + // a[b]++ + // b -> val = b where b will have fake property + object ArrayIndexExpressionReference : KtFakeSourceElementKind() + + // super.foo() --> super.foo() // where `Supertype` has a fake source object SuperCallImplicitType : KtFakeSourceElementKind()