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 d7d63c8c288..ae29b8ce415 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
@@ -113,7 +113,7 @@ public abstract class AbstractBinaryClassAnnotationAndConstantLoader {
val signature = MemberSignature.fromFieldNameAndDesc(
container.nameResolver.getString(proto.name),
- ClassMapperLite.mapClass(container.nameResolver.getClassId(container.classProto!!.fqName))
+ ClassMapperLite.mapClass(container.nameResolver.getClassId((container as ProtoContainer.Class).classProto.fqName))
)
return findClassAndLoadMemberAnnotations(container, proto, signature)
}
@@ -132,7 +132,7 @@ public abstract class AbstractBinaryClassAnnotationAndConstantLoader {
- implClassName?.let { kotlinClassFinder.findKotlinClass(ClassId(packageFqName, it)) }
+ ): KotlinJvmBinaryClass? = when (container) {
+ is ProtoContainer.Package -> {
+ implClassName?.let { kotlinClassFinder.findKotlinClass(ClassId(container.fqName, it)) }
+ }
+ is ProtoContainer.Class -> {
+ val classId = container.nameResolver.getClassId(container.classProto.fqName)
+
+ if (implClassName != null) {
+ // TODO: store accurate name for nested traits
+ val implClassId =
+ if (implClassName.asString().endsWith(JvmAbi.DEFAULT_IMPLS_SUFFIX))
+ ClassId(classId.packageFqName, FqName(implClassName.asString().replace(JvmAbi.DEFAULT_IMPLS_SUFFIX, "." + JvmAbi.DEFAULT_IMPLS_CLASS_NAME)), false)
+ else
+ ClassId(classId.packageFqName, implClassName)
+ kotlinClassFinder.findKotlinClass(implClassId)
}
- classProto != null -> {
- val classId = container.nameResolver.getClassId(classProto.fqName)
-
- if (implClassName != null) {
- // TODO: store accurate name for nested traits
- val implClassId =
- if (implClassName.asString().endsWith(JvmAbi.DEFAULT_IMPLS_SUFFIX))
- ClassId(classId.packageFqName, FqName(implClassName.asString().replace(JvmAbi.DEFAULT_IMPLS_SUFFIX, "." + JvmAbi.DEFAULT_IMPLS_CLASS_NAME)), false)
- else
- ClassId(classId.packageFqName, implClassName)
- return kotlinClassFinder.findKotlinClass(implClassId)
- }
-
- if (isStaticFieldInOuter && classId.isNestedClass) {
- // Backing fields of properties of a companion object are generated in the outer class
- return kotlinClassFinder.findKotlinClass(classId.outerClassId)
- }
-
+ else if (isStaticFieldInOuter && classId.isNestedClass) {
+ // Backing fields of properties of a companion object are generated in the outer class
+ kotlinClassFinder.findKotlinClass(classId.outerClassId)
+ }
+ else {
kotlinClassFinder.findKotlinClass(classId)
}
- else -> null
}
}
diff --git a/core/deserialization/src/org/jetbrains/kotlin/serialization/deserialization/MemberDeserializer.kt b/core/deserialization/src/org/jetbrains/kotlin/serialization/deserialization/MemberDeserializer.kt
index 9ba2f356232..380756260ee 100644
--- a/core/deserialization/src/org/jetbrains/kotlin/serialization/deserialization/MemberDeserializer.kt
+++ b/core/deserialization/src/org/jetbrains/kotlin/serialization/deserialization/MemberDeserializer.kt
@@ -239,8 +239,8 @@ public class MemberDeserializer(private val c: DeserializationContext) {
}
private fun DeclarationDescriptor.asProtoContainer(): ProtoContainer? = when(this) {
- is PackageFragmentDescriptor -> ProtoContainer(null, fqName, c.nameResolver, c.typeTable)
- is DeserializedClassDescriptor -> ProtoContainer(classProto, null, c.nameResolver, c.typeTable)
+ is PackageFragmentDescriptor -> ProtoContainer.Package(fqName, c.nameResolver, c.typeTable)
+ is DeserializedClassDescriptor -> ProtoContainer.Class(classProto, c.nameResolver, c.typeTable)
else -> null // TODO: support annotations on lambdas and their parameters
}
}
diff --git a/core/deserialization/src/org/jetbrains/kotlin/serialization/deserialization/ProtoContainer.kt b/core/deserialization/src/org/jetbrains/kotlin/serialization/deserialization/ProtoContainer.kt
index e06990c1a77..c0947d1854c 100644
--- a/core/deserialization/src/org/jetbrains/kotlin/serialization/deserialization/ProtoContainer.kt
+++ b/core/deserialization/src/org/jetbrains/kotlin/serialization/deserialization/ProtoContainer.kt
@@ -19,16 +19,25 @@ package org.jetbrains.kotlin.serialization.deserialization
import org.jetbrains.kotlin.name.FqName
import org.jetbrains.kotlin.serialization.ProtoBuf
-public data class ProtoContainer(
- val classProto: ProtoBuf.Class?,
- val packageFqName: FqName?,
+sealed class ProtoContainer(
val nameResolver: NameResolver,
val typeTable: TypeTable
) {
- init {
- assert((classProto != null) xor (packageFqName != null))
+ class Class(
+ val classProto: ProtoBuf.Class,
+ nameResolver: NameResolver,
+ typeTable: TypeTable
+ ) : ProtoContainer(nameResolver, typeTable) {
+ override fun debugFqName(): FqName = nameResolver.getClassId(classProto.fqName).asSingleFqName()
}
- fun getFqName(): FqName =
- packageFqName ?: nameResolver.getClassId(classProto!!.getFqName()).asSingleFqName()
+ class Package(
+ val fqName: FqName,
+ nameResolver: NameResolver,
+ typeTable: TypeTable
+ ) : ProtoContainer(nameResolver, typeTable) {
+ override fun debugFqName(): FqName = fqName
+ }
+
+ abstract fun debugFqName(): FqName
}
diff --git a/core/deserialization/src/org/jetbrains/kotlin/serialization/deserialization/descriptors/DeserializedClassDescriptor.kt b/core/deserialization/src/org/jetbrains/kotlin/serialization/deserialization/descriptors/DeserializedClassDescriptor.kt
index e13207d5171..8042e67bfb4 100644
--- a/core/deserialization/src/org/jetbrains/kotlin/serialization/deserialization/descriptors/DeserializedClassDescriptor.kt
+++ b/core/deserialization/src/org/jetbrains/kotlin/serialization/deserialization/descriptors/DeserializedClassDescriptor.kt
@@ -296,7 +296,7 @@ public class DeserializedClassDescriptor(
val annotations = enumEntryProtos[name]?.let { proto ->
DeserializedAnnotations(c.storageManager) {
c.components.annotationAndConstantLoader.loadEnumEntryAnnotations(
- ProtoContainer(classProto, null, c.nameResolver, c.typeTable), proto
+ ProtoContainer.Class(classProto, c.nameResolver, c.typeTable), proto
)
}
} ?: if (name in oldEnumEntryNames) Annotations.EMPTY
diff --git a/idea/idea-analysis/src/org/jetbrains/kotlin/idea/decompiler/stubBuilder/CallableClsStubBuilder.kt b/idea/idea-analysis/src/org/jetbrains/kotlin/idea/decompiler/stubBuilder/CallableClsStubBuilder.kt
index 699d4f26d85..ae0ae88c732 100644
--- a/idea/idea-analysis/src/org/jetbrains/kotlin/idea/decompiler/stubBuilder/CallableClsStubBuilder.kt
+++ b/idea/idea-analysis/src/org/jetbrains/kotlin/idea/decompiler/stubBuilder/CallableClsStubBuilder.kt
@@ -76,7 +76,7 @@ abstract class CallableClsStubBuilder(
) {
protected val c = outerContext.child(typeParameters)
protected val typeStubBuilder = TypeClsStubBuilder(c)
- protected val isTopLevel: Boolean get() = protoContainer.packageFqName != null
+ protected val isTopLevel: Boolean get() = protoContainer is ProtoContainer.Package
protected val callableStub: StubElement by lazy(LazyThreadSafetyMode.NONE) { doCreateCallableStub(parent) }
fun build() {
diff --git a/idea/idea-analysis/src/org/jetbrains/kotlin/idea/decompiler/stubBuilder/ClassClsStubBuilder.kt b/idea/idea-analysis/src/org/jetbrains/kotlin/idea/decompiler/stubBuilder/ClassClsStubBuilder.kt
index d92218f766b..f0c5642f388 100644
--- a/idea/idea-analysis/src/org/jetbrains/kotlin/idea/decompiler/stubBuilder/ClassClsStubBuilder.kt
+++ b/idea/idea-analysis/src/org/jetbrains/kotlin/idea/decompiler/stubBuilder/ClassClsStubBuilder.kt
@@ -137,7 +137,7 @@ private class ClassClsStubBuilder(
val primaryConstructorProto = classProto.constructorList.find { !Flags.IS_SECONDARY.get(it.flags) } ?: return
- createConstructorStub(classOrObjectStub, primaryConstructorProto, c, ProtoContainer(classProto, null, c.nameResolver, c.typeTable))
+ createConstructorStub(classOrObjectStub, primaryConstructorProto, c, ProtoContainer.Class(classProto, c.nameResolver, c.typeTable))
}
private fun createDelegationSpecifierList() {
@@ -175,7 +175,7 @@ private class ClassClsStubBuilder(
private fun createEnumEntryStubs(classBody: KotlinPlaceHolderStubImpl) {
if (classKind != ProtoBuf.Class.Kind.ENUM_CLASS) return
- val container = ProtoContainer(classProto, null, c.nameResolver, c.typeTable)
+ val container = ProtoContainer.Class(classProto, c.nameResolver, c.typeTable)
val enumEntries: List>> =
if (classProto.enumEntryList.isNotEmpty())
classProto.enumEntryList.map { enumEntryProto ->
@@ -206,7 +206,7 @@ private class ClassClsStubBuilder(
}
private fun createCallableMemberStubs(classBody: KotlinPlaceHolderStubImpl) {
- val container = ProtoContainer(classProto, null, c.nameResolver, c.typeTable)
+ val container = ProtoContainer.Class(classProto, c.nameResolver, c.typeTable)
for (secondaryConstructorProto in classProto.constructorList) {
if (Flags.IS_SECONDARY.get(secondaryConstructorProto.flags)) {
diff --git a/idea/idea-analysis/src/org/jetbrains/kotlin/idea/decompiler/stubBuilder/clsStubBuilding.kt b/idea/idea-analysis/src/org/jetbrains/kotlin/idea/decompiler/stubBuilder/clsStubBuilding.kt
index f3458fef9dd..b6806f94736 100644
--- a/idea/idea-analysis/src/org/jetbrains/kotlin/idea/decompiler/stubBuilder/clsStubBuilding.kt
+++ b/idea/idea-analysis/src/org/jetbrains/kotlin/idea/decompiler/stubBuilder/clsStubBuilding.kt
@@ -52,7 +52,7 @@ fun createPackageFacadeStub(
): KotlinFileStubImpl {
val fileStub = KotlinFileStubForIde.forFile(packageFqName, packageFqName.isRoot)
setupFileStub(fileStub, packageFqName)
- createCallableStubs(fileStub, c, ProtoContainer(null, packageFqName, c.nameResolver, c.typeTable),
+ createCallableStubs(fileStub, c, ProtoContainer.Package(packageFqName, c.nameResolver, c.typeTable),
packageProto.functionList, packageProto.propertyList)
return fileStub
}
@@ -65,7 +65,7 @@ fun createFileFacadeStub(
val packageFqName = facadeFqName.parent()
val fileStub = KotlinFileStubForIde.forFileFacadeStub(facadeFqName, packageFqName.isRoot)
setupFileStub(fileStub, packageFqName)
- createCallableStubs(fileStub, c, ProtoContainer(null, packageFqName, c.nameResolver, c.typeTable),
+ createCallableStubs(fileStub, c, ProtoContainer.Package(packageFqName, c.nameResolver, c.typeTable),
packageProto.functionList, packageProto.propertyList)
return fileStub
}
@@ -84,7 +84,7 @@ fun createMultifileClassStub(
val partHeader = partFile.classHeader
val (nameResolver, packageProto) = JvmProtoBufUtil.readPackageDataFrom(partHeader.annotationData!!, partHeader.strings!!)
val partContext = components.createContext(nameResolver, packageFqName, TypeTable(packageProto.typeTable))
- createCallableStubs(fileStub, partContext, ProtoContainer(null, packageFqName, partContext.nameResolver, partContext.typeTable),
+ createCallableStubs(fileStub, partContext, ProtoContainer.Package(packageFqName, partContext.nameResolver, partContext.typeTable),
packageProto.functionList, packageProto.propertyList)
}
return fileStub