[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
@@ -156,6 +156,12 @@ public class SymbolLightClassesForLibraryTestGenerated extends AbstractSymbolLig
runTest("compiler/testData/asJava/lightClasses/InlineReified.kt");
}
@Test
@TestMetadata("JavaBetween.kt")
public void testJavaBetween() throws Exception {
runTest("compiler/testData/asJava/lightClasses/JavaBetween.kt");
}
@Test
@TestMetadata("JvmNameOnMember.kt")
public void testJvmNameOnMember() throws Exception {
@@ -156,6 +156,12 @@ public class SymbolLightClassesParentingForLibraryTestGenerated extends Abstract
runTest("compiler/testData/asJava/lightClasses/InlineReified.kt");
}
@Test
@TestMetadata("JavaBetween.kt")
public void testJavaBetween() throws Exception {
runTest("compiler/testData/asJava/lightClasses/JavaBetween.kt");
}
@Test
@TestMetadata("JvmNameOnMember.kt")
public void testJvmNameOnMember() throws Exception {
@@ -156,6 +156,12 @@ public class SymbolLightClassesForSourceTestGenerated extends AbstractSymbolLigh
runTest("compiler/testData/asJava/lightClasses/InlineReified.kt");
}
@Test
@TestMetadata("JavaBetween.kt")
public void testJavaBetween() throws Exception {
runTest("compiler/testData/asJava/lightClasses/JavaBetween.kt");
}
@Test
@TestMetadata("JvmNameOnMember.kt")
public void testJvmNameOnMember() throws Exception {
@@ -156,6 +156,12 @@ public class SymbolLightClassesParentingForSourceTestGenerated extends AbstractS
runTest("compiler/testData/asJava/lightClasses/InlineReified.kt");
}
@Test
@TestMetadata("JavaBetween.kt")
public void testJavaBetween() throws Exception {
runTest("compiler/testData/asJava/lightClasses/JavaBetween.kt");
}
@Test
@TestMetadata("JvmNameOnMember.kt")
public void testJvmNameOnMember() throws Exception {
@@ -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,
)
@@ -0,0 +1,4 @@
public class AKotlin /* test.AKotlin*/ {
public AKotlin();// .ctor()
}
+21
View File
@@ -0,0 +1,21 @@
// test.AKotlin
// DISABLE_SEALED_INHERITOR_CALCULATOR
// FILE: AKotlin.kt
package test
import test.BJava.FOO
open class AKotlin
// FILE: test/BJava.java
package test;
public class BJava extends AKotlin {
public final static String FOO = "foo";
}
// FILE: CKotlin.kt
package test
class CKotlin: BJava()
@@ -139,6 +139,11 @@ public class CompilerLightClassTestGenerated extends AbstractCompilerLightClassT
runTest("compiler/testData/asJava/lightClasses/InlineReified.kt");
}
@TestMetadata("JavaBetween.kt")
public void testJavaBetween() throws Exception {
runTest("compiler/testData/asJava/lightClasses/JavaBetween.kt");
}
@TestMetadata("JvmNameOnMember.kt")
public void testJvmNameOnMember() throws Exception {
runTest("compiler/testData/asJava/lightClasses/JvmNameOnMember.kt");