[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");
|
runTest("compiler/testData/asJava/lightClasses/InlineReified.kt");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
@TestMetadata("JavaBetween.kt")
|
||||||
|
public void testJavaBetween() throws Exception {
|
||||||
|
runTest("compiler/testData/asJava/lightClasses/JavaBetween.kt");
|
||||||
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
@TestMetadata("JvmNameOnMember.kt")
|
@TestMetadata("JvmNameOnMember.kt")
|
||||||
public void testJvmNameOnMember() throws Exception {
|
public void testJvmNameOnMember() throws Exception {
|
||||||
|
|||||||
+6
@@ -156,6 +156,12 @@ public class SymbolLightClassesParentingForLibraryTestGenerated extends Abstract
|
|||||||
runTest("compiler/testData/asJava/lightClasses/InlineReified.kt");
|
runTest("compiler/testData/asJava/lightClasses/InlineReified.kt");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
@TestMetadata("JavaBetween.kt")
|
||||||
|
public void testJavaBetween() throws Exception {
|
||||||
|
runTest("compiler/testData/asJava/lightClasses/JavaBetween.kt");
|
||||||
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
@TestMetadata("JvmNameOnMember.kt")
|
@TestMetadata("JvmNameOnMember.kt")
|
||||||
public void testJvmNameOnMember() throws Exception {
|
public void testJvmNameOnMember() throws Exception {
|
||||||
|
|||||||
+6
@@ -156,6 +156,12 @@ public class SymbolLightClassesForSourceTestGenerated extends AbstractSymbolLigh
|
|||||||
runTest("compiler/testData/asJava/lightClasses/InlineReified.kt");
|
runTest("compiler/testData/asJava/lightClasses/InlineReified.kt");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
@TestMetadata("JavaBetween.kt")
|
||||||
|
public void testJavaBetween() throws Exception {
|
||||||
|
runTest("compiler/testData/asJava/lightClasses/JavaBetween.kt");
|
||||||
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
@TestMetadata("JvmNameOnMember.kt")
|
@TestMetadata("JvmNameOnMember.kt")
|
||||||
public void testJvmNameOnMember() throws Exception {
|
public void testJvmNameOnMember() throws Exception {
|
||||||
|
|||||||
+6
@@ -156,6 +156,12 @@ public class SymbolLightClassesParentingForSourceTestGenerated extends AbstractS
|
|||||||
runTest("compiler/testData/asJava/lightClasses/InlineReified.kt");
|
runTest("compiler/testData/asJava/lightClasses/InlineReified.kt");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
@TestMetadata("JavaBetween.kt")
|
||||||
|
public void testJavaBetween() throws Exception {
|
||||||
|
runTest("compiler/testData/asJava/lightClasses/JavaBetween.kt");
|
||||||
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
@TestMetadata("JvmNameOnMember.kt")
|
@TestMetadata("JvmNameOnMember.kt")
|
||||||
public void testJvmNameOnMember() throws Exception {
|
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.effectiveVisibility
|
||||||
import org.jetbrains.kotlin.fir.declarations.utils.modality
|
import org.jetbrains.kotlin.fir.declarations.utils.modality
|
||||||
import org.jetbrains.kotlin.fir.expressions.FirConstExpression
|
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.expressions.classId
|
||||||
import org.jetbrains.kotlin.fir.java.declarations.*
|
import org.jetbrains.kotlin.fir.java.declarations.*
|
||||||
import org.jetbrains.kotlin.fir.java.enhancement.FirSignatureEnhancement
|
import org.jetbrains.kotlin.fir.java.enhancement.FirSignatureEnhancement
|
||||||
@@ -539,7 +538,11 @@ abstract class FirJavaFacade(
|
|||||||
isVar = !javaField.isFinal
|
isVar = !javaField.isFinal
|
||||||
isStatic = javaField.isStatic
|
isStatic = javaField.isStatic
|
||||||
annotationBuilder = { javaField.convertAnnotationsToFir(session, javaTypeParameterStack) }
|
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) {
|
if (!javaField.isStatic) {
|
||||||
dispatchReceiverType = dispatchReceiver
|
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(
|
private fun convertJavaMethodToFir(
|
||||||
containingClass: JavaClass,
|
containingClass: JavaClass,
|
||||||
javaMethod: JavaMethod,
|
javaMethod: JavaMethod,
|
||||||
|
|||||||
@@ -44,7 +44,7 @@ class FirJavaField @FirImplementationDetail constructor(
|
|||||||
override val isVar: Boolean,
|
override val isVar: Boolean,
|
||||||
annotationBuilder: () -> List<FirAnnotation>,
|
annotationBuilder: () -> List<FirAnnotation>,
|
||||||
override val typeParameters: MutableList<FirTypeParameterRef>,
|
override val typeParameters: MutableList<FirTypeParameterRef>,
|
||||||
override var initializer: FirExpression?,
|
private var lazyInitializer: Lazy<FirExpression?>,
|
||||||
override val dispatchReceiverType: ConeSimpleKotlinType?,
|
override val dispatchReceiverType: ConeSimpleKotlinType?,
|
||||||
override val attributes: FirDeclarationAttributes,
|
override val attributes: FirDeclarationAttributes,
|
||||||
) : FirField() {
|
) : FirField() {
|
||||||
@@ -61,6 +61,9 @@ class FirJavaField @FirImplementationDetail constructor(
|
|||||||
|
|
||||||
override val annotations: List<FirAnnotation> by lazy { annotationBuilder() }
|
override val annotations: List<FirAnnotation> by lazy { annotationBuilder() }
|
||||||
|
|
||||||
|
override val initializer: FirExpression?
|
||||||
|
get() = lazyInitializer.value
|
||||||
|
|
||||||
override val deprecationsProvider: DeprecationsProvider by lazy {
|
override val deprecationsProvider: DeprecationsProvider by lazy {
|
||||||
annotations.getDeprecationsProviderFromAnnotations(fromJava = true, moduleData.session.firCachesFactory)
|
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 {
|
override fun <D> transformOtherChildren(transformer: FirTransformer<D>, data: D): FirField {
|
||||||
transformAnnotations(transformer, data)
|
transformAnnotations(transformer, data)
|
||||||
initializer = initializer?.transformSingle(transformer, data)
|
replaceInitializer(initializer?.transformSingle(transformer, data))
|
||||||
return this
|
return this
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -127,7 +130,7 @@ class FirJavaField @FirImplementationDetail constructor(
|
|||||||
}
|
}
|
||||||
|
|
||||||
override fun replaceInitializer(newInitializer: FirExpression?) {
|
override fun replaceInitializer(newInitializer: FirExpression?) {
|
||||||
initializer = newInitializer
|
lazyInitializer = lazyOf(newInitializer)
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun <D> transformTypeParameters(transformer: FirTransformer<D>, data: D): FirField {
|
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 isStatic: Boolean by Delegates.notNull()
|
||||||
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
|
||||||
|
|
||||||
override var resolvePhase: FirResolvePhase = FirResolvePhase.ANALYZED_DEPENDENCIES
|
override var resolvePhase: FirResolvePhase = FirResolvePhase.ANALYZED_DEPENDENCIES
|
||||||
|
|
||||||
@@ -186,7 +190,7 @@ internal class FirJavaFieldBuilder : FirFieldBuilder() {
|
|||||||
isVar,
|
isVar,
|
||||||
annotationBuilder,
|
annotationBuilder,
|
||||||
typeParameters,
|
typeParameters,
|
||||||
initializer,
|
lazyInitializer ?: lazyOf(initializer),
|
||||||
dispatchReceiverType,
|
dispatchReceiverType,
|
||||||
attributes,
|
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");
|
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")
|
@TestMetadata("JvmNameOnMember.kt")
|
||||||
public void testJvmNameOnMember() throws Exception {
|
public void testJvmNameOnMember() throws Exception {
|
||||||
runTest("compiler/testData/asJava/lightClasses/JvmNameOnMember.kt");
|
runTest("compiler/testData/asJava/lightClasses/JvmNameOnMember.kt");
|
||||||
|
|||||||
Reference in New Issue
Block a user