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