[IR] Fix classes TypeParameter [de]serialization

This commit is contained in:
romanart
2019-03-11 22:37:15 +03:00
committed by Dmitry Petrov
parent 9f48695dde
commit 5b5f3a7468
7 changed files with 96 additions and 5 deletions
@@ -16,6 +16,7 @@ message DescriptorReference {
optional bool is_default_constructor = 9 [default = false]; optional bool is_default_constructor = 9 [default = false];
optional bool is_enum_entry = 10 [default = false]; optional bool is_enum_entry = 10 [default = false];
optional bool is_enum_special = 11 [default = false]; optional bool is_enum_special = 11 [default = false];
optional bool is_type_parameter = 12 [default = false];
} }
message UniqId { message UniqId {
@@ -40,7 +40,7 @@ abstract class DeclarationTable(val builtIns: IrBuiltIns, val descriptorTable: D
val index = if (value.origin == IrDeclarationOrigin.FAKE_OVERRIDE || val index = if (value.origin == IrDeclarationOrigin.FAKE_OVERRIDE ||
!value.isExported() !value.isExported()
|| value is IrVariable || value is IrVariable
|| value is IrTypeParameter || (value is IrTypeParameter && value.parent !is IrClass)
|| value is IrValueParameter || value is IrValueParameter
|| value is IrAnonymousInitializerImpl || value is IrAnonymousInitializerImpl
) { ) {
@@ -84,7 +84,8 @@ abstract class DescriptorReferenceDeserializer(
isDefaultConstructor: Boolean = false, isDefaultConstructor: Boolean = false,
isFakeOverride: Boolean = false, isFakeOverride: Boolean = false,
isGetter: Boolean = false, isGetter: Boolean = false,
isSetter: Boolean = false isSetter: Boolean = false,
isTypeParameter: Boolean = false
): DeclarationDescriptor { ): DeclarationDescriptor {
val packageFqName = packageFqNameString.let { val packageFqName = packageFqNameString.let {
if (it == "<root>") FqName.ROOT else FqName(it) if (it == "<root>") FqName.ROOT else FqName(it)
@@ -131,6 +132,10 @@ abstract class DescriptorReferenceDeserializer(
.getContributedFunctions(Name.identifier(name), NoLookupLocation.FROM_BACKEND).single() .getContributedFunctions(Name.identifier(name), NoLookupLocation.FROM_BACKEND).single()
} }
if (isTypeParameter) {
return clazz!!.declaredTypeParameters.first { it.name.asString() == name }
}
if (protoIndex?.let { checkIfSpecialDescriptorId(it) } == true) { if (protoIndex?.let { checkIfSpecialDescriptorId(it) } == true) {
return resolveSpecialDescriptor(packageFqName.child(Name.identifier(name))) return resolveSpecialDescriptor(packageFqName.child(Name.identifier(name)))
} }
@@ -177,7 +177,8 @@ abstract class KotlinIrLinker(
isDefaultConstructor = proto.isDefaultConstructor, isDefaultConstructor = proto.isDefaultConstructor,
isFakeOverride = proto.isFakeOverride, isFakeOverride = proto.isFakeOverride,
isGetter = proto.isGetter, isGetter = proto.isGetter,
isSetter = proto.isSetter isSetter = proto.isSetter,
isTypeParameter = proto.isTypeParameter
) )
private val ByteArray.codedInputStream: org.jetbrains.kotlin.protobuf.CodedInputStream private val ByteArray.codedInputStream: org.jetbrains.kotlin.protobuf.CodedInputStream
@@ -29,7 +29,10 @@ open class DescriptorReferenceSerializer(
} }
if (declaration is IrAnonymousInitializer) return null 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!! val containingDeclaration = descriptor.containingDeclaration!!
@@ -49,6 +52,7 @@ open class DescriptorReferenceSerializer(
descriptor is ClassConstructorDescriptor && containingDeclaration is ClassDescriptor && containingDeclaration.kind == ClassKind.OBJECT descriptor is ClassConstructorDescriptor && containingDeclaration is ClassDescriptor && containingDeclaration.kind == ClassKind.OBJECT
val isEnumEntry = descriptor is ClassDescriptor && descriptor.kind == ClassKind.ENUM_ENTRY val isEnumEntry = descriptor is ClassDescriptor && descriptor.kind == ClassKind.ENUM_ENTRY
val isEnumSpecial = declaration.origin == IrDeclarationOrigin.ENUM_CLASS_SPECIAL_MEMBER val isEnumSpecial = declaration.origin == IrDeclarationOrigin.ENUM_CLASS_SPECIAL_MEMBER
val isTypeParameter = declaration is IrTypeParameter && declaration.parent is IrClass
val realDeclaration = if (isFakeOverride) { val realDeclaration = if (isFakeOverride) {
@@ -103,6 +107,8 @@ open class DescriptorReferenceSerializer(
proto.setIsEnumEntry(true) proto.setIsEnumEntry(true)
} else if (isEnumSpecial) { } else if (isEnumSpecial) {
proto.setIsEnumSpecial(true) proto.setIsEnumSpecial(true)
} else if (isTypeParameter) {
proto.setIsTypeParameter(true)
} }
return proto.build() return proto.build()
@@ -976,6 +976,15 @@ public final class IrKlibProtoBuf {
* <code>optional bool is_enum_special = 11 [default = false];</code> * <code>optional bool is_enum_special = 11 [default = false];</code>
*/ */
boolean getIsEnumSpecial(); boolean getIsEnumSpecial();
/**
* <code>optional bool is_type_parameter = 12 [default = false];</code>
*/
boolean hasIsTypeParameter();
/**
* <code>optional bool is_type_parameter = 12 [default = false];</code>
*/
boolean getIsTypeParameter();
} }
/** /**
* Protobuf type {@code org.jetbrains.kotlin.ir.backend.js.lower.serialization.ir.DescriptorReference} * Protobuf type {@code org.jetbrains.kotlin.ir.backend.js.lower.serialization.ir.DescriptorReference}
@@ -1114,6 +1123,11 @@ public final class IrKlibProtoBuf {
isEnumSpecial_ = input.readBool(); isEnumSpecial_ = input.readBool();
break; break;
} }
case 96: {
bitField0_ |= 0x00000800;
isTypeParameter_ = input.readBool();
break;
}
} }
} }
} catch (org.jetbrains.kotlin.protobuf.InvalidProtocolBufferException e) { } catch (org.jetbrains.kotlin.protobuf.InvalidProtocolBufferException e) {
@@ -1313,6 +1327,21 @@ public final class IrKlibProtoBuf {
return isEnumSpecial_; return isEnumSpecial_;
} }
public static final int IS_TYPE_PARAMETER_FIELD_NUMBER = 12;
private boolean isTypeParameter_;
/**
* <code>optional bool is_type_parameter = 12 [default = false];</code>
*/
public boolean hasIsTypeParameter() {
return ((bitField0_ & 0x00000800) == 0x00000800);
}
/**
* <code>optional bool is_type_parameter = 12 [default = false];</code>
*/
public boolean getIsTypeParameter() {
return isTypeParameter_;
}
private void initFields() { private void initFields() {
packageFqName_ = org.jetbrains.kotlin.ir.backend.js.lower.serialization.ir.IrKlibProtoBuf.String.getDefaultInstance(); 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(); classFqName_ = org.jetbrains.kotlin.ir.backend.js.lower.serialization.ir.IrKlibProtoBuf.String.getDefaultInstance();
@@ -1325,6 +1354,7 @@ public final class IrKlibProtoBuf {
isDefaultConstructor_ = false; isDefaultConstructor_ = false;
isEnumEntry_ = false; isEnumEntry_ = false;
isEnumSpecial_ = false; isEnumSpecial_ = false;
isTypeParameter_ = false;
} }
private byte memoizedIsInitialized = -1; private byte memoizedIsInitialized = -1;
public final boolean isInitialized() { public final boolean isInitialized() {
@@ -1402,6 +1432,9 @@ public final class IrKlibProtoBuf {
if (((bitField0_ & 0x00000400) == 0x00000400)) { if (((bitField0_ & 0x00000400) == 0x00000400)) {
output.writeBool(11, isEnumSpecial_); output.writeBool(11, isEnumSpecial_);
} }
if (((bitField0_ & 0x00000800) == 0x00000800)) {
output.writeBool(12, isTypeParameter_);
}
output.writeRawBytes(unknownFields); output.writeRawBytes(unknownFields);
} }
@@ -1455,6 +1488,10 @@ public final class IrKlibProtoBuf {
size += org.jetbrains.kotlin.protobuf.CodedOutputStream size += org.jetbrains.kotlin.protobuf.CodedOutputStream
.computeBoolSize(11, isEnumSpecial_); .computeBoolSize(11, isEnumSpecial_);
} }
if (((bitField0_ & 0x00000800) == 0x00000800)) {
size += org.jetbrains.kotlin.protobuf.CodedOutputStream
.computeBoolSize(12, isTypeParameter_);
}
size += unknownFields.size(); size += unknownFields.size();
memoizedSerializedSize = size; memoizedSerializedSize = size;
return size; return size;
@@ -1571,6 +1608,8 @@ public final class IrKlibProtoBuf {
bitField0_ = (bitField0_ & ~0x00000200); bitField0_ = (bitField0_ & ~0x00000200);
isEnumSpecial_ = false; isEnumSpecial_ = false;
bitField0_ = (bitField0_ & ~0x00000400); bitField0_ = (bitField0_ & ~0x00000400);
isTypeParameter_ = false;
bitField0_ = (bitField0_ & ~0x00000800);
return this; return this;
} }
@@ -1638,6 +1677,10 @@ public final class IrKlibProtoBuf {
to_bitField0_ |= 0x00000400; to_bitField0_ |= 0x00000400;
} }
result.isEnumSpecial_ = isEnumSpecial_; result.isEnumSpecial_ = isEnumSpecial_;
if (((from_bitField0_ & 0x00000800) == 0x00000800)) {
to_bitField0_ |= 0x00000800;
}
result.isTypeParameter_ = isTypeParameter_;
result.bitField0_ = to_bitField0_; result.bitField0_ = to_bitField0_;
return result; return result;
} }
@@ -1677,6 +1720,9 @@ public final class IrKlibProtoBuf {
if (other.hasIsEnumSpecial()) { if (other.hasIsEnumSpecial()) {
setIsEnumSpecial(other.getIsEnumSpecial()); setIsEnumSpecial(other.getIsEnumSpecial());
} }
if (other.hasIsTypeParameter()) {
setIsTypeParameter(other.getIsTypeParameter());
}
setUnknownFields( setUnknownFields(
getUnknownFields().concat(other.unknownFields)); getUnknownFields().concat(other.unknownFields));
return this; return this;
@@ -2199,6 +2245,38 @@ public final class IrKlibProtoBuf {
return this; return this;
} }
private boolean isTypeParameter_ ;
/**
* <code>optional bool is_type_parameter = 12 [default = false];</code>
*/
public boolean hasIsTypeParameter() {
return ((bitField0_ & 0x00000800) == 0x00000800);
}
/**
* <code>optional bool is_type_parameter = 12 [default = false];</code>
*/
public boolean getIsTypeParameter() {
return isTypeParameter_;
}
/**
* <code>optional bool is_type_parameter = 12 [default = false];</code>
*/
public Builder setIsTypeParameter(boolean value) {
bitField0_ |= 0x00000800;
isTypeParameter_ = value;
return this;
}
/**
* <code>optional bool is_type_parameter = 12 [default = false];</code>
*/
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) // @@protoc_insertion_point(builder_scope:org.jetbrains.kotlin.ir.backend.js.lower.serialization.ir.DescriptorReference)
} }
@@ -29,7 +29,7 @@ import org.jetbrains.kotlin.types.KotlinType
class DeserializedTypeParameterDescriptor( class DeserializedTypeParameterDescriptor(
private val c: DeserializationContext, private val c: DeserializationContext,
private val proto: ProtoBuf.TypeParameter, val proto: ProtoBuf.TypeParameter,
index: Int index: Int
) : AbstractLazyTypeParameterDescriptor( ) : AbstractLazyTypeParameterDescriptor(
c.storageManager, c.containingDeclaration, c.nameResolver.getName(proto.name), c.storageManager, c.containingDeclaration, c.nameResolver.getName(proto.name),