[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:
@@ -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,
|
||||
)
|
||||
|
||||
+1
@@ -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
|
||||
|
||||
|
||||
+4
@@ -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)
|
||||
|
||||
+1
@@ -468,6 +468,7 @@ object NodeConfigurator : AbstractFieldConfigurator<FirTreeBuilder>(FirTreeBuild
|
||||
|
||||
field.configure {
|
||||
+symbol("FirFieldSymbol")
|
||||
generateBooleanFields("hasConstantInitializer")
|
||||
}
|
||||
|
||||
anonymousInitializer.configure {
|
||||
|
||||
Reference in New Issue
Block a user