[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)
}
lazyHasConstantInitializer = lazy {
javaField.hasConstantNotNullInitializer
}
if (!javaField.isStatic) {
dispatchReceiverType = dispatchReceiver
}
@@ -43,12 +43,16 @@ class FirJavaField @FirImplementationDetail constructor(
annotationBuilder: () -> List<FirAnnotation>,
override val typeParameters: MutableList<FirTypeParameterRef>,
lazyInitializer: Lazy<FirExpression?>,
lazyHasConstantInitializer: Lazy<Boolean>,
override val dispatchReceiverType: ConeSimpleKotlinType?,
override val attributes: FirDeclarationAttributes,
) : FirField() {
internal var lazyInitializer: Lazy<FirExpression?> = lazyInitializer
private set
internal var lazyHasConstantInitializer: Lazy<Boolean> = lazyHasConstantInitializer
private set
init {
symbol.bind(this)
@@ -68,6 +72,9 @@ class FirJavaField @FirImplementationDetail constructor(
override val initializer: FirExpression?
get() = lazyInitializer.value
override val hasConstantInitializer: Boolean
get() = lazyHasConstantInitializer.value
override val deprecationsProvider: DeprecationsProvider by lazy {
annotations.getDeprecationsProviderFromAnnotations(moduleData.session, fromJava = true)
}
@@ -181,6 +188,7 @@ internal class FirJavaFieldBuilder : FirFieldBuilder() {
var isFromSource: Boolean by Delegates.notNull()
lateinit var annotationBuilder: () -> List<FirAnnotation>
var lazyInitializer: Lazy<FirExpression?>? = null
lateinit var lazyHasConstantInitializer: Lazy<Boolean>
override var resolvePhase: FirResolvePhase = FirResolvePhase.ANALYZED_DEPENDENCIES
@@ -199,6 +207,7 @@ internal class FirJavaFieldBuilder : FirFieldBuilder() {
annotationBuilder,
typeParameters,
lazyInitializer ?: lazyOf(initializer),
lazyHasConstantInitializer,
dispatchReceiverType,
attributes,
)
@@ -142,6 +142,7 @@ class FirSignatureEnhancement(
status = firElement.status
if (firElement is FirJavaField) {
lazyInitializer = firElement.lazyInitializer
lazyHasConstantInitializer = firElement.lazyHasConstantInitializer
} else {
initializer = firElement.initializer
}