Store outer class in ProtoContainer instead of only its kind
This commit is contained in:
+6
-4
@@ -215,10 +215,12 @@ abstract class AbstractBinaryClassAnnotationAndConstantLoader<A : Any, C : Any,
|
|||||||
return kotlinClassFinder.findKotlinClass(implClassName)
|
return kotlinClassFinder.findKotlinClass(implClassName)
|
||||||
}
|
}
|
||||||
|
|
||||||
if (field && container.kind == ProtoBuf.Class.Kind.COMPANION_OBJECT &&
|
if (field && container.kind == ProtoBuf.Class.Kind.COMPANION_OBJECT) {
|
||||||
(container.outerClassKind == ClassKind.CLASS || container.outerClassKind == ClassKind.ENUM_CLASS)) {
|
val outerClass = container.outerClass
|
||||||
// Backing fields of properties of a companion object in a class are generated in the outer class
|
if (outerClass != null && (outerClass.kind == ProtoBuf.Class.Kind.CLASS || outerClass.kind == ProtoBuf.Class.Kind.ENUM_CLASS)) {
|
||||||
return kotlinClassFinder.findKotlinClass(container.classId.outerClassId)
|
// Backing fields of properties of a companion object in a class are generated in the outer class
|
||||||
|
return outerClass.toBinaryClass()
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return containerBinaryClass
|
return containerBinaryClass
|
||||||
|
|||||||
+1
-2
@@ -16,7 +16,6 @@
|
|||||||
|
|
||||||
package org.jetbrains.kotlin.serialization.deserialization
|
package org.jetbrains.kotlin.serialization.deserialization
|
||||||
|
|
||||||
import org.jetbrains.kotlin.descriptors.ClassKind
|
|
||||||
import org.jetbrains.kotlin.descriptors.SourceElement
|
import org.jetbrains.kotlin.descriptors.SourceElement
|
||||||
import org.jetbrains.kotlin.name.ClassId
|
import org.jetbrains.kotlin.name.ClassId
|
||||||
import org.jetbrains.kotlin.name.FqName
|
import org.jetbrains.kotlin.name.FqName
|
||||||
@@ -33,7 +32,7 @@ sealed class ProtoContainer(
|
|||||||
nameResolver: NameResolver,
|
nameResolver: NameResolver,
|
||||||
typeTable: TypeTable,
|
typeTable: TypeTable,
|
||||||
source: SourceElement?,
|
source: SourceElement?,
|
||||||
val outerClassKind: ClassKind?
|
val outerClass: ProtoContainer.Class?
|
||||||
) : ProtoContainer(nameResolver, typeTable, source) {
|
) : ProtoContainer(nameResolver, typeTable, source) {
|
||||||
val classId: ClassId = nameResolver.getClassId(classProto.fqName)
|
val classId: ClassId = nameResolver.getClassId(classProto.fqName)
|
||||||
|
|
||||||
|
|||||||
+3
-2
@@ -73,8 +73,9 @@ class DeserializedClassDescriptor(
|
|||||||
private val constructors = c.storageManager.createLazyValue { computeConstructors() }
|
private val constructors = c.storageManager.createLazyValue { computeConstructors() }
|
||||||
private val companionObjectDescriptor = c.storageManager.createNullableLazyValue { computeCompanionObjectDescriptor() }
|
private val companionObjectDescriptor = c.storageManager.createNullableLazyValue { computeCompanionObjectDescriptor() }
|
||||||
|
|
||||||
internal val thisAsProtoContainer = ProtoContainer.Class(
|
internal val thisAsProtoContainer: ProtoContainer.Class = ProtoContainer.Class(
|
||||||
classProto, c.nameResolver, c.typeTable, sourceElement, (containingDeclaration as? ClassDescriptor)?.kind
|
classProto, c.nameResolver, c.typeTable, sourceElement,
|
||||||
|
(containingDeclaration as? DeserializedClassDescriptor)?.thisAsProtoContainer
|
||||||
)
|
)
|
||||||
|
|
||||||
private val annotations =
|
private val annotations =
|
||||||
|
|||||||
+12
-8
@@ -37,7 +37,10 @@ import org.jetbrains.kotlin.psi.stubs.impl.KotlinObjectStubImpl
|
|||||||
import org.jetbrains.kotlin.psi.stubs.impl.KotlinPlaceHolderStubImpl
|
import org.jetbrains.kotlin.psi.stubs.impl.KotlinPlaceHolderStubImpl
|
||||||
import org.jetbrains.kotlin.serialization.Flags
|
import org.jetbrains.kotlin.serialization.Flags
|
||||||
import org.jetbrains.kotlin.serialization.ProtoBuf
|
import org.jetbrains.kotlin.serialization.ProtoBuf
|
||||||
import org.jetbrains.kotlin.serialization.deserialization.*
|
import org.jetbrains.kotlin.serialization.deserialization.NameResolver
|
||||||
|
import org.jetbrains.kotlin.serialization.deserialization.ProtoContainer
|
||||||
|
import org.jetbrains.kotlin.serialization.deserialization.TypeTable
|
||||||
|
import org.jetbrains.kotlin.serialization.deserialization.supertypes
|
||||||
|
|
||||||
fun createClassStub(
|
fun createClassStub(
|
||||||
parent: StubElement<out PsiElement>,
|
parent: StubElement<out PsiElement>,
|
||||||
@@ -58,9 +61,14 @@ private class ClassClsStubBuilder(
|
|||||||
private val source: SourceElement?,
|
private val source: SourceElement?,
|
||||||
private val outerContext: ClsStubBuilderContext
|
private val outerContext: ClsStubBuilderContext
|
||||||
) {
|
) {
|
||||||
private val classKind = Flags.CLASS_KIND[classProto.flags]
|
private val thisAsProtoContainer = ProtoContainer.Class(
|
||||||
private val c = outerContext.child(classProto.typeParameterList, classKind, classId.shortClassName, nameResolver,
|
classProto, nameResolver, TypeTable(classProto.typeTable), source, outerContext.protoContainer
|
||||||
TypeTable(classProto.typeTable))
|
)
|
||||||
|
private val classKind = thisAsProtoContainer.kind
|
||||||
|
|
||||||
|
private val c = outerContext.child(
|
||||||
|
classProto.typeParameterList, classId.shortClassName, nameResolver, thisAsProtoContainer.typeTable, thisAsProtoContainer
|
||||||
|
)
|
||||||
private val typeStubBuilder = TypeClsStubBuilder(c)
|
private val typeStubBuilder = TypeClsStubBuilder(c)
|
||||||
private val supertypeIds = run {
|
private val supertypeIds = run {
|
||||||
val supertypeIds = classProto.supertypes(c.typeTable).map { c.nameResolver.getClassId(it.className) }
|
val supertypeIds = classProto.supertypes(c.typeTable).map { c.nameResolver.getClassId(it.className) }
|
||||||
@@ -76,10 +84,6 @@ private class ClassClsStubBuilder(
|
|||||||
private val companionObjectName =
|
private val companionObjectName =
|
||||||
if (classProto.hasCompanionObjectName()) c.nameResolver.getName(classProto.companionObjectName) else null
|
if (classProto.hasCompanionObjectName()) c.nameResolver.getName(classProto.companionObjectName) else null
|
||||||
|
|
||||||
private val thisAsProtoContainer = ProtoContainer.Class(
|
|
||||||
classProto, c.nameResolver, c.typeTable, source, outerContext.classKind?.let { Deserialization.classKind(it) }
|
|
||||||
)
|
|
||||||
|
|
||||||
private val classOrObjectStub = createClassOrObjectStubAndModifierListStub()
|
private val classOrObjectStub = createClassOrObjectStubAndModifierListStub()
|
||||||
|
|
||||||
fun build() {
|
fun build() {
|
||||||
|
|||||||
+6
-9
@@ -22,10 +22,7 @@ import org.jetbrains.kotlin.name.ClassId
|
|||||||
import org.jetbrains.kotlin.name.FqName
|
import org.jetbrains.kotlin.name.FqName
|
||||||
import org.jetbrains.kotlin.name.Name
|
import org.jetbrains.kotlin.name.Name
|
||||||
import org.jetbrains.kotlin.serialization.ProtoBuf
|
import org.jetbrains.kotlin.serialization.ProtoBuf
|
||||||
import org.jetbrains.kotlin.serialization.deserialization.AnnotationAndConstantLoader
|
import org.jetbrains.kotlin.serialization.deserialization.*
|
||||||
import org.jetbrains.kotlin.serialization.deserialization.ClassDataFinder
|
|
||||||
import org.jetbrains.kotlin.serialization.deserialization.NameResolver
|
|
||||||
import org.jetbrains.kotlin.serialization.deserialization.TypeTable
|
|
||||||
|
|
||||||
data class ClassIdWithTarget(val classId: ClassId, val target: AnnotationUseSiteTarget?)
|
data class ClassIdWithTarget(val classId: ClassId, val target: AnnotationUseSiteTarget?)
|
||||||
|
|
||||||
@@ -39,7 +36,7 @@ class ClsStubBuilderComponents(
|
|||||||
packageFqName: FqName,
|
packageFqName: FqName,
|
||||||
typeTable: TypeTable
|
typeTable: TypeTable
|
||||||
): ClsStubBuilderContext {
|
): ClsStubBuilderContext {
|
||||||
return ClsStubBuilderContext(this, nameResolver, packageFqName, EmptyTypeParameters, typeTable, classKind = null)
|
return ClsStubBuilderContext(this, nameResolver, packageFqName, EmptyTypeParameters, typeTable, protoContainer = null)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -70,15 +67,15 @@ class ClsStubBuilderContext(
|
|||||||
val containerFqName: FqName,
|
val containerFqName: FqName,
|
||||||
val typeParameters: TypeParameters,
|
val typeParameters: TypeParameters,
|
||||||
val typeTable: TypeTable,
|
val typeTable: TypeTable,
|
||||||
val classKind: ProtoBuf.Class.Kind?
|
val protoContainer: ProtoContainer.Class?
|
||||||
)
|
)
|
||||||
|
|
||||||
internal fun ClsStubBuilderContext.child(
|
internal fun ClsStubBuilderContext.child(
|
||||||
typeParameterList: List<ProtoBuf.TypeParameter>,
|
typeParameterList: List<ProtoBuf.TypeParameter>,
|
||||||
classKind: ProtoBuf.Class.Kind? = null,
|
|
||||||
name: Name? = null,
|
name: Name? = null,
|
||||||
nameResolver: NameResolver = this.nameResolver,
|
nameResolver: NameResolver = this.nameResolver,
|
||||||
typeTable: TypeTable = this.typeTable
|
typeTable: TypeTable = this.typeTable,
|
||||||
|
protoContainer: ProtoContainer.Class? = this.protoContainer
|
||||||
): ClsStubBuilderContext {
|
): ClsStubBuilderContext {
|
||||||
return ClsStubBuilderContext(
|
return ClsStubBuilderContext(
|
||||||
this.components,
|
this.components,
|
||||||
@@ -86,6 +83,6 @@ internal fun ClsStubBuilderContext.child(
|
|||||||
if (name != null) this.containerFqName.child(name) else this.containerFqName,
|
if (name != null) this.containerFqName.child(name) else this.containerFqName,
|
||||||
this.typeParameters.child(nameResolver, typeParameterList),
|
this.typeParameters.child(nameResolver, typeParameterList),
|
||||||
typeTable,
|
typeTable,
|
||||||
classKind
|
protoContainer
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user