AA FIR: constant evaluation for Java field

This commit is contained in:
Jinseong Jeon
2022-08-15 11:46:12 -07:00
committed by Ilya Kirillov
parent 0869dd9c92
commit 25f7554a31
13 changed files with 186 additions and 11 deletions
@@ -76,6 +76,24 @@ public class Fe10IdeNormalAnalysisSourceModuleCompileTimeConstantEvaluatorTestGe
runTest("analysis/analysis-api/testData/components/compileTimeConstantProvider/evaluate/integerLiteral_plusOne_justOne.kt");
}
@Test
@TestMetadata("javaFinalField.kt")
public void testJavaFinalField() throws Exception {
runTest("analysis/analysis-api/testData/components/compileTimeConstantProvider/evaluate/javaFinalField.kt");
}
@Test
@TestMetadata("javaStaticField.kt")
public void testJavaStaticField() throws Exception {
runTest("analysis/analysis-api/testData/components/compileTimeConstantProvider/evaluate/javaStaticField.kt");
}
@Test
@TestMetadata("javaStaticFinalField.kt")
public void testJavaStaticFinalField() throws Exception {
runTest("analysis/analysis-api/testData/components/compileTimeConstantProvider/evaluate/javaStaticFinalField.kt");
}
@Test
@TestMetadata("namedReference_const.kt")
public void testNamedReference_const() throws Exception {
@@ -14,7 +14,8 @@ import org.jetbrains.kotlin.fir.declarations.FirCallableDeclaration
import org.jetbrains.kotlin.fir.declarations.FirResolvePhase
import org.jetbrains.kotlin.fir.declarations.FirSimpleFunction
import org.jetbrains.kotlin.fir.declarations.utils.isConst
import org.jetbrains.kotlin.fir.declarations.utils.referredPropertySymbol
import org.jetbrains.kotlin.fir.declarations.utils.isFinal
import org.jetbrains.kotlin.fir.declarations.utils.referredVariableSymbol
import org.jetbrains.kotlin.fir.expressions.*
import org.jetbrains.kotlin.fir.expressions.builder.buildConstExpression
import org.jetbrains.kotlin.fir.psi
@@ -22,8 +23,9 @@ import org.jetbrains.kotlin.fir.references.FirNamedReference
import org.jetbrains.kotlin.fir.references.FirResolvedNamedReference
import org.jetbrains.kotlin.fir.resolvedSymbol
import org.jetbrains.kotlin.fir.symbols.FirBasedSymbol
import org.jetbrains.kotlin.fir.symbols.lazyResolveToPhase
import org.jetbrains.kotlin.fir.symbols.impl.FirFieldSymbol
import org.jetbrains.kotlin.fir.symbols.impl.FirPropertySymbol
import org.jetbrains.kotlin.fir.symbols.lazyResolveToPhase
import org.jetbrains.kotlin.fir.types.*
import org.jetbrains.kotlin.fir.types.impl.*
import org.jetbrains.kotlin.psi.KtElement
@@ -44,7 +46,11 @@ internal object FirCompileTimeConstantEvaluator {
): FirConstExpression<*>? =
when (fir) {
is FirPropertyAccessExpression -> {
fir.referredPropertySymbol?.toConstExpression(mode)
when (val referredVariable = fir.referredVariableSymbol) {
is FirPropertySymbol -> referredVariable.toConstExpression(mode)
is FirFieldSymbol -> referredVariable.toConstExpression(mode)
else -> null
}
}
is FirConstExpression<*> -> {
fir.adaptToConstKind()
@@ -75,6 +81,18 @@ internal object FirCompileTimeConstantEvaluator {
}
}
private fun FirFieldSymbol.toConstExpression(
mode: KtConstantEvaluationMode,
): FirConstExpression<*>? {
return when {
mode == KtConstantEvaluationMode.CONSTANT_EXPRESSION_EVALUATION && !isFinal -> null
isVal && hasInitializer -> {
evaluate(fir.initializer, mode)
}
else -> null
}
}
fun evaluateAsKtConstantValue(
fir: FirElement,
mode: KtConstantEvaluationMode,
@@ -76,6 +76,24 @@ public class FirIdeDependentAnalysisSourceModuleCompileTimeConstantEvaluatorTest
runTest("analysis/analysis-api/testData/components/compileTimeConstantProvider/evaluate/integerLiteral_plusOne_justOne.kt");
}
@Test
@TestMetadata("javaFinalField.kt")
public void testJavaFinalField() throws Exception {
runTest("analysis/analysis-api/testData/components/compileTimeConstantProvider/evaluate/javaFinalField.kt");
}
@Test
@TestMetadata("javaStaticField.kt")
public void testJavaStaticField() throws Exception {
runTest("analysis/analysis-api/testData/components/compileTimeConstantProvider/evaluate/javaStaticField.kt");
}
@Test
@TestMetadata("javaStaticFinalField.kt")
public void testJavaStaticFinalField() throws Exception {
runTest("analysis/analysis-api/testData/components/compileTimeConstantProvider/evaluate/javaStaticFinalField.kt");
}
@Test
@TestMetadata("namedReference_const.kt")
public void testNamedReference_const() throws Exception {
@@ -76,6 +76,24 @@ public class FirIdeNormalAnalysisSourceModuleCompileTimeConstantEvaluatorTestGen
runTest("analysis/analysis-api/testData/components/compileTimeConstantProvider/evaluate/integerLiteral_plusOne_justOne.kt");
}
@Test
@TestMetadata("javaFinalField.kt")
public void testJavaFinalField() throws Exception {
runTest("analysis/analysis-api/testData/components/compileTimeConstantProvider/evaluate/javaFinalField.kt");
}
@Test
@TestMetadata("javaStaticField.kt")
public void testJavaStaticField() throws Exception {
runTest("analysis/analysis-api/testData/components/compileTimeConstantProvider/evaluate/javaStaticField.kt");
}
@Test
@TestMetadata("javaStaticFinalField.kt")
public void testJavaStaticFinalField() throws Exception {
runTest("analysis/analysis-api/testData/components/compileTimeConstantProvider/evaluate/javaStaticFinalField.kt");
}
@Test
@TestMetadata("namedReference_const.kt")
public void testNamedReference_const() throws Exception {
@@ -76,6 +76,24 @@ public class FirStandaloneNormalAnalysisSourceModuleCompileTimeConstantEvaluator
runTest("analysis/analysis-api/testData/components/compileTimeConstantProvider/evaluate/integerLiteral_plusOne_justOne.kt");
}
@Test
@TestMetadata("javaFinalField.kt")
public void testJavaFinalField() throws Exception {
runTest("analysis/analysis-api/testData/components/compileTimeConstantProvider/evaluate/javaFinalField.kt");
}
@Test
@TestMetadata("javaStaticField.kt")
public void testJavaStaticField() throws Exception {
runTest("analysis/analysis-api/testData/components/compileTimeConstantProvider/evaluate/javaStaticField.kt");
}
@Test
@TestMetadata("javaStaticFinalField.kt")
public void testJavaStaticFinalField() throws Exception {
runTest("analysis/analysis-api/testData/components/compileTimeConstantProvider/evaluate/javaStaticFinalField.kt");
}
@Test
@TestMetadata("namedReference_const.kt")
public void testNamedReference_const() throws Exception {
@@ -0,0 +1,17 @@
// FILE: Build.java
package os;
public class Build {
public static class VERSION_CODES {
public final int CUPCAKE = 3;
}
}
// FILE: main.kt
import os.Build
annotation class Annotation(val api: Int)
@get:Annotation(api = <expr>Build.VERSION_CODES().CUPCAKE</expr>)
val versionCheck1: Boolean
get() = false
@@ -0,0 +1,9 @@
expression: Build.VERSION_CODES().CUPCAKE
CONSTANT_EXPRESSION_EVALUATION
constant: 3
constantValueKind: Int
CONSTANT_LIKE_EXPRESSION_EVALUATION
constantLike: 3
constantLikeValueKind: Int
@@ -0,0 +1,17 @@
// FILE: Build.java
package os;
public class Build {
public static class VERSION_CODES {
public static int CUPCAKE = 3;
}
}
// FILE: main.kt
import os.Build
annotation class Annotation(val api: Int)
@get:Annotation(api = <expr>Build.VERSION_CODES.CUPCAKE</expr>)
val versionCheck1: Boolean
get() = false
@@ -0,0 +1,9 @@
expression: Build.VERSION_CODES.CUPCAKE
CONSTANT_EXPRESSION_EVALUATION
constant: NOT_EVALUATED
constantValueKind: NOT_EVALUATED
CONSTANT_LIKE_EXPRESSION_EVALUATION
constantLike: NOT_EVALUATED
constantLikeValueKind: NOT_EVALUATED
@@ -0,0 +1,17 @@
// FILE: Build.java
package os;
public class Build {
public static class VERSION_CODES {
public static final int CUPCAKE = 3;
}
}
// FILE: main.kt
import os.Build
annotation class Annotation(val api: Int)
@get:Annotation(api = <expr>Build.VERSION_CODES.CUPCAKE</expr>)
val versionCheck1: Boolean
get() = false
@@ -0,0 +1,9 @@
expression: Build.VERSION_CODES.CUPCAKE
CONSTANT_EXPRESSION_EVALUATION
constant: 3
constantValueKind: Int
CONSTANT_LIKE_EXPRESSION_EVALUATION
constantLike: 3
constantLikeValueKind: Int