diff --git a/compiler/ir/backend.common/src/KotlinIr.proto b/compiler/ir/backend.common/src/KotlinIr.proto index 1d6772bbae8..a8da4ec2964 100644 --- a/compiler/ir/backend.common/src/KotlinIr.proto +++ b/compiler/ir/backend.common/src/KotlinIr.proto @@ -16,6 +16,7 @@ message DescriptorReference { optional bool is_default_constructor = 9 [default = false]; optional bool is_enum_entry = 10 [default = false]; optional bool is_enum_special = 11 [default = false]; + optional bool is_type_parameter = 12 [default = false]; } message UniqId { diff --git a/compiler/ir/backend.common/src/org/jetbrains/kotlin/backend/common/serialization/DeclarationTable.kt b/compiler/ir/backend.common/src/org/jetbrains/kotlin/backend/common/serialization/DeclarationTable.kt index 079a82fae6d..cd9a9cd7ec6 100644 --- a/compiler/ir/backend.common/src/org/jetbrains/kotlin/backend/common/serialization/DeclarationTable.kt +++ b/compiler/ir/backend.common/src/org/jetbrains/kotlin/backend/common/serialization/DeclarationTable.kt @@ -40,7 +40,7 @@ abstract class DeclarationTable(val builtIns: IrBuiltIns, val descriptorTable: D val index = if (value.origin == IrDeclarationOrigin.FAKE_OVERRIDE || !value.isExported() || value is IrVariable - || value is IrTypeParameter + || (value is IrTypeParameter && value.parent !is IrClass) || value is IrValueParameter || value is IrAnonymousInitializerImpl ) { diff --git a/compiler/ir/backend.common/src/org/jetbrains/kotlin/backend/common/serialization/DeserializeDescriptorReference.kt b/compiler/ir/backend.common/src/org/jetbrains/kotlin/backend/common/serialization/DeserializeDescriptorReference.kt index 77ad90b13a7..68cd418105e 100644 --- a/compiler/ir/backend.common/src/org/jetbrains/kotlin/backend/common/serialization/DeserializeDescriptorReference.kt +++ b/compiler/ir/backend.common/src/org/jetbrains/kotlin/backend/common/serialization/DeserializeDescriptorReference.kt @@ -84,7 +84,8 @@ abstract class DescriptorReferenceDeserializer( isDefaultConstructor: Boolean = false, isFakeOverride: Boolean = false, isGetter: Boolean = false, - isSetter: Boolean = false + isSetter: Boolean = false, + isTypeParameter: Boolean = false ): DeclarationDescriptor { val packageFqName = packageFqNameString.let { if (it == "") FqName.ROOT else FqName(it) @@ -131,6 +132,10 @@ abstract class DescriptorReferenceDeserializer( .getContributedFunctions(Name.identifier(name), NoLookupLocation.FROM_BACKEND).single() } + if (isTypeParameter) { + return clazz!!.declaredTypeParameters.first { it.name.asString() == name } + } + if (protoIndex?.let { checkIfSpecialDescriptorId(it) } == true) { return resolveSpecialDescriptor(packageFqName.child(Name.identifier(name))) } diff --git a/compiler/ir/backend.common/src/org/jetbrains/kotlin/backend/common/serialization/KotlinIrLinker.kt b/compiler/ir/backend.common/src/org/jetbrains/kotlin/backend/common/serialization/KotlinIrLinker.kt index 0e00c42f198..1f5aec59150 100644 --- a/compiler/ir/backend.common/src/org/jetbrains/kotlin/backend/common/serialization/KotlinIrLinker.kt +++ b/compiler/ir/backend.common/src/org/jetbrains/kotlin/backend/common/serialization/KotlinIrLinker.kt @@ -177,7 +177,8 @@ abstract class KotlinIrLinker( isDefaultConstructor = proto.isDefaultConstructor, isFakeOverride = proto.isFakeOverride, isGetter = proto.isGetter, - isSetter = proto.isSetter + isSetter = proto.isSetter, + isTypeParameter = proto.isTypeParameter ) private val ByteArray.codedInputStream: org.jetbrains.kotlin.protobuf.CodedInputStream diff --git a/compiler/ir/backend.common/src/org/jetbrains/kotlin/backend/common/serialization/SerializeDescriptorReference.kt b/compiler/ir/backend.common/src/org/jetbrains/kotlin/backend/common/serialization/SerializeDescriptorReference.kt index 04e4dff121a..fa324433d18 100644 --- a/compiler/ir/backend.common/src/org/jetbrains/kotlin/backend/common/serialization/SerializeDescriptorReference.kt +++ b/compiler/ir/backend.common/src/org/jetbrains/kotlin/backend/common/serialization/SerializeDescriptorReference.kt @@ -29,7 +29,10 @@ open class DescriptorReferenceSerializer( } if (declaration is IrAnonymousInitializer) return null - if (descriptor is ParameterDescriptor || (descriptor is VariableDescriptor && descriptor !is PropertyDescriptor) || descriptor is TypeParameterDescriptor) return null + if (descriptor is ParameterDescriptor || + (descriptor is VariableDescriptor && descriptor !is PropertyDescriptor) + || (declaration is IrTypeParameter && declaration.parent !is IrClass) + ) return null val containingDeclaration = descriptor.containingDeclaration!! @@ -49,6 +52,7 @@ open class DescriptorReferenceSerializer( descriptor is ClassConstructorDescriptor && containingDeclaration is ClassDescriptor && containingDeclaration.kind == ClassKind.OBJECT val isEnumEntry = descriptor is ClassDescriptor && descriptor.kind == ClassKind.ENUM_ENTRY val isEnumSpecial = declaration.origin == IrDeclarationOrigin.ENUM_CLASS_SPECIAL_MEMBER + val isTypeParameter = declaration is IrTypeParameter && declaration.parent is IrClass val realDeclaration = if (isFakeOverride) { @@ -103,6 +107,8 @@ open class DescriptorReferenceSerializer( proto.setIsEnumEntry(true) } else if (isEnumSpecial) { proto.setIsEnumSpecial(true) + } else if (isTypeParameter) { + proto.setIsTypeParameter(true) } return proto.build() diff --git a/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/lower/serialization/ir/IrKlibProtoBuf.java b/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/lower/serialization/ir/IrKlibProtoBuf.java index 6dc604817f1..c3bc35685ff 100644 --- a/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/lower/serialization/ir/IrKlibProtoBuf.java +++ b/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/lower/serialization/ir/IrKlibProtoBuf.java @@ -976,6 +976,15 @@ public final class IrKlibProtoBuf { * optional bool is_enum_special = 11 [default = false]; */ boolean getIsEnumSpecial(); + + /** + * optional bool is_type_parameter = 12 [default = false]; + */ + boolean hasIsTypeParameter(); + /** + * optional bool is_type_parameter = 12 [default = false]; + */ + boolean getIsTypeParameter(); } /** * Protobuf type {@code org.jetbrains.kotlin.ir.backend.js.lower.serialization.ir.DescriptorReference} @@ -1114,6 +1123,11 @@ public final class IrKlibProtoBuf { isEnumSpecial_ = input.readBool(); break; } + case 96: { + bitField0_ |= 0x00000800; + isTypeParameter_ = input.readBool(); + break; + } } } } catch (org.jetbrains.kotlin.protobuf.InvalidProtocolBufferException e) { @@ -1313,6 +1327,21 @@ public final class IrKlibProtoBuf { return isEnumSpecial_; } + public static final int IS_TYPE_PARAMETER_FIELD_NUMBER = 12; + private boolean isTypeParameter_; + /** + * optional bool is_type_parameter = 12 [default = false]; + */ + public boolean hasIsTypeParameter() { + return ((bitField0_ & 0x00000800) == 0x00000800); + } + /** + * optional bool is_type_parameter = 12 [default = false]; + */ + public boolean getIsTypeParameter() { + return isTypeParameter_; + } + private void initFields() { packageFqName_ = org.jetbrains.kotlin.ir.backend.js.lower.serialization.ir.IrKlibProtoBuf.String.getDefaultInstance(); classFqName_ = org.jetbrains.kotlin.ir.backend.js.lower.serialization.ir.IrKlibProtoBuf.String.getDefaultInstance(); @@ -1325,6 +1354,7 @@ public final class IrKlibProtoBuf { isDefaultConstructor_ = false; isEnumEntry_ = false; isEnumSpecial_ = false; + isTypeParameter_ = false; } private byte memoizedIsInitialized = -1; public final boolean isInitialized() { @@ -1402,6 +1432,9 @@ public final class IrKlibProtoBuf { if (((bitField0_ & 0x00000400) == 0x00000400)) { output.writeBool(11, isEnumSpecial_); } + if (((bitField0_ & 0x00000800) == 0x00000800)) { + output.writeBool(12, isTypeParameter_); + } output.writeRawBytes(unknownFields); } @@ -1455,6 +1488,10 @@ public final class IrKlibProtoBuf { size += org.jetbrains.kotlin.protobuf.CodedOutputStream .computeBoolSize(11, isEnumSpecial_); } + if (((bitField0_ & 0x00000800) == 0x00000800)) { + size += org.jetbrains.kotlin.protobuf.CodedOutputStream + .computeBoolSize(12, isTypeParameter_); + } size += unknownFields.size(); memoizedSerializedSize = size; return size; @@ -1571,6 +1608,8 @@ public final class IrKlibProtoBuf { bitField0_ = (bitField0_ & ~0x00000200); isEnumSpecial_ = false; bitField0_ = (bitField0_ & ~0x00000400); + isTypeParameter_ = false; + bitField0_ = (bitField0_ & ~0x00000800); return this; } @@ -1638,6 +1677,10 @@ public final class IrKlibProtoBuf { to_bitField0_ |= 0x00000400; } result.isEnumSpecial_ = isEnumSpecial_; + if (((from_bitField0_ & 0x00000800) == 0x00000800)) { + to_bitField0_ |= 0x00000800; + } + result.isTypeParameter_ = isTypeParameter_; result.bitField0_ = to_bitField0_; return result; } @@ -1677,6 +1720,9 @@ public final class IrKlibProtoBuf { if (other.hasIsEnumSpecial()) { setIsEnumSpecial(other.getIsEnumSpecial()); } + if (other.hasIsTypeParameter()) { + setIsTypeParameter(other.getIsTypeParameter()); + } setUnknownFields( getUnknownFields().concat(other.unknownFields)); return this; @@ -2199,6 +2245,38 @@ public final class IrKlibProtoBuf { return this; } + private boolean isTypeParameter_ ; + /** + * optional bool is_type_parameter = 12 [default = false]; + */ + public boolean hasIsTypeParameter() { + return ((bitField0_ & 0x00000800) == 0x00000800); + } + /** + * optional bool is_type_parameter = 12 [default = false]; + */ + public boolean getIsTypeParameter() { + return isTypeParameter_; + } + /** + * optional bool is_type_parameter = 12 [default = false]; + */ + public Builder setIsTypeParameter(boolean value) { + bitField0_ |= 0x00000800; + isTypeParameter_ = value; + + return this; + } + /** + * optional bool is_type_parameter = 12 [default = false]; + */ + public Builder clearIsTypeParameter() { + bitField0_ = (bitField0_ & ~0x00000800); + isTypeParameter_ = false; + + return this; + } + // @@protoc_insertion_point(builder_scope:org.jetbrains.kotlin.ir.backend.js.lower.serialization.ir.DescriptorReference) } diff --git a/core/deserialization/src/org/jetbrains/kotlin/serialization/deserialization/descriptors/DeserializedTypeParameterDescriptor.kt b/core/deserialization/src/org/jetbrains/kotlin/serialization/deserialization/descriptors/DeserializedTypeParameterDescriptor.kt index 993d733c8ea..d478d05752d 100644 --- a/core/deserialization/src/org/jetbrains/kotlin/serialization/deserialization/descriptors/DeserializedTypeParameterDescriptor.kt +++ b/core/deserialization/src/org/jetbrains/kotlin/serialization/deserialization/descriptors/DeserializedTypeParameterDescriptor.kt @@ -29,7 +29,7 @@ import org.jetbrains.kotlin.types.KotlinType class DeserializedTypeParameterDescriptor( private val c: DeserializationContext, - private val proto: ProtoBuf.TypeParameter, + val proto: ProtoBuf.TypeParameter, index: Int ) : AbstractLazyTypeParameterDescriptor( c.storageManager, c.containingDeclaration, c.nameResolver.getName(proto.name),