AA FIR: constant evaluation for Java field
This commit is contained in:
committed by
Ilya Kirillov
parent
0869dd9c92
commit
25f7554a31
+18
@@ -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 {
|
||||
|
||||
+21
-3
@@ -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,
|
||||
|
||||
+18
@@ -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 {
|
||||
|
||||
+18
@@ -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 {
|
||||
|
||||
+18
@@ -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 {
|
||||
|
||||
Vendored
+17
@@ -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
|
||||
Vendored
+9
@@ -0,0 +1,9 @@
|
||||
expression: Build.VERSION_CODES().CUPCAKE
|
||||
|
||||
CONSTANT_EXPRESSION_EVALUATION
|
||||
constant: 3
|
||||
constantValueKind: Int
|
||||
|
||||
CONSTANT_LIKE_EXPRESSION_EVALUATION
|
||||
constantLike: 3
|
||||
constantLikeValueKind: Int
|
||||
Vendored
+17
@@ -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
|
||||
Vendored
+9
@@ -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
|
||||
+17
@@ -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
|
||||
+9
@@ -0,0 +1,9 @@
|
||||
expression: Build.VERSION_CODES.CUPCAKE
|
||||
|
||||
CONSTANT_EXPRESSION_EVALUATION
|
||||
constant: 3
|
||||
constantValueKind: Int
|
||||
|
||||
CONSTANT_LIKE_EXPRESSION_EVALUATION
|
||||
constantLike: 3
|
||||
constantLikeValueKind: Int
|
||||
+5
-7
@@ -9,10 +9,7 @@ import org.jetbrains.kotlin.fir.declarations.*
|
||||
import org.jetbrains.kotlin.fir.expressions.FirQualifiedAccess
|
||||
import org.jetbrains.kotlin.fir.resolvedSymbol
|
||||
import org.jetbrains.kotlin.fir.symbols.FirBasedSymbol
|
||||
import org.jetbrains.kotlin.fir.symbols.impl.FirAnonymousObjectSymbol
|
||||
import org.jetbrains.kotlin.fir.symbols.impl.FirClassSymbol
|
||||
import org.jetbrains.kotlin.fir.symbols.impl.FirPropertySymbol
|
||||
import org.jetbrains.kotlin.fir.symbols.impl.FirRegularClassSymbol
|
||||
import org.jetbrains.kotlin.fir.symbols.impl.*
|
||||
import org.jetbrains.kotlin.fir.types.ConeClassLikeType
|
||||
import org.jetbrains.kotlin.fir.types.coneTypeSafe
|
||||
import org.jetbrains.kotlin.name.ClassId
|
||||
@@ -41,10 +38,11 @@ val FirClass.anonymousInitializers: List<FirAnonymousInitializer>
|
||||
val FirClass.delegateFields: List<FirField>
|
||||
get() = declarations.filterIsInstance<FirField>().filter { it.isSynthetic }
|
||||
|
||||
val FirQualifiedAccess.referredVariableSymbol: FirVariableSymbol<*>?
|
||||
get() = calleeReference.resolvedSymbol as? FirVariableSymbol<*>
|
||||
|
||||
val FirQualifiedAccess.referredPropertySymbol: FirPropertySymbol?
|
||||
get() {
|
||||
return calleeReference.resolvedSymbol as? FirPropertySymbol
|
||||
}
|
||||
get() = referredVariableSymbol as? FirPropertySymbol
|
||||
|
||||
inline val FirDeclaration.isJava: Boolean
|
||||
get() = origin is FirDeclarationOrigin.Java
|
||||
|
||||
@@ -76,7 +76,16 @@ class FirBackingFieldSymbol(callableId: CallableId) : FirVariableSymbol<FirBacki
|
||||
|
||||
class FirDelegateFieldSymbol(callableId: CallableId) : FirVariableSymbol<FirProperty>(callableId)
|
||||
|
||||
class FirFieldSymbol(callableId: CallableId) : FirVariableSymbol<FirField>(callableId)
|
||||
class FirFieldSymbol(callableId: CallableId) : FirVariableSymbol<FirField>(callableId) {
|
||||
val hasInitializer: Boolean
|
||||
get() = fir.initializer != null
|
||||
|
||||
val isVal: Boolean
|
||||
get() = fir.isVal
|
||||
|
||||
val isVar: Boolean
|
||||
get() = fir.isVar
|
||||
}
|
||||
|
||||
class FirEnumEntrySymbol(callableId: CallableId) : FirVariableSymbol<FirEnumEntry>(callableId)
|
||||
|
||||
|
||||
Reference in New Issue
Block a user