[FE] Read Java static field initializer lazily (KTIJ-23043)
This commit is contained in:
+6
@@ -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 {
|
||||
|
||||
+6
@@ -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 {
|
||||
|
||||
+6
@@ -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 {
|
||||
|
||||
+6
@@ -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()
|
||||
|
||||
}
|
||||
@@ -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()
|
||||
+5
@@ -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");
|
||||
|
||||
Reference in New Issue
Block a user