From 068e81570d79954fb0444d033ce02c96ad6b86b7 Mon Sep 17 00:00:00 2001 From: Jinseong Jeon Date: Mon, 13 Sep 2021 11:00:41 -0700 Subject: [PATCH] FIR IDE: type-aware constant conversion --- ...bstractCompileTimeConstantEvaluatorTest.kt | 31 ++++++++++ .../AbstractExpectedExpressionTypeTest.kt | 2 - ...ileTimeConstantEvaluatorTestGenerated.java | 62 +++++++++++++++++++ .../api/symbols/markers/KtConstantValue.kt | 20 +++++- .../propertyInit_Byte.kt | 1 + .../propertyInit_Byte.txt | 3 + .../propertyInit_Double.kt | 1 + .../propertyInit_Double.txt | 3 + .../propertyInit_Float.kt | 1 + .../propertyInit_Float.txt | 3 + .../propertyInit_Int.kt | 1 + .../propertyInit_Int.txt | 3 + .../propertyInit_Long.kt | 1 + .../propertyInit_Long.txt | 3 + .../propertyInit_UInt.kt | 1 + .../propertyInit_UInt.txt | 3 + .../tests/analysis/api/GenerateTests.kt | 6 +- 17 files changed, 141 insertions(+), 4 deletions(-) create mode 100644 analysis/analysis-api-fir/tests/org/jetbrains/kotlin/analysis/api/fir/components/AbstractCompileTimeConstantEvaluatorTest.kt create mode 100644 analysis/analysis-api-fir/tests/org/jetbrains/kotlin/analysis/api/fir/components/CompileTimeConstantEvaluatorTestGenerated.java create mode 100644 analysis/analysis-api/testData/components/compileTimeConstantEvaluator/propertyInit_Byte.kt create mode 100644 analysis/analysis-api/testData/components/compileTimeConstantEvaluator/propertyInit_Byte.txt create mode 100644 analysis/analysis-api/testData/components/compileTimeConstantEvaluator/propertyInit_Double.kt create mode 100644 analysis/analysis-api/testData/components/compileTimeConstantEvaluator/propertyInit_Double.txt create mode 100644 analysis/analysis-api/testData/components/compileTimeConstantEvaluator/propertyInit_Float.kt create mode 100644 analysis/analysis-api/testData/components/compileTimeConstantEvaluator/propertyInit_Float.txt create mode 100644 analysis/analysis-api/testData/components/compileTimeConstantEvaluator/propertyInit_Int.kt create mode 100644 analysis/analysis-api/testData/components/compileTimeConstantEvaluator/propertyInit_Int.txt create mode 100644 analysis/analysis-api/testData/components/compileTimeConstantEvaluator/propertyInit_Long.kt create mode 100644 analysis/analysis-api/testData/components/compileTimeConstantEvaluator/propertyInit_Long.txt create mode 100644 analysis/analysis-api/testData/components/compileTimeConstantEvaluator/propertyInit_UInt.kt create mode 100644 analysis/analysis-api/testData/components/compileTimeConstantEvaluator/propertyInit_UInt.txt diff --git a/analysis/analysis-api-fir/tests/org/jetbrains/kotlin/analysis/api/fir/components/AbstractCompileTimeConstantEvaluatorTest.kt b/analysis/analysis-api-fir/tests/org/jetbrains/kotlin/analysis/api/fir/components/AbstractCompileTimeConstantEvaluatorTest.kt new file mode 100644 index 00000000000..b38224c10f1 --- /dev/null +++ b/analysis/analysis-api-fir/tests/org/jetbrains/kotlin/analysis/api/fir/components/AbstractCompileTimeConstantEvaluatorTest.kt @@ -0,0 +1,31 @@ +/* + * 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 + +import org.jetbrains.kotlin.analysis.api.fir.executeOnPooledThreadInReadAction +import org.jetbrains.kotlin.analysis.api.fir.test.framework.AbstractHLApiSingleFileTest +import org.jetbrains.kotlin.analysis.low.level.api.fir.test.base.expressionMarkerProvider +import org.jetbrains.kotlin.analysis.api.analyse +import org.jetbrains.kotlin.psi.KtExpression +import org.jetbrains.kotlin.psi.KtFile +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() { + override fun doTestByFileStructure(ktFile: KtFile, module: TestModule, testServices: TestServices) { + val expression = testServices.expressionMarkerProvider.getSelectedElement(ktFile) as KtExpression + val constantValue = executeOnPooledThreadInReadAction { + analyse(expression) { expression.evaluate() } + } + val actual = buildString { + appendLine("expression: ${expression.text}") + appendLine("constant_value: $constantValue") + appendLine("constant: ${constantValue?.toConst()}") + } + testServices.assertions.assertEqualsToFile(testDataFileSibling(".txt"), actual) + } +} diff --git a/analysis/analysis-api-fir/tests/org/jetbrains/kotlin/analysis/api/fir/components/AbstractExpectedExpressionTypeTest.kt b/analysis/analysis-api-fir/tests/org/jetbrains/kotlin/analysis/api/fir/components/AbstractExpectedExpressionTypeTest.kt index 29a336e3ddc..b9ed0091608 100644 --- a/analysis/analysis-api-fir/tests/org/jetbrains/kotlin/analysis/api/fir/components/AbstractExpectedExpressionTypeTest.kt +++ b/analysis/analysis-api-fir/tests/org/jetbrains/kotlin/analysis/api/fir/components/AbstractExpectedExpressionTypeTest.kt @@ -7,13 +7,11 @@ package org.jetbrains.kotlin.analysis.api.fir.components import org.jetbrains.kotlin.analysis.api.fir.executeOnPooledThreadInReadAction import org.jetbrains.kotlin.analysis.api.fir.test.framework.AbstractHLApiSingleFileTest -import org.jetbrains.kotlin.analysis.low.level.api.fir.test.base.AbstractLowLevelApiSingleFileTest import org.jetbrains.kotlin.analysis.low.level.api.fir.test.base.expressionMarkerProvider import org.jetbrains.kotlin.analysis.api.analyse import org.jetbrains.kotlin.psi.KtExpression import org.jetbrains.kotlin.psi.KtFile import org.jetbrains.kotlin.test.model.TestModule -import org.jetbrains.kotlin.test.services.TestModuleStructure import org.jetbrains.kotlin.test.services.TestServices import org.jetbrains.kotlin.test.services.assertions diff --git a/analysis/analysis-api-fir/tests/org/jetbrains/kotlin/analysis/api/fir/components/CompileTimeConstantEvaluatorTestGenerated.java b/analysis/analysis-api-fir/tests/org/jetbrains/kotlin/analysis/api/fir/components/CompileTimeConstantEvaluatorTestGenerated.java new file mode 100644 index 00000000000..ac45838f878 --- /dev/null +++ b/analysis/analysis-api-fir/tests/org/jetbrains/kotlin/analysis/api/fir/components/CompileTimeConstantEvaluatorTestGenerated.java @@ -0,0 +1,62 @@ +/* + * 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; + +import com.intellij.testFramework.TestDataPath; +import org.jetbrains.kotlin.test.util.KtTestUtil; +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/compileTimeConstantEvaluator") +@TestDataPath("$PROJECT_ROOT") +public class CompileTimeConstantEvaluatorTestGenerated extends AbstractCompileTimeConstantEvaluatorTest { + @Test + public void testAllFilesPresentInCompileTimeConstantEvaluator() throws Exception { + KtTestUtil.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("analysis/analysis-api/testData/components/compileTimeConstantEvaluator"), Pattern.compile("^(.+)\\.kt$"), null, true); + } + + @Test + @TestMetadata("propertyInit_Byte.kt") + public void testPropertyInit_Byte() throws Exception { + runTest("analysis/analysis-api/testData/components/compileTimeConstantEvaluator/propertyInit_Byte.kt"); + } + + @Test + @TestMetadata("propertyInit_Double.kt") + public void testPropertyInit_Double() throws Exception { + runTest("analysis/analysis-api/testData/components/compileTimeConstantEvaluator/propertyInit_Double.kt"); + } + + @Test + @TestMetadata("propertyInit_Float.kt") + public void testPropertyInit_Float() throws Exception { + runTest("analysis/analysis-api/testData/components/compileTimeConstantEvaluator/propertyInit_Float.kt"); + } + + @Test + @TestMetadata("propertyInit_Int.kt") + public void testPropertyInit_Int() throws Exception { + runTest("analysis/analysis-api/testData/components/compileTimeConstantEvaluator/propertyInit_Int.kt"); + } + + @Test + @TestMetadata("propertyInit_Long.kt") + public void testPropertyInit_Long() throws Exception { + runTest("analysis/analysis-api/testData/components/compileTimeConstantEvaluator/propertyInit_Long.kt"); + } + + @Test + @TestMetadata("propertyInit_UInt.kt") + public void testPropertyInit_UInt() throws Exception { + runTest("analysis/analysis-api/testData/components/compileTimeConstantEvaluator/propertyInit_UInt.kt"); + } +} diff --git a/analysis/analysis-api/src/org/jetbrains/kotlin/analysis/api/symbols/markers/KtConstantValue.kt b/analysis/analysis-api/src/org/jetbrains/kotlin/analysis/api/symbols/markers/KtConstantValue.kt index 19542f0b972..2ddd2b92502 100644 --- a/analysis/analysis-api/src/org/jetbrains/kotlin/analysis/api/symbols/markers/KtConstantValue.kt +++ b/analysis/analysis-api/src/org/jetbrains/kotlin/analysis/api/symbols/markers/KtConstantValue.kt @@ -10,4 +10,22 @@ import org.jetbrains.kotlin.types.ConstantValueKind public sealed class KtConstantValue public object KtUnsupportedConstantValue : KtConstantValue() -public data class KtSimpleConstantValue(val constantValueKind: ConstantValueKind, val value: T) : KtConstantValue() \ No newline at end of file +public data class KtSimpleConstantValue(val constantValueKind: ConstantValueKind, val value: T) : KtConstantValue() { + public fun toConst(): Any? { + return (value as? Long)?.let { + when (constantValueKind) { + ConstantValueKind.Byte -> it.toByte() + ConstantValueKind.Short -> it.toShort() + ConstantValueKind.Int -> it.toInt() + ConstantValueKind.Float -> it.toFloat() + ConstantValueKind.Double -> it.toDouble() + + ConstantValueKind.UnsignedByte -> it.toUByte() + ConstantValueKind.UnsignedShort -> it.toUShort() + ConstantValueKind.UnsignedInt -> it.toUInt() + ConstantValueKind.UnsignedLong -> it.toULong() + else -> it + } + } ?: value + } +} diff --git a/analysis/analysis-api/testData/components/compileTimeConstantEvaluator/propertyInit_Byte.kt b/analysis/analysis-api/testData/components/compileTimeConstantEvaluator/propertyInit_Byte.kt new file mode 100644 index 00000000000..dc1b6eaf690 --- /dev/null +++ b/analysis/analysis-api/testData/components/compileTimeConstantEvaluator/propertyInit_Byte.kt @@ -0,0 +1 @@ +val p : Byte = 42 diff --git a/analysis/analysis-api/testData/components/compileTimeConstantEvaluator/propertyInit_Byte.txt b/analysis/analysis-api/testData/components/compileTimeConstantEvaluator/propertyInit_Byte.txt new file mode 100644 index 00000000000..23ac3809aa3 --- /dev/null +++ b/analysis/analysis-api/testData/components/compileTimeConstantEvaluator/propertyInit_Byte.txt @@ -0,0 +1,3 @@ +expression: 42 +constant_value: KtSimpleConstantValue(constantValueKind=Byte, value=42) +constant: 42 diff --git a/analysis/analysis-api/testData/components/compileTimeConstantEvaluator/propertyInit_Double.kt b/analysis/analysis-api/testData/components/compileTimeConstantEvaluator/propertyInit_Double.kt new file mode 100644 index 00000000000..5b3bc0ebea8 --- /dev/null +++ b/analysis/analysis-api/testData/components/compileTimeConstantEvaluator/propertyInit_Double.kt @@ -0,0 +1 @@ +val p : Double = 3.14 diff --git a/analysis/analysis-api/testData/components/compileTimeConstantEvaluator/propertyInit_Double.txt b/analysis/analysis-api/testData/components/compileTimeConstantEvaluator/propertyInit_Double.txt new file mode 100644 index 00000000000..88364497430 --- /dev/null +++ b/analysis/analysis-api/testData/components/compileTimeConstantEvaluator/propertyInit_Double.txt @@ -0,0 +1,3 @@ +expression: 3.14 +constant_value: KtSimpleConstantValue(constantValueKind=Double, value=3.14) +constant: 3.14 diff --git a/analysis/analysis-api/testData/components/compileTimeConstantEvaluator/propertyInit_Float.kt b/analysis/analysis-api/testData/components/compileTimeConstantEvaluator/propertyInit_Float.kt new file mode 100644 index 00000000000..d27cbd82683 --- /dev/null +++ b/analysis/analysis-api/testData/components/compileTimeConstantEvaluator/propertyInit_Float.kt @@ -0,0 +1 @@ +val p = 3.14f diff --git a/analysis/analysis-api/testData/components/compileTimeConstantEvaluator/propertyInit_Float.txt b/analysis/analysis-api/testData/components/compileTimeConstantEvaluator/propertyInit_Float.txt new file mode 100644 index 00000000000..c94f8be0ce3 --- /dev/null +++ b/analysis/analysis-api/testData/components/compileTimeConstantEvaluator/propertyInit_Float.txt @@ -0,0 +1,3 @@ +expression: 3.14f +constant_value: KtSimpleConstantValue(constantValueKind=Float, value=3.14) +constant: 3.14 diff --git a/analysis/analysis-api/testData/components/compileTimeConstantEvaluator/propertyInit_Int.kt b/analysis/analysis-api/testData/components/compileTimeConstantEvaluator/propertyInit_Int.kt new file mode 100644 index 00000000000..4cbfe3df90a --- /dev/null +++ b/analysis/analysis-api/testData/components/compileTimeConstantEvaluator/propertyInit_Int.kt @@ -0,0 +1 @@ +val p : Int = 42 diff --git a/analysis/analysis-api/testData/components/compileTimeConstantEvaluator/propertyInit_Int.txt b/analysis/analysis-api/testData/components/compileTimeConstantEvaluator/propertyInit_Int.txt new file mode 100644 index 00000000000..2c1a918dcdd --- /dev/null +++ b/analysis/analysis-api/testData/components/compileTimeConstantEvaluator/propertyInit_Int.txt @@ -0,0 +1,3 @@ +expression: 42 +constant_value: KtSimpleConstantValue(constantValueKind=Int, value=42) +constant: 42 diff --git a/analysis/analysis-api/testData/components/compileTimeConstantEvaluator/propertyInit_Long.kt b/analysis/analysis-api/testData/components/compileTimeConstantEvaluator/propertyInit_Long.kt new file mode 100644 index 00000000000..bb89172bf56 --- /dev/null +++ b/analysis/analysis-api/testData/components/compileTimeConstantEvaluator/propertyInit_Long.kt @@ -0,0 +1 @@ +val p : Long = 42 diff --git a/analysis/analysis-api/testData/components/compileTimeConstantEvaluator/propertyInit_Long.txt b/analysis/analysis-api/testData/components/compileTimeConstantEvaluator/propertyInit_Long.txt new file mode 100644 index 00000000000..685d8df0a8f --- /dev/null +++ b/analysis/analysis-api/testData/components/compileTimeConstantEvaluator/propertyInit_Long.txt @@ -0,0 +1,3 @@ +expression: 42 +constant_value: KtSimpleConstantValue(constantValueKind=Long, value=42) +constant: 42 diff --git a/analysis/analysis-api/testData/components/compileTimeConstantEvaluator/propertyInit_UInt.kt b/analysis/analysis-api/testData/components/compileTimeConstantEvaluator/propertyInit_UInt.kt new file mode 100644 index 00000000000..27b20e3c133 --- /dev/null +++ b/analysis/analysis-api/testData/components/compileTimeConstantEvaluator/propertyInit_UInt.kt @@ -0,0 +1 @@ +val p : UInt = 42u diff --git a/analysis/analysis-api/testData/components/compileTimeConstantEvaluator/propertyInit_UInt.txt b/analysis/analysis-api/testData/components/compileTimeConstantEvaluator/propertyInit_UInt.txt new file mode 100644 index 00000000000..42ee25c57ec --- /dev/null +++ b/analysis/analysis-api/testData/components/compileTimeConstantEvaluator/propertyInit_UInt.txt @@ -0,0 +1,3 @@ +expression: 42u +constant_value: KtSimpleConstantValue(constantValueKind=UInt, value=42) +constant: 42 diff --git a/generators/analysis-api-generator/tests/org/jetbrains/kotlin/generators/tests/analysis/api/GenerateTests.kt b/generators/analysis-api-generator/tests/org/jetbrains/kotlin/generators/tests/analysis/api/GenerateTests.kt index 6ff72b53166..0eee306851e 100644 --- a/generators/analysis-api-generator/tests/org/jetbrains/kotlin/generators/tests/analysis/api/GenerateTests.kt +++ b/generators/analysis-api-generator/tests/org/jetbrains/kotlin/generators/tests/analysis/api/GenerateTests.kt @@ -57,6 +57,10 @@ fun main(args: Array) { model("symbols/symbolByReference") } + testClass { + model("components/compileTimeConstantEvaluator") + } + testClass { model("components/expectedExpressionType") } @@ -169,4 +173,4 @@ fun main(args: Array) { } } } -} \ No newline at end of file +}