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 {