diff --git a/core/descriptor.loader.java/src/org/jetbrains/kotlin/load/kotlin/AbstractBinaryClassAnnotationAndConstantLoader.kt b/core/descriptor.loader.java/src/org/jetbrains/kotlin/load/kotlin/AbstractBinaryClassAnnotationAndConstantLoader.kt index 76f77305f19..ee20f77ae53 100644 --- a/core/descriptor.loader.java/src/org/jetbrains/kotlin/load/kotlin/AbstractBinaryClassAnnotationAndConstantLoader.kt +++ b/core/descriptor.loader.java/src/org/jetbrains/kotlin/load/kotlin/AbstractBinaryClassAnnotationAndConstantLoader.kt @@ -19,9 +19,7 @@ package org.jetbrains.kotlin.load.kotlin import org.jetbrains.kotlin.descriptors.SourceElement import org.jetbrains.kotlin.load.java.JvmAnnotationNames import org.jetbrains.kotlin.name.ClassId -import org.jetbrains.kotlin.name.FqName import org.jetbrains.kotlin.name.Name -import org.jetbrains.kotlin.serialization.Flags import org.jetbrains.kotlin.serialization.ProtoBuf import org.jetbrains.kotlin.serialization.deserialization.* import org.jetbrains.kotlin.serialization.jvm.JvmProtoBuf @@ -64,7 +62,7 @@ public abstract class AbstractBinaryClassAnnotationAndConstantLoader { - val classId = nameResolver.getClassId(classProto.getFqName()) + val classId = nameResolver.getClassId(classProto.fqName) val kotlinClass = kotlinClassFinder.findKotlinClass(classId) if (kotlinClass == null) { // This means that the resource we're constructing the descriptor from is no longer present: KotlinClassFinder had found the @@ -98,17 +96,17 @@ public abstract class AbstractBinaryClassAnnotationAndConstantLoader - findClassAndLoadMemberAnnotations(container, proto, nameResolver, kind, sig, false) + findClassAndLoadMemberAnnotations(container, proto, nameResolver, sig) } ?: listOf() val fieldAnnotations = fieldSignature?.let { sig -> - findClassAndLoadMemberAnnotations(container, proto, nameResolver, kind, sig) + findClassAndLoadMemberAnnotations(container, proto, nameResolver, sig, isStaticFieldInOuter(proto)) } ?: listOf() return loadPropertyAnnotations(propertyAnnotations, fieldAnnotations) } val signature = getCallableSignature(proto, nameResolver, kind) ?: return listOf() - return transformAnnotations(findClassAndLoadMemberAnnotations(container, proto, nameResolver, kind, signature)) + return transformAnnotations(findClassAndLoadMemberAnnotations(container, proto, nameResolver, signature)) } protected abstract fun loadPropertyAnnotations(propertyAnnotations: List, fieldAnnotations: List): List @@ -119,11 +117,12 @@ public abstract class AbstractBinaryClassAnnotationAndConstantLoader { - val kotlinClass = findClassWithAnnotationsAndInitializers(container, proto, nameResolver, kind, seekForStaticFieldInOuter) + val kotlinClass = findClassWithAnnotationsAndInitializers( + container, nameResolver, getImplClassName(proto, nameResolver), isStaticFieldInOuter + ) if (kotlinClass == null) { errorReporter.reportLoadingError("Kotlin class for loading member annotations is not found: ${container.getFqName(nameResolver)}", null) return listOf() @@ -144,7 +143,7 @@ public abstract class AbstractBinaryClassAnnotationAndConstantLoader { + implClassName?.let { kotlinClassFinder.findKotlinClass(ClassId(packageFqName, it)) } } - return null - } + classProto != null -> { + val classId = nameResolver.getClassId(classProto.fqName) - return kotlinClassFinder.findKotlinClass(classId) + if (implClassName != null) { + // TODO: store accurate name for nested traits + return kotlinClassFinder.findKotlinClass(ClassId(classId.packageFqName, implClassName)) + } + + if (isStaticFieldInOuter && classId.isNestedClass) { + // Backing fields of properties of a companion object are generated in the outer class + return kotlinClassFinder.findKotlinClass(classId.outerClassId) + } + + kotlinClassFinder.findKotlinClass(classId) + } + else -> null + } } - private fun findPackagePartClass( - packageFqName: FqName, - proto: ProtoBuf.Callable, - nameResolver: NameResolver - ): KotlinJvmBinaryClass? { - if (proto.hasExtension(implClassName)) { - val implClassName = nameResolver.getName(proto.getExtension(implClassName)) - return kotlinClassFinder.findKotlinClass(ClassId(packageFqName, implClassName)) - } - return null + private fun getImplClassName(proto: ProtoBuf.Callable, nameResolver: NameResolver): Name? { + return if (proto.hasExtension(implClassName)) nameResolver.getName(proto.getExtension(implClassName)) else null } private fun isStaticFieldInOuter(proto: ProtoBuf.Callable): Boolean { - if (!proto.hasExtension(propertySignature)) return false - val propertySignature = proto.getExtension(propertySignature) - return propertySignature.hasField() && propertySignature.getField().getIsStaticInOuter() + return proto.hasExtension(propertySignature) && + proto.getExtension(propertySignature).let { it.hasField() && it.field.isStaticInOuter } } private fun loadAnnotationsAndInitializers(kotlinClass: KotlinJvmBinaryClass): Storage {