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