[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
}
@@ -49,6 +49,7 @@ abstract class FirField : FirVariable(), FirControlFlowGraphOwner {
abstract override val annotations: List<FirAnnotation>
abstract override val controlFlowGraphReference: FirControlFlowGraphReference?
abstract override val symbol: FirFieldSymbol
abstract val hasConstantInitializer: Boolean
override fun <R, D> accept(visitor: FirVisitor<R, D>, data: D): R =
visitor.visitField(this, data)
@@ -60,6 +60,8 @@ class FirFieldImpl @FirImplementationDetail constructor(
override val setter: FirPropertyAccessor?
get() = null
override var controlFlowGraphReference: FirControlFlowGraphReference? = null
override val hasConstantInitializer: Boolean
get() = status.isConst
init {
symbol.bind(this)
@@ -96,6 +96,9 @@ open class FirFieldSymbol(callableId: CallableId) : FirVariableSymbol<FirField>(
val hasInitializer: Boolean
get() = fir.initializer != null
val hasConstantInitializer: Boolean
get() = fir.hasConstantInitializer
val isVal: Boolean
get() = fir.isVal
@@ -314,6 +314,10 @@ object ImplementationConfigurator : AbstractFirTreeImplementationConfigurator()
value = "!isVar"
withGetter = true
}
default("hasConstantInitializer") {
value = "status.isConst"
withGetter = true
}
publicImplementation()
defaultNull("receiverParameter", "delegate", "getter", "setter", withGetter = true)
@@ -468,6 +468,7 @@ object NodeConfigurator : AbstractFieldConfigurator<FirTreeBuilder>(FirTreeBuild
field.configure {
+symbol("FirFieldSymbol")
generateBooleanFields("hasConstantInitializer")
}
anonymousInitializer.configure {