[FE] Read Java static field initializer lazily (KTIJ-23043)

This commit is contained in:
Yan Zhulanow
2022-10-26 15:58:53 +09:00
committed by Space Team
parent dbddbab73c
commit c8e9cfde0b
9 changed files with 67 additions and 11 deletions
@@ -25,7 +25,6 @@ import org.jetbrains.kotlin.fir.declarations.impl.FirResolvedDeclarationStatusIm
import org.jetbrains.kotlin.fir.declarations.utils.effectiveVisibility
import org.jetbrains.kotlin.fir.declarations.utils.modality
import org.jetbrains.kotlin.fir.expressions.FirConstExpression
import org.jetbrains.kotlin.fir.expressions.FirExpression
import org.jetbrains.kotlin.fir.expressions.classId
import org.jetbrains.kotlin.fir.java.declarations.*
import org.jetbrains.kotlin.fir.java.enhancement.FirSignatureEnhancement
@@ -539,7 +538,11 @@ abstract class FirJavaFacade(
isVar = !javaField.isFinal
isStatic = javaField.isStatic
annotationBuilder = { javaField.convertAnnotationsToFir(session, javaTypeParameterStack) }
initializer = convertJavaInitializerToFir(javaField.initializerValue)
lazyInitializer = lazy {
// NB: null should be converted to null
javaField.initializerValue?.createConstantIfAny(session)
}
if (!javaField.isStatic) {
dispatchReceiverType = dispatchReceiver
@@ -552,11 +555,6 @@ abstract class FirJavaFacade(
}
}
private fun convertJavaInitializerToFir(value: Any?): FirExpression? {
// NB: null should be converted to null
return value?.createConstantIfAny(session)
}
private fun convertJavaMethodToFir(
containingClass: JavaClass,
javaMethod: JavaMethod,
@@ -44,7 +44,7 @@ class FirJavaField @FirImplementationDetail constructor(
override val isVar: Boolean,
annotationBuilder: () -> List<FirAnnotation>,
override val typeParameters: MutableList<FirTypeParameterRef>,
override var initializer: FirExpression?,
private var lazyInitializer: Lazy<FirExpression?>,
override val dispatchReceiverType: ConeSimpleKotlinType?,
override val attributes: FirDeclarationAttributes,
) : FirField() {
@@ -61,6 +61,9 @@ class FirJavaField @FirImplementationDetail constructor(
override val annotations: List<FirAnnotation> by lazy { annotationBuilder() }
override val initializer: FirExpression?
get() = lazyInitializer.value
override val deprecationsProvider: DeprecationsProvider by lazy {
annotations.getDeprecationsProviderFromAnnotations(fromJava = true, moduleData.session.firCachesFactory)
}
@@ -87,7 +90,7 @@ class FirJavaField @FirImplementationDetail constructor(
override fun <D> transformOtherChildren(transformer: FirTransformer<D>, data: D): FirField {
transformAnnotations(transformer, data)
initializer = initializer?.transformSingle(transformer, data)
replaceInitializer(initializer?.transformSingle(transformer, data))
return this
}
@@ -127,7 +130,7 @@ class FirJavaField @FirImplementationDetail constructor(
}
override fun replaceInitializer(newInitializer: FirExpression?) {
initializer = newInitializer
lazyInitializer = lazyOf(newInitializer)
}
override fun <D> transformTypeParameters(transformer: FirTransformer<D>, data: D): FirField {
@@ -169,6 +172,7 @@ internal class FirJavaFieldBuilder : FirFieldBuilder() {
var isStatic: Boolean by Delegates.notNull()
var isFromSource: Boolean by Delegates.notNull()
lateinit var annotationBuilder: () -> List<FirAnnotation>
var lazyInitializer: Lazy<FirExpression?>? = null
override var resolvePhase: FirResolvePhase = FirResolvePhase.ANALYZED_DEPENDENCIES
@@ -186,7 +190,7 @@ internal class FirJavaFieldBuilder : FirFieldBuilder() {
isVar,
annotationBuilder,
typeParameters,
initializer,
lazyInitializer ?: lazyOf(initializer),
dispatchReceiverType,
attributes,
)