diff --git a/compiler/fir/fir2ir/tests-gen/org/jetbrains/kotlin/codegen/FirCompileKotlinAgainstKotlinTestGenerated.java b/compiler/fir/fir2ir/tests-gen/org/jetbrains/kotlin/codegen/FirCompileKotlinAgainstKotlinTestGenerated.java index d41ae7b1e56..1f28a59acc0 100644 --- a/compiler/fir/fir2ir/tests-gen/org/jetbrains/kotlin/codegen/FirCompileKotlinAgainstKotlinTestGenerated.java +++ b/compiler/fir/fir2ir/tests-gen/org/jetbrains/kotlin/codegen/FirCompileKotlinAgainstKotlinTestGenerated.java @@ -148,6 +148,11 @@ public class FirCompileKotlinAgainstKotlinTestGenerated extends AbstractFirCompi runTest("compiler/testData/compileKotlinAgainstKotlin/expectClassActualTypeAlias.kt"); } + @TestMetadata("importCompanion.kt") + public void testImportCompanion() throws Exception { + runTest("compiler/testData/compileKotlinAgainstKotlin/importCompanion.kt"); + } + @TestMetadata("inlineClassFromBinaryDependencies.kt") public void testInlineClassFromBinaryDependencies() throws Exception { runTest("compiler/testData/compileKotlinAgainstKotlin/inlineClassFromBinaryDependencies.kt"); diff --git a/compiler/fir/java/src/org/jetbrains/kotlin/fir/java/deserialization/KotlinDeserializedJvmSymbolsProvider.kt b/compiler/fir/java/src/org/jetbrains/kotlin/fir/java/deserialization/KotlinDeserializedJvmSymbolsProvider.kt index ae5fb02ad68..8ad7c4262dc 100644 --- a/compiler/fir/java/src/org/jetbrains/kotlin/fir/java/deserialization/KotlinDeserializedJvmSymbolsProvider.kt +++ b/compiler/fir/java/src/org/jetbrains/kotlin/fir/java/deserialization/KotlinDeserializedJvmSymbolsProvider.kt @@ -39,6 +39,7 @@ import org.jetbrains.kotlin.load.kotlin.* import org.jetbrains.kotlin.load.kotlin.KotlinJvmBinaryClass.AnnotationArrayArgumentVisitor import org.jetbrains.kotlin.load.kotlin.header.KotlinClassHeader import org.jetbrains.kotlin.metadata.ProtoBuf +import org.jetbrains.kotlin.metadata.deserialization.Flags import org.jetbrains.kotlin.metadata.jvm.deserialization.JvmMetadataVersion import org.jetbrains.kotlin.metadata.jvm.deserialization.JvmNameResolver import org.jetbrains.kotlin.metadata.jvm.deserialization.JvmProtoBufUtil @@ -300,6 +301,12 @@ class KotlinDeserializedJvmSymbolsProvider( return loadAnnotation(annotationClassId, result) } + private fun findAndDeserializeClassViaParent(classId: ClassId): FirRegularClassSymbol? { + val outerClassId = classId.outerClassId ?: return null + findAndDeserializeClass(outerClassId) ?: return null + return classCache[classId] + } + private fun findAndDeserializeClass( classId: ClassId, parentContext: FirDeserializationContext? = null @@ -314,7 +321,7 @@ class KotlinDeserializedJvmSymbolsProvider( } catch (e: ProcessCanceledException) { return null } - val kotlinClassWithContent = when (result) { + val (kotlinJvmBinaryClass, byteContent) = when (result) { is KotlinClassFinder.Result.KotlinClass -> result is KotlinClassFinder.Result.ClassFileContent -> { handledByJava.add(classId) @@ -324,45 +331,39 @@ class KotlinDeserializedJvmSymbolsProvider( null } } - null -> null + null -> return findAndDeserializeClassViaParent(classId) } - if (kotlinClassWithContent == null) { - val outerClassId = classId.outerClassId ?: return null - findAndDeserializeClass(outerClassId) ?: return null - } else { - val (kotlinJvmBinaryClass, byteContent) = kotlinClassWithContent + if (kotlinJvmBinaryClass.classHeader.kind != KotlinClassHeader.Kind.CLASS) return null + val (nameResolver, classProto) = kotlinJvmBinaryClass.readClassDataFrom() ?: return null - if (kotlinJvmBinaryClass.classHeader.kind != KotlinClassHeader.Kind.CLASS) return null - val (nameResolver, classProto) = kotlinJvmBinaryClass.readClassDataFrom() ?: return null - - val symbol = FirRegularClassSymbol(classId) - deserializeClassToSymbol( - classId, classProto, symbol, nameResolver, session, - JvmBinaryAnnotationDeserializer(session, kotlinJvmBinaryClass, byteContent), - kotlinScopeProvider, - parentContext, KotlinJvmBinarySourceElement(kotlinJvmBinaryClass), - this::findAndDeserializeClass - ) - - classCache[classId] = symbol - val annotations = mutableListOf() - kotlinJvmBinaryClass.loadClassAnnotations( - object : KotlinJvmBinaryClass.AnnotationVisitor { - override fun visitAnnotation(classId: ClassId, source: SourceElement): KotlinJvmBinaryClass.AnnotationArgumentVisitor? { - return loadAnnotationIfNotSpecial(classId, annotations) - } - - override fun visitEnd() { - } - - - }, - byteContent, - ) - (symbol.fir.annotations as MutableList) += annotations + if (parentContext == null && Flags.CLASS_KIND.get(classProto.flags) == ProtoBuf.Class.Kind.COMPANION_OBJECT) { + return findAndDeserializeClassViaParent(classId) } - return classCache[classId] + val symbol = FirRegularClassSymbol(classId) + deserializeClassToSymbol( + classId, classProto, symbol, nameResolver, session, + JvmBinaryAnnotationDeserializer(session, kotlinJvmBinaryClass, byteContent), + kotlinScopeProvider, + parentContext, KotlinJvmBinarySourceElement(kotlinJvmBinaryClass), + this::findAndDeserializeClass + ) + + classCache[classId] = symbol + val annotations = mutableListOf() + kotlinJvmBinaryClass.loadClassAnnotations( + object : KotlinJvmBinaryClass.AnnotationVisitor { + override fun visitAnnotation(classId: ClassId, source: SourceElement): KotlinJvmBinaryClass.AnnotationArgumentVisitor? { + return loadAnnotationIfNotSpecial(classId, annotations) + } + + override fun visitEnd() { + } + }, + byteContent, + ) + (symbol.fir.annotations as MutableList) += annotations + return symbol } private fun loadFunctionsByName(part: PackagePartsCacheData, name: Name): List> { diff --git a/compiler/testData/compileKotlinAgainstKotlin/importCompanion.kt b/compiler/testData/compileKotlinAgainstKotlin/importCompanion.kt new file mode 100644 index 00000000000..4309b9a7fb8 --- /dev/null +++ b/compiler/testData/compileKotlinAgainstKotlin/importCompanion.kt @@ -0,0 +1,16 @@ +// WITH_RUNTIME +// TARGET_BACKEND: JVM +// FILE: 1.kt +package test + +class C(val x: String) { + companion object { + @JvmField + val instance: C = C("OK") + } +} + +// FILE: 2.kt +import test.C.Companion.instance + +fun box() = instance.x diff --git a/compiler/tests-gen/org/jetbrains/kotlin/codegen/CompileKotlinAgainstKotlinTestGenerated.java b/compiler/tests-gen/org/jetbrains/kotlin/codegen/CompileKotlinAgainstKotlinTestGenerated.java index 1f60f98cec2..334e1f82531 100644 --- a/compiler/tests-gen/org/jetbrains/kotlin/codegen/CompileKotlinAgainstKotlinTestGenerated.java +++ b/compiler/tests-gen/org/jetbrains/kotlin/codegen/CompileKotlinAgainstKotlinTestGenerated.java @@ -153,6 +153,11 @@ public class CompileKotlinAgainstKotlinTestGenerated extends AbstractCompileKotl runTest("compiler/testData/compileKotlinAgainstKotlin/expectClassActualTypeAlias.kt"); } + @TestMetadata("importCompanion.kt") + public void testImportCompanion() throws Exception { + runTest("compiler/testData/compileKotlinAgainstKotlin/importCompanion.kt"); + } + @TestMetadata("inlineClassFromBinaryDependencies.kt") public void testInlineClassFromBinaryDependencies() throws Exception { runTest("compiler/testData/compileKotlinAgainstKotlin/inlineClassFromBinaryDependencies.kt"); diff --git a/compiler/tests-gen/org/jetbrains/kotlin/codegen/ir/IrCompileKotlinAgainstKotlinTestGenerated.java b/compiler/tests-gen/org/jetbrains/kotlin/codegen/ir/IrCompileKotlinAgainstKotlinTestGenerated.java index 84dae421148..a7fcd65d271 100644 --- a/compiler/tests-gen/org/jetbrains/kotlin/codegen/ir/IrCompileKotlinAgainstKotlinTestGenerated.java +++ b/compiler/tests-gen/org/jetbrains/kotlin/codegen/ir/IrCompileKotlinAgainstKotlinTestGenerated.java @@ -148,6 +148,11 @@ public class IrCompileKotlinAgainstKotlinTestGenerated extends AbstractIrCompile runTest("compiler/testData/compileKotlinAgainstKotlin/expectClassActualTypeAlias.kt"); } + @TestMetadata("importCompanion.kt") + public void testImportCompanion() throws Exception { + runTest("compiler/testData/compileKotlinAgainstKotlin/importCompanion.kt"); + } + @TestMetadata("inlineClassFromBinaryDependencies.kt") public void testInlineClassFromBinaryDependencies() throws Exception { runTest("compiler/testData/compileKotlinAgainstKotlin/inlineClassFromBinaryDependencies.kt"); diff --git a/compiler/tests-gen/org/jetbrains/kotlin/codegen/ir/JvmIrAgainstOldBoxTestGenerated.java b/compiler/tests-gen/org/jetbrains/kotlin/codegen/ir/JvmIrAgainstOldBoxTestGenerated.java index c7ce5ddf727..b00353dd020 100644 --- a/compiler/tests-gen/org/jetbrains/kotlin/codegen/ir/JvmIrAgainstOldBoxTestGenerated.java +++ b/compiler/tests-gen/org/jetbrains/kotlin/codegen/ir/JvmIrAgainstOldBoxTestGenerated.java @@ -148,6 +148,11 @@ public class JvmIrAgainstOldBoxTestGenerated extends AbstractJvmIrAgainstOldBoxT runTest("compiler/testData/compileKotlinAgainstKotlin/expectClassActualTypeAlias.kt"); } + @TestMetadata("importCompanion.kt") + public void testImportCompanion() throws Exception { + runTest("compiler/testData/compileKotlinAgainstKotlin/importCompanion.kt"); + } + @TestMetadata("inlineClassFromBinaryDependencies.kt") public void testInlineClassFromBinaryDependencies() throws Exception { runTest("compiler/testData/compileKotlinAgainstKotlin/inlineClassFromBinaryDependencies.kt"); diff --git a/compiler/tests-gen/org/jetbrains/kotlin/codegen/ir/JvmOldAgainstIrBoxTestGenerated.java b/compiler/tests-gen/org/jetbrains/kotlin/codegen/ir/JvmOldAgainstIrBoxTestGenerated.java index 5316aff8a28..0ac43e5c1dc 100644 --- a/compiler/tests-gen/org/jetbrains/kotlin/codegen/ir/JvmOldAgainstIrBoxTestGenerated.java +++ b/compiler/tests-gen/org/jetbrains/kotlin/codegen/ir/JvmOldAgainstIrBoxTestGenerated.java @@ -148,6 +148,11 @@ public class JvmOldAgainstIrBoxTestGenerated extends AbstractJvmOldAgainstIrBoxT runTest("compiler/testData/compileKotlinAgainstKotlin/expectClassActualTypeAlias.kt"); } + @TestMetadata("importCompanion.kt") + public void testImportCompanion() throws Exception { + runTest("compiler/testData/compileKotlinAgainstKotlin/importCompanion.kt"); + } + @TestMetadata("inlineClassFromBinaryDependencies.kt") public void testInlineClassFromBinaryDependencies() throws Exception { runTest("compiler/testData/compileKotlinAgainstKotlin/inlineClassFromBinaryDependencies.kt");