[FIR] Add hasConstantInitializer field in FirField class

This field is required to be able to analyze Java fields
without triggering lazy const evaluation.

#KT-59894
#KT-61920
This commit is contained in:
Ivan Kylchik
2023-11-21 15:07:46 +01:00
committed by Space Team
parent 6ca8f546fe
commit 9f64edb31e
8 changed files with 25 additions and 0 deletions
@@ -560,6 +560,10 @@ abstract class FirJavaFacade(
javaField.initializerValue?.createConstantIfAny(session) javaField.initializerValue?.createConstantIfAny(session)
} }
lazyHasConstantInitializer = lazy {
javaField.hasConstantNotNullInitializer
}
if (!javaField.isStatic) { if (!javaField.isStatic) {
dispatchReceiverType = dispatchReceiver dispatchReceiverType = dispatchReceiver
} }
@@ -43,12 +43,16 @@ class FirJavaField @FirImplementationDetail constructor(
annotationBuilder: () -> List<FirAnnotation>, annotationBuilder: () -> List<FirAnnotation>,
override val typeParameters: MutableList<FirTypeParameterRef>, override val typeParameters: MutableList<FirTypeParameterRef>,
lazyInitializer: Lazy<FirExpression?>, lazyInitializer: Lazy<FirExpression?>,
lazyHasConstantInitializer: Lazy<Boolean>,
override val dispatchReceiverType: ConeSimpleKotlinType?, override val dispatchReceiverType: ConeSimpleKotlinType?,
override val attributes: FirDeclarationAttributes, override val attributes: FirDeclarationAttributes,
) : FirField() { ) : FirField() {
internal var lazyInitializer: Lazy<FirExpression?> = lazyInitializer internal var lazyInitializer: Lazy<FirExpression?> = lazyInitializer
private set private set
internal var lazyHasConstantInitializer: Lazy<Boolean> = lazyHasConstantInitializer
private set
init { init {
symbol.bind(this) symbol.bind(this)
@@ -68,6 +72,9 @@ class FirJavaField @FirImplementationDetail constructor(
override val initializer: FirExpression? override val initializer: FirExpression?
get() = lazyInitializer.value get() = lazyInitializer.value
override val hasConstantInitializer: Boolean
get() = lazyHasConstantInitializer.value
override val deprecationsProvider: DeprecationsProvider by lazy { override val deprecationsProvider: DeprecationsProvider by lazy {
annotations.getDeprecationsProviderFromAnnotations(moduleData.session, fromJava = true) annotations.getDeprecationsProviderFromAnnotations(moduleData.session, fromJava = true)
} }
@@ -181,6 +188,7 @@ internal class FirJavaFieldBuilder : FirFieldBuilder() {
var isFromSource: Boolean by Delegates.notNull() var isFromSource: Boolean by Delegates.notNull()
lateinit var annotationBuilder: () -> List<FirAnnotation> lateinit var annotationBuilder: () -> List<FirAnnotation>
var lazyInitializer: Lazy<FirExpression?>? = null var lazyInitializer: Lazy<FirExpression?>? = null
lateinit var lazyHasConstantInitializer: Lazy<Boolean>
override var resolvePhase: FirResolvePhase = FirResolvePhase.ANALYZED_DEPENDENCIES override var resolvePhase: FirResolvePhase = FirResolvePhase.ANALYZED_DEPENDENCIES
@@ -199,6 +207,7 @@ internal class FirJavaFieldBuilder : FirFieldBuilder() {
annotationBuilder, annotationBuilder,
typeParameters, typeParameters,
lazyInitializer ?: lazyOf(initializer), lazyInitializer ?: lazyOf(initializer),
lazyHasConstantInitializer,
dispatchReceiverType, dispatchReceiverType,
attributes, attributes,
) )
@@ -142,6 +142,7 @@ class FirSignatureEnhancement(
status = firElement.status status = firElement.status
if (firElement is FirJavaField) { if (firElement is FirJavaField) {
lazyInitializer = firElement.lazyInitializer lazyInitializer = firElement.lazyInitializer
lazyHasConstantInitializer = firElement.lazyHasConstantInitializer
} else { } else {
initializer = firElement.initializer initializer = firElement.initializer
} }
@@ -49,6 +49,7 @@ abstract class FirField : FirVariable(), FirControlFlowGraphOwner {
abstract override val annotations: List<FirAnnotation> abstract override val annotations: List<FirAnnotation>
abstract override val controlFlowGraphReference: FirControlFlowGraphReference? abstract override val controlFlowGraphReference: FirControlFlowGraphReference?
abstract override val symbol: FirFieldSymbol abstract override val symbol: FirFieldSymbol
abstract val hasConstantInitializer: Boolean
override fun <R, D> accept(visitor: FirVisitor<R, D>, data: D): R = override fun <R, D> accept(visitor: FirVisitor<R, D>, data: D): R =
visitor.visitField(this, data) visitor.visitField(this, data)
@@ -60,6 +60,8 @@ class FirFieldImpl @FirImplementationDetail constructor(
override val setter: FirPropertyAccessor? override val setter: FirPropertyAccessor?
get() = null get() = null
override var controlFlowGraphReference: FirControlFlowGraphReference? = null override var controlFlowGraphReference: FirControlFlowGraphReference? = null
override val hasConstantInitializer: Boolean
get() = status.isConst
init { init {
symbol.bind(this) symbol.bind(this)
@@ -96,6 +96,9 @@ open class FirFieldSymbol(callableId: CallableId) : FirVariableSymbol<FirField>(
val hasInitializer: Boolean val hasInitializer: Boolean
get() = fir.initializer != null get() = fir.initializer != null
val hasConstantInitializer: Boolean
get() = fir.hasConstantInitializer
val isVal: Boolean val isVal: Boolean
get() = fir.isVal get() = fir.isVal
@@ -314,6 +314,10 @@ object ImplementationConfigurator : AbstractFirTreeImplementationConfigurator()
value = "!isVar" value = "!isVar"
withGetter = true withGetter = true
} }
default("hasConstantInitializer") {
value = "status.isConst"
withGetter = true
}
publicImplementation() publicImplementation()
defaultNull("receiverParameter", "delegate", "getter", "setter", withGetter = true) defaultNull("receiverParameter", "delegate", "getter", "setter", withGetter = true)
@@ -468,6 +468,7 @@ object NodeConfigurator : AbstractFieldConfigurator<FirTreeBuilder>(FirTreeBuild
field.configure { field.configure {
+symbol("FirFieldSymbol") +symbol("FirFieldSymbol")
generateBooleanFields("hasConstantInitializer")
} }
anonymousInitializer.configure { anonymousInitializer.configure {