diff --git a/analysis/symbol-light-classes/tests/org/jetbrains/kotlin/light/classes/symbol/decompiled/SymbolLightClassesForLibraryTestGenerated.java b/analysis/symbol-light-classes/tests/org/jetbrains/kotlin/light/classes/symbol/decompiled/SymbolLightClassesForLibraryTestGenerated.java index 1e04cf0c471..96e6f7b2530 100644 --- a/analysis/symbol-light-classes/tests/org/jetbrains/kotlin/light/classes/symbol/decompiled/SymbolLightClassesForLibraryTestGenerated.java +++ b/analysis/symbol-light-classes/tests/org/jetbrains/kotlin/light/classes/symbol/decompiled/SymbolLightClassesForLibraryTestGenerated.java @@ -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 { diff --git a/analysis/symbol-light-classes/tests/org/jetbrains/kotlin/light/classes/symbol/decompiled/SymbolLightClassesParentingForLibraryTestGenerated.java b/analysis/symbol-light-classes/tests/org/jetbrains/kotlin/light/classes/symbol/decompiled/SymbolLightClassesParentingForLibraryTestGenerated.java index 4e76c0c4388..c9ce979faa7 100644 --- a/analysis/symbol-light-classes/tests/org/jetbrains/kotlin/light/classes/symbol/decompiled/SymbolLightClassesParentingForLibraryTestGenerated.java +++ b/analysis/symbol-light-classes/tests/org/jetbrains/kotlin/light/classes/symbol/decompiled/SymbolLightClassesParentingForLibraryTestGenerated.java @@ -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 { diff --git a/analysis/symbol-light-classes/tests/org/jetbrains/kotlin/light/classes/symbol/source/SymbolLightClassesForSourceTestGenerated.java b/analysis/symbol-light-classes/tests/org/jetbrains/kotlin/light/classes/symbol/source/SymbolLightClassesForSourceTestGenerated.java index 929ef8353bc..8b478f927fd 100644 --- a/analysis/symbol-light-classes/tests/org/jetbrains/kotlin/light/classes/symbol/source/SymbolLightClassesForSourceTestGenerated.java +++ b/analysis/symbol-light-classes/tests/org/jetbrains/kotlin/light/classes/symbol/source/SymbolLightClassesForSourceTestGenerated.java @@ -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 { diff --git a/analysis/symbol-light-classes/tests/org/jetbrains/kotlin/light/classes/symbol/source/SymbolLightClassesParentingForSourceTestGenerated.java b/analysis/symbol-light-classes/tests/org/jetbrains/kotlin/light/classes/symbol/source/SymbolLightClassesParentingForSourceTestGenerated.java index 1a50ac59601..5635e1b8dd9 100644 --- a/analysis/symbol-light-classes/tests/org/jetbrains/kotlin/light/classes/symbol/source/SymbolLightClassesParentingForSourceTestGenerated.java +++ b/analysis/symbol-light-classes/tests/org/jetbrains/kotlin/light/classes/symbol/source/SymbolLightClassesParentingForSourceTestGenerated.java @@ -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 { diff --git a/compiler/fir/java/src/org/jetbrains/kotlin/fir/java/FirJavaFacade.kt b/compiler/fir/java/src/org/jetbrains/kotlin/fir/java/FirJavaFacade.kt index 78b5222fc19..ebd026e15b3 100644 --- a/compiler/fir/java/src/org/jetbrains/kotlin/fir/java/FirJavaFacade.kt +++ b/compiler/fir/java/src/org/jetbrains/kotlin/fir/java/FirJavaFacade.kt @@ -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, diff --git a/compiler/fir/java/src/org/jetbrains/kotlin/fir/java/declarations/FirJavaField.kt b/compiler/fir/java/src/org/jetbrains/kotlin/fir/java/declarations/FirJavaField.kt index bace50ee369..59506a31054 100644 --- a/compiler/fir/java/src/org/jetbrains/kotlin/fir/java/declarations/FirJavaField.kt +++ b/compiler/fir/java/src/org/jetbrains/kotlin/fir/java/declarations/FirJavaField.kt @@ -44,7 +44,7 @@ class FirJavaField @FirImplementationDetail constructor( override val isVar: Boolean, annotationBuilder: () -> List, override val typeParameters: MutableList, - override var initializer: FirExpression?, + private var lazyInitializer: Lazy, override val dispatchReceiverType: ConeSimpleKotlinType?, override val attributes: FirDeclarationAttributes, ) : FirField() { @@ -61,6 +61,9 @@ class FirJavaField @FirImplementationDetail constructor( override val annotations: List 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 transformOtherChildren(transformer: FirTransformer, 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 transformTypeParameters(transformer: FirTransformer, 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 + var lazyInitializer: Lazy? = 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, ) diff --git a/compiler/testData/asJava/lightClasses/JavaBetween.java b/compiler/testData/asJava/lightClasses/JavaBetween.java new file mode 100644 index 00000000000..ed179e05a2e --- /dev/null +++ b/compiler/testData/asJava/lightClasses/JavaBetween.java @@ -0,0 +1,4 @@ +public class AKotlin /* test.AKotlin*/ { + public AKotlin();// .ctor() + +} \ No newline at end of file diff --git a/compiler/testData/asJava/lightClasses/JavaBetween.kt b/compiler/testData/asJava/lightClasses/JavaBetween.kt new file mode 100644 index 00000000000..29a234bfe8f --- /dev/null +++ b/compiler/testData/asJava/lightClasses/JavaBetween.kt @@ -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() \ No newline at end of file diff --git a/compiler/tests-gen/org/jetbrains/kotlin/asJava/CompilerLightClassTestGenerated.java b/compiler/tests-gen/org/jetbrains/kotlin/asJava/CompilerLightClassTestGenerated.java index be3626067d8..b212ed2f274 100644 --- a/compiler/tests-gen/org/jetbrains/kotlin/asJava/CompilerLightClassTestGenerated.java +++ b/compiler/tests-gen/org/jetbrains/kotlin/asJava/CompilerLightClassTestGenerated.java @@ -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");