From 21026cc70429373a6a4e86e43ba6ed70dab3a8be Mon Sep 17 00:00:00 2001 From: Yan Zhulanow Date: Wed, 3 Nov 2021 01:11:46 +0900 Subject: [PATCH] [FIR IDE] Enable constant evaluation tests in AAPI/FE10 Implementation of constant evaluation was changed, so now it doesn't swallow error values. --- .../KtFe10CompileTimeConstantProvider.kt | 12 +- ...ileTimeConstantEvaluatorTestGenerated.java | 122 ++++++++++++++++++ .../propertyInit_DivByZero.descriptors.txt | 3 + .../analysis/api/GenerateAnalysisApiTests.kt | 7 +- 4 files changed, 131 insertions(+), 13 deletions(-) create mode 100644 analysis/analysis-api-fe10/tests/org/jetbrains/kotlin/analysis/api/descriptors/test/symbols/KtFe10CompileTimeConstantEvaluatorTestGenerated.java create mode 100644 analysis/analysis-api/testData/components/compileTimeConstantEvaluator/propertyInit_DivByZero.descriptors.txt 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 e6a4effaff4..73fcfd049a2 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 @@ -12,7 +12,6 @@ import org.jetbrains.kotlin.analysis.api.descriptors.symbols.descriptorBased.bas import org.jetbrains.kotlin.analysis.api.symbols.markers.KtConstantValue import org.jetbrains.kotlin.analysis.api.tokens.ValidityToken import org.jetbrains.kotlin.psi.KtExpression -import org.jetbrains.kotlin.resolve.DelegatingBindingTrace import org.jetbrains.kotlin.resolve.constants.evaluate.ConstantExpressionEvaluator import org.jetbrains.kotlin.types.TypeUtils @@ -23,15 +22,8 @@ internal class KtFe10CompileTimeConstantProvider( get() = analysisSession.token override fun evaluate(expression: KtExpression): KtConstantValue? { - val resolveSession = analysisContext.resolveSession - val evaluator = ConstantExpressionEvaluator( - resolveSession.moduleDescriptor, - resolveSession.languageVersionSettings, - resolveSession.project - ) - val bindingContext = analysisContext.analyze(expression) - val bindingTrace = DelegatingBindingTrace(bindingContext, "Binding trace for constant expression evaluation") - return evaluator.evaluateToConstantValue(expression, bindingTrace, TypeUtils.NO_EXPECTED_TYPE)?.toKtConstantValue() + 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/descriptors/test/symbols/KtFe10CompileTimeConstantEvaluatorTestGenerated.java b/analysis/analysis-api-fe10/tests/org/jetbrains/kotlin/analysis/api/descriptors/test/symbols/KtFe10CompileTimeConstantEvaluatorTestGenerated.java new file mode 100644 index 00000000000..8d58b5bcf7d --- /dev/null +++ b/analysis/analysis-api-fe10/tests/org/jetbrains/kotlin/analysis/api/descriptors/test/symbols/KtFe10CompileTimeConstantEvaluatorTestGenerated.java @@ -0,0 +1,122 @@ +/* + * 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.descriptors.test.symbols; + +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 KtFe10CompileTimeConstantEvaluatorTestGenerated extends AbstractKtFe10CompileTimeConstantEvaluatorTest { + @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("annotationInAnnotation_arrayOf.kt") + public void testAnnotationInAnnotation_arrayOf() throws Exception { + runTest("analysis/analysis-api/testData/components/compileTimeConstantEvaluator/annotationInAnnotation_arrayOf.kt"); + } + + @Test + @TestMetadata("annotationInAnnotation_collectionLiteral.kt") + public void testAnnotationInAnnotation_collectionLiteral() throws Exception { + runTest("analysis/analysis-api/testData/components/compileTimeConstantEvaluator/annotationInAnnotation_collectionLiteral.kt"); + } + + @Test + @TestMetadata("annotationInAnnotation_collectionLiteral_spread.kt") + public void testAnnotationInAnnotation_collectionLiteral_spread() throws Exception { + runTest("analysis/analysis-api/testData/components/compileTimeConstantEvaluator/annotationInAnnotation_collectionLiteral_spread.kt"); + } + + @Test + @TestMetadata("annotationInAnnotation_multipleAnnotations_arrayOf.kt") + public void testAnnotationInAnnotation_multipleAnnotations_arrayOf() throws Exception { + runTest("analysis/analysis-api/testData/components/compileTimeConstantEvaluator/annotationInAnnotation_multipleAnnotations_arrayOf.kt"); + } + + @Test + @TestMetadata("annotationInAnnotation_multipleAnnotations_collectionLiteral.kt") + public void testAnnotationInAnnotation_multipleAnnotations_collectionLiteral() throws Exception { + runTest("analysis/analysis-api/testData/components/compileTimeConstantEvaluator/annotationInAnnotation_multipleAnnotations_collectionLiteral.kt"); + } + + @Test + @TestMetadata("annotationInAnnotation_single.kt") + public void testAnnotationInAnnotation_single() throws Exception { + runTest("analysis/analysis-api/testData/components/compileTimeConstantEvaluator/annotationInAnnotation_single.kt"); + } + + @Test + @TestMetadata("annotationInAnnotation_vararg.kt") + public void testAnnotationInAnnotation_vararg() throws Exception { + runTest("analysis/analysis-api/testData/components/compileTimeConstantEvaluator/annotationInAnnotation_vararg.kt"); + } + + @Test + @TestMetadata("enumAsAnnotationValue.kt") + public void testEnumAsAnnotationValue() throws Exception { + runTest("analysis/analysis-api/testData/components/compileTimeConstantEvaluator/enumAsAnnotationValue.kt"); + } + + @Test + @TestMetadata("propertyInit_Byte.kt") + public void testPropertyInit_Byte() throws Exception { + runTest("analysis/analysis-api/testData/components/compileTimeConstantEvaluator/propertyInit_Byte.kt"); + } + + @Test + @TestMetadata("propertyInit_DivByZero.kt") + public void testPropertyInit_DivByZero() throws Exception { + runTest("analysis/analysis-api/testData/components/compileTimeConstantEvaluator/propertyInit_DivByZero.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"); + } + + @Test + @TestMetadata("stringLiteral.kt") + public void testStringLiteral() throws Exception { + runTest("analysis/analysis-api/testData/components/compileTimeConstantEvaluator/stringLiteral.kt"); + } +} diff --git a/analysis/analysis-api/testData/components/compileTimeConstantEvaluator/propertyInit_DivByZero.descriptors.txt b/analysis/analysis-api/testData/components/compileTimeConstantEvaluator/propertyInit_DivByZero.descriptors.txt new file mode 100644 index 00000000000..716310b022b --- /dev/null +++ b/analysis/analysis-api/testData/components/compileTimeConstantEvaluator/propertyInit_DivByZero.descriptors.txt @@ -0,0 +1,3 @@ +expression: 42 / 0 +constant_value: KtErrorValue(Division by zero) +constant: null diff --git a/generators/analysis-api-generator/tests/org/jetbrains/kotlin/generators/tests/analysis/api/GenerateAnalysisApiTests.kt b/generators/analysis-api-generator/tests/org/jetbrains/kotlin/generators/tests/analysis/api/GenerateAnalysisApiTests.kt index b2aa6a2304f..b4660fb5c34 100644 --- a/generators/analysis-api-generator/tests/org/jetbrains/kotlin/generators/tests/analysis/api/GenerateAnalysisApiTests.kt +++ b/generators/analysis-api-generator/tests/org/jetbrains/kotlin/generators/tests/analysis/api/GenerateAnalysisApiTests.kt @@ -7,6 +7,7 @@ package org.jetbrains.kotlin.generators.tests.analysis.api import org.jetbrains.kotlin.analysis.api.descriptors.test.AbstractKtFe10ResolveCallTest import org.jetbrains.kotlin.analysis.api.descriptors.test.components.* +import org.jetbrains.kotlin.analysis.api.descriptors.test.symbols.AbstractKtFe10CompileTimeConstantEvaluatorTest import org.jetbrains.kotlin.analysis.api.descriptors.test.symbols.AbstractKtFe10SymbolByFqNameTest import org.jetbrains.kotlin.analysis.api.descriptors.test.symbols.AbstractKtFe10SymbolByPsiTest import org.jetbrains.kotlin.analysis.api.descriptors.test.symbols.AbstractKtFe10SymbolByReferenceTest @@ -141,9 +142,9 @@ fun main(args: Array) { model("symbols/symbolByPsi") } -// testClass { -// model("components/compileTimeConstantEvaluator") -// } + testClass { + model("components/compileTimeConstantEvaluator") + } testClass { model("symbols/symbolByFqName")