From 7107ee2eeb454a4cc64558d1db752f6951961954 Mon Sep 17 00:00:00 2001 From: Alexander Udalov Date: Fri, 30 Dec 2016 18:33:36 +0300 Subject: [PATCH] Write/load subclasses of sealed classes in metadata Note that now DeserializedClassDescriptor.getSealedSubclasses works a lot faster than before, for all newly compiled sealed classes except empty ones. It may be optimized further if we look at the metadata version of the file the class was loaded from, however it's not easy currently because DeserializedClassDescriptor is declared in common (non-JVM) code and has no direct access to the binary version information. This will also allow to add a reflection API to get subclasses of a sealed class #KT-12795 Fixed --- .../incremental/ProtoCompareGenerated.kt | 19 + .../incremental/protoDifferenceUtils.kt | 3 + .../kotlin/serialization/DebugProtoBuf.java | 375 +++++++++++++----- .../serialization/DescriptorSerializer.kt | 5 + .../compileKotlinAgainstKotlin/sealedClass.kt | 38 ++ ...mpileKotlinAgainstKotlinTestGenerated.java | 6 + core/deserialization/src/descriptors.proto | 2 + .../kotlin/serialization/ProtoBuf.java | 207 +++++++++- .../DeserializedClassDescriptor.kt | 11 +- 9 files changed, 540 insertions(+), 126 deletions(-) create mode 100644 compiler/testData/compileKotlinAgainstKotlin/sealedClass.kt diff --git a/build-common/src/org/jetbrains/kotlin/incremental/ProtoCompareGenerated.kt b/build-common/src/org/jetbrains/kotlin/incremental/ProtoCompareGenerated.kt index adb3f01e1e2..cbe69082571 100644 --- a/build-common/src/org/jetbrains/kotlin/incremental/ProtoCompareGenerated.kt +++ b/build-common/src/org/jetbrains/kotlin/incremental/ProtoCompareGenerated.kt @@ -125,6 +125,8 @@ open class ProtoCompareGenerated(val oldNameResolver: NameResolver, val newNameR if (!checkEqualsClassEnumEntry(old, new)) return false + if (!checkEqualsClassSealedSubclassFqName(old, new)) return false + if (old.hasTypeTable() != new.hasTypeTable()) return false if (old.hasTypeTable()) { if (!checkEquals(old.typeTable, new.typeTable)) return false @@ -160,6 +162,7 @@ open class ProtoCompareGenerated(val oldNameResolver: NameResolver, val newNameR PROPERTY_LIST, TYPE_ALIAS_LIST, ENUM_ENTRY_LIST, + SEALED_SUBCLASS_FQ_NAME_LIST, TYPE_TABLE, SINCE_KOTLIN_INFO, SINCE_KOTLIN_INFO_TABLE, @@ -199,6 +202,8 @@ open class ProtoCompareGenerated(val oldNameResolver: NameResolver, val newNameR if (!checkEqualsClassEnumEntry(old, new)) result.add(ProtoBufClassKind.ENUM_ENTRY_LIST) + if (!checkEqualsClassSealedSubclassFqName(old, new)) result.add(ProtoBufClassKind.SEALED_SUBCLASS_FQ_NAME_LIST) + if (old.hasTypeTable() != new.hasTypeTable()) result.add(ProtoBufClassKind.TYPE_TABLE) if (old.hasTypeTable()) { if (!checkEquals(old.typeTable, new.typeTable)) result.add(ProtoBufClassKind.TYPE_TABLE) @@ -850,6 +855,16 @@ open class ProtoCompareGenerated(val oldNameResolver: NameResolver, val newNameR return true } + open fun checkEqualsClassSealedSubclassFqName(old: ProtoBuf.Class, new: ProtoBuf.Class): Boolean { + if (old.sealedSubclassFqNameCount != new.sealedSubclassFqNameCount) return false + + for(i in 0..old.sealedSubclassFqNameCount - 1) { + if (!checkClassIdEquals(old.getSealedSubclassFqName(i), new.getSealedSubclassFqName(i))) return false + } + + return true + } + open fun checkEqualsFunctionTypeParameter(old: ProtoBuf.Function, new: ProtoBuf.Function): Boolean { if (old.typeParameterCount != new.typeParameterCount) return false @@ -1090,6 +1105,10 @@ fun ProtoBuf.Class.hashCode(stringIndexes: (Int) -> Int, fqNameIndexes: (Int) -> hashCode = 31 * hashCode + getEnumEntry(i).hashCode(stringIndexes, fqNameIndexes) } + for(i in 0..sealedSubclassFqNameCount - 1) { + hashCode = 31 * hashCode + fqNameIndexes(getSealedSubclassFqName(i)) + } + if (hasTypeTable()) { hashCode = 31 * hashCode + typeTable.hashCode(stringIndexes, fqNameIndexes) } diff --git a/build-common/src/org/jetbrains/kotlin/incremental/protoDifferenceUtils.kt b/build-common/src/org/jetbrains/kotlin/incremental/protoDifferenceUtils.kt index 789c52ee8fe..50fe8daedf2 100644 --- a/build-common/src/org/jetbrains/kotlin/incremental/protoDifferenceUtils.kt +++ b/build-common/src/org/jetbrains/kotlin/incremental/protoDifferenceUtils.kt @@ -217,6 +217,9 @@ private class DifferenceCalculatorForClass(oldData: ProtoMapValue, newData: Prot ProtoBufClassKind.ENUM_ENTRY_LIST -> { isClassAffected = true } + ProtoBufClassKind.SEALED_SUBCLASS_FQ_NAME_LIST -> { + // TODO + } ProtoBufClassKind.TYPE_TABLE -> { // TODO } diff --git a/build-common/test/org/jetbrains/kotlin/serialization/DebugProtoBuf.java b/build-common/test/org/jetbrains/kotlin/serialization/DebugProtoBuf.java index af748604dc1..d7c5408770c 100644 --- a/build-common/test/org/jetbrains/kotlin/serialization/DebugProtoBuf.java +++ b/build-common/test/org/jetbrains/kotlin/serialization/DebugProtoBuf.java @@ -9972,6 +9972,19 @@ public final class DebugProtoBuf { org.jetbrains.kotlin.serialization.DebugProtoBuf.EnumEntryOrBuilder getEnumEntryOrBuilder( int index); + /** + * repeated int32 sealed_subclass_fq_name = 16 [packed = true]; + */ + java.util.List getSealedSubclassFqNameList(); + /** + * repeated int32 sealed_subclass_fq_name = 16 [packed = true]; + */ + int getSealedSubclassFqNameCount(); + /** + * repeated int32 sealed_subclass_fq_name = 16 [packed = true]; + */ + int getSealedSubclassFqName(int index); + /** * optional .org.jetbrains.kotlin.serialization.TypeTable type_table = 30; */ @@ -10181,6 +10194,27 @@ public final class DebugProtoBuf { enumEntry_.add(input.readMessage(org.jetbrains.kotlin.serialization.DebugProtoBuf.EnumEntry.PARSER, extensionRegistry)); break; } + case 128: { + if (!((mutable_bitField0_ & 0x00001000) == 0x00001000)) { + sealedSubclassFqName_ = new java.util.ArrayList(); + mutable_bitField0_ |= 0x00001000; + } + sealedSubclassFqName_.add(input.readInt32()); + break; + } + case 130: { + int length = input.readRawVarint32(); + int limit = input.pushLimit(length); + if (!((mutable_bitField0_ & 0x00001000) == 0x00001000) && input.getBytesUntilLimit() > 0) { + sealedSubclassFqName_ = new java.util.ArrayList(); + mutable_bitField0_ |= 0x00001000; + } + while (input.getBytesUntilLimit() > 0) { + sealedSubclassFqName_.add(input.readInt32()); + } + input.popLimit(limit); + break; + } case 242: { org.jetbrains.kotlin.serialization.DebugProtoBuf.TypeTable.Builder subBuilder = null; if (((bitField0_ & 0x00000008) == 0x00000008)) { @@ -10247,6 +10281,9 @@ public final class DebugProtoBuf { if (((mutable_bitField0_ & 0x00000800) == 0x00000800)) { enumEntry_ = java.util.Collections.unmodifiableList(enumEntry_); } + if (((mutable_bitField0_ & 0x00001000) == 0x00001000)) { + sealedSubclassFqName_ = java.util.Collections.unmodifiableList(sealedSubclassFqName_); + } this.unknownFields = unknownFields.build(); makeExtensionsImmutable(); } @@ -10768,6 +10805,29 @@ public final class DebugProtoBuf { return enumEntry_.get(index); } + public static final int SEALED_SUBCLASS_FQ_NAME_FIELD_NUMBER = 16; + private java.util.List sealedSubclassFqName_; + /** + * repeated int32 sealed_subclass_fq_name = 16 [packed = true]; + */ + public java.util.List + getSealedSubclassFqNameList() { + return sealedSubclassFqName_; + } + /** + * repeated int32 sealed_subclass_fq_name = 16 [packed = true]; + */ + public int getSealedSubclassFqNameCount() { + return sealedSubclassFqName_.size(); + } + /** + * repeated int32 sealed_subclass_fq_name = 16 [packed = true]; + */ + public int getSealedSubclassFqName(int index) { + return sealedSubclassFqName_.get(index); + } + private int sealedSubclassFqNameMemoizedSerializedSize = -1; + public static final int TYPE_TABLE_FIELD_NUMBER = 30; private org.jetbrains.kotlin.serialization.DebugProtoBuf.TypeTable typeTable_; /** @@ -10846,6 +10906,7 @@ public final class DebugProtoBuf { property_ = java.util.Collections.emptyList(); typeAlias_ = java.util.Collections.emptyList(); enumEntry_ = java.util.Collections.emptyList(); + sealedSubclassFqName_ = java.util.Collections.emptyList(); typeTable_ = org.jetbrains.kotlin.serialization.DebugProtoBuf.TypeTable.getDefaultInstance(); sinceKotlinInfo_ = 0; sinceKotlinInfoTable_ = org.jetbrains.kotlin.serialization.DebugProtoBuf.SinceKotlinInfoTable.getDefaultInstance(); @@ -10966,6 +11027,13 @@ public final class DebugProtoBuf { for (int i = 0; i < enumEntry_.size(); i++) { output.writeMessage(13, enumEntry_.get(i)); } + if (getSealedSubclassFqNameList().size() > 0) { + output.writeRawVarint32(130); + output.writeRawVarint32(sealedSubclassFqNameMemoizedSerializedSize); + } + for (int i = 0; i < sealedSubclassFqName_.size(); i++) { + output.writeInt32NoTag(sealedSubclassFqName_.get(i)); + } if (((bitField0_ & 0x00000008) == 0x00000008)) { output.writeMessage(30, typeTable_); } @@ -11053,6 +11121,20 @@ public final class DebugProtoBuf { size += org.jetbrains.kotlin.protobuf.CodedOutputStream .computeMessageSize(13, enumEntry_.get(i)); } + { + int dataSize = 0; + for (int i = 0; i < sealedSubclassFqName_.size(); i++) { + dataSize += org.jetbrains.kotlin.protobuf.CodedOutputStream + .computeInt32SizeNoTag(sealedSubclassFqName_.get(i)); + } + size += dataSize; + if (!getSealedSubclassFqNameList().isEmpty()) { + size += 2; + size += org.jetbrains.kotlin.protobuf.CodedOutputStream + .computeInt32SizeNoTag(dataSize); + } + sealedSubclassFqNameMemoizedSerializedSize = dataSize; + } if (((bitField0_ & 0x00000008) == 0x00000008)) { size += org.jetbrains.kotlin.protobuf.CodedOutputStream .computeMessageSize(30, typeTable_); @@ -11245,20 +11327,22 @@ public final class DebugProtoBuf { } else { enumEntryBuilder_.clear(); } + sealedSubclassFqName_ = java.util.Collections.emptyList(); + bitField0_ = (bitField0_ & ~0x00001000); if (typeTableBuilder_ == null) { typeTable_ = org.jetbrains.kotlin.serialization.DebugProtoBuf.TypeTable.getDefaultInstance(); } else { typeTableBuilder_.clear(); } - bitField0_ = (bitField0_ & ~0x00001000); - sinceKotlinInfo_ = 0; bitField0_ = (bitField0_ & ~0x00002000); + sinceKotlinInfo_ = 0; + bitField0_ = (bitField0_ & ~0x00004000); if (sinceKotlinInfoTableBuilder_ == null) { sinceKotlinInfoTable_ = org.jetbrains.kotlin.serialization.DebugProtoBuf.SinceKotlinInfoTable.getDefaultInstance(); } else { sinceKotlinInfoTableBuilder_.clear(); } - bitField0_ = (bitField0_ & ~0x00004000); + bitField0_ = (bitField0_ & ~0x00008000); return this; } @@ -11372,7 +11456,12 @@ public final class DebugProtoBuf { } else { result.enumEntry_ = enumEntryBuilder_.build(); } - if (((from_bitField0_ & 0x00001000) == 0x00001000)) { + if (((bitField0_ & 0x00001000) == 0x00001000)) { + sealedSubclassFqName_ = java.util.Collections.unmodifiableList(sealedSubclassFqName_); + bitField0_ = (bitField0_ & ~0x00001000); + } + result.sealedSubclassFqName_ = sealedSubclassFqName_; + if (((from_bitField0_ & 0x00002000) == 0x00002000)) { to_bitField0_ |= 0x00000008; } if (typeTableBuilder_ == null) { @@ -11380,11 +11469,11 @@ public final class DebugProtoBuf { } else { result.typeTable_ = typeTableBuilder_.build(); } - if (((from_bitField0_ & 0x00002000) == 0x00002000)) { + if (((from_bitField0_ & 0x00004000) == 0x00004000)) { to_bitField0_ |= 0x00000010; } result.sinceKotlinInfo_ = sinceKotlinInfo_; - if (((from_bitField0_ & 0x00004000) == 0x00004000)) { + if (((from_bitField0_ & 0x00008000) == 0x00008000)) { to_bitField0_ |= 0x00000020; } if (sinceKotlinInfoTableBuilder_ == null) { @@ -11619,6 +11708,16 @@ public final class DebugProtoBuf { } } } + if (!other.sealedSubclassFqName_.isEmpty()) { + if (sealedSubclassFqName_.isEmpty()) { + sealedSubclassFqName_ = other.sealedSubclassFqName_; + bitField0_ = (bitField0_ & ~0x00001000); + } else { + ensureSealedSubclassFqNameIsMutable(); + sealedSubclassFqName_.addAll(other.sealedSubclassFqName_); + } + onChanged(); + } if (other.hasTypeTable()) { mergeTypeTable(other.getTypeTable()); } @@ -13656,6 +13755,72 @@ public final class DebugProtoBuf { return enumEntryBuilder_; } + private java.util.List sealedSubclassFqName_ = java.util.Collections.emptyList(); + private void ensureSealedSubclassFqNameIsMutable() { + if (!((bitField0_ & 0x00001000) == 0x00001000)) { + sealedSubclassFqName_ = new java.util.ArrayList(sealedSubclassFqName_); + bitField0_ |= 0x00001000; + } + } + /** + * repeated int32 sealed_subclass_fq_name = 16 [packed = true]; + */ + public java.util.List + getSealedSubclassFqNameList() { + return java.util.Collections.unmodifiableList(sealedSubclassFqName_); + } + /** + * repeated int32 sealed_subclass_fq_name = 16 [packed = true]; + */ + public int getSealedSubclassFqNameCount() { + return sealedSubclassFqName_.size(); + } + /** + * repeated int32 sealed_subclass_fq_name = 16 [packed = true]; + */ + public int getSealedSubclassFqName(int index) { + return sealedSubclassFqName_.get(index); + } + /** + * repeated int32 sealed_subclass_fq_name = 16 [packed = true]; + */ + public Builder setSealedSubclassFqName( + int index, int value) { + ensureSealedSubclassFqNameIsMutable(); + sealedSubclassFqName_.set(index, value); + onChanged(); + return this; + } + /** + * repeated int32 sealed_subclass_fq_name = 16 [packed = true]; + */ + public Builder addSealedSubclassFqName(int value) { + ensureSealedSubclassFqNameIsMutable(); + sealedSubclassFqName_.add(value); + onChanged(); + return this; + } + /** + * repeated int32 sealed_subclass_fq_name = 16 [packed = true]; + */ + public Builder addAllSealedSubclassFqName( + java.lang.Iterable values) { + ensureSealedSubclassFqNameIsMutable(); + org.jetbrains.kotlin.protobuf.AbstractMessageLite.Builder.addAll( + values, sealedSubclassFqName_); + onChanged(); + return this; + } + /** + * repeated int32 sealed_subclass_fq_name = 16 [packed = true]; + */ + public Builder clearSealedSubclassFqName() { + sealedSubclassFqName_ = java.util.Collections.emptyList(); + bitField0_ = (bitField0_ & ~0x00001000); + onChanged(); + return this; + } + private org.jetbrains.kotlin.serialization.DebugProtoBuf.TypeTable typeTable_ = org.jetbrains.kotlin.serialization.DebugProtoBuf.TypeTable.getDefaultInstance(); private org.jetbrains.kotlin.protobuf.SingleFieldBuilder< org.jetbrains.kotlin.serialization.DebugProtoBuf.TypeTable, org.jetbrains.kotlin.serialization.DebugProtoBuf.TypeTable.Builder, org.jetbrains.kotlin.serialization.DebugProtoBuf.TypeTableOrBuilder> typeTableBuilder_; @@ -13663,7 +13828,7 @@ public final class DebugProtoBuf { * optional .org.jetbrains.kotlin.serialization.TypeTable type_table = 30; */ public boolean hasTypeTable() { - return ((bitField0_ & 0x00001000) == 0x00001000); + return ((bitField0_ & 0x00002000) == 0x00002000); } /** * optional .org.jetbrains.kotlin.serialization.TypeTable type_table = 30; @@ -13688,7 +13853,7 @@ public final class DebugProtoBuf { } else { typeTableBuilder_.setMessage(value); } - bitField0_ |= 0x00001000; + bitField0_ |= 0x00002000; return this; } /** @@ -13702,7 +13867,7 @@ public final class DebugProtoBuf { } else { typeTableBuilder_.setMessage(builderForValue.build()); } - bitField0_ |= 0x00001000; + bitField0_ |= 0x00002000; return this; } /** @@ -13710,7 +13875,7 @@ public final class DebugProtoBuf { */ public Builder mergeTypeTable(org.jetbrains.kotlin.serialization.DebugProtoBuf.TypeTable value) { if (typeTableBuilder_ == null) { - if (((bitField0_ & 0x00001000) == 0x00001000) && + if (((bitField0_ & 0x00002000) == 0x00002000) && typeTable_ != org.jetbrains.kotlin.serialization.DebugProtoBuf.TypeTable.getDefaultInstance()) { typeTable_ = org.jetbrains.kotlin.serialization.DebugProtoBuf.TypeTable.newBuilder(typeTable_).mergeFrom(value).buildPartial(); @@ -13721,7 +13886,7 @@ public final class DebugProtoBuf { } else { typeTableBuilder_.mergeFrom(value); } - bitField0_ |= 0x00001000; + bitField0_ |= 0x00002000; return this; } /** @@ -13734,14 +13899,14 @@ public final class DebugProtoBuf { } else { typeTableBuilder_.clear(); } - bitField0_ = (bitField0_ & ~0x00001000); + bitField0_ = (bitField0_ & ~0x00002000); return this; } /** * optional .org.jetbrains.kotlin.serialization.TypeTable type_table = 30; */ public org.jetbrains.kotlin.serialization.DebugProtoBuf.TypeTable.Builder getTypeTableBuilder() { - bitField0_ |= 0x00001000; + bitField0_ |= 0x00002000; onChanged(); return getTypeTableFieldBuilder().getBuilder(); } @@ -13781,7 +13946,7 @@ public final class DebugProtoBuf { * */ public boolean hasSinceKotlinInfo() { - return ((bitField0_ & 0x00002000) == 0x00002000); + return ((bitField0_ & 0x00004000) == 0x00004000); } /** * optional int32 sinceKotlinInfo = 31; @@ -13801,7 +13966,7 @@ public final class DebugProtoBuf { * */ public Builder setSinceKotlinInfo(int value) { - bitField0_ |= 0x00002000; + bitField0_ |= 0x00004000; sinceKotlinInfo_ = value; onChanged(); return this; @@ -13814,7 +13979,7 @@ public final class DebugProtoBuf { * */ public Builder clearSinceKotlinInfo() { - bitField0_ = (bitField0_ & ~0x00002000); + bitField0_ = (bitField0_ & ~0x00004000); sinceKotlinInfo_ = 0; onChanged(); return this; @@ -13827,7 +13992,7 @@ public final class DebugProtoBuf { * optional .org.jetbrains.kotlin.serialization.SinceKotlinInfoTable since_kotlin_info_table = 32; */ public boolean hasSinceKotlinInfoTable() { - return ((bitField0_ & 0x00004000) == 0x00004000); + return ((bitField0_ & 0x00008000) == 0x00008000); } /** * optional .org.jetbrains.kotlin.serialization.SinceKotlinInfoTable since_kotlin_info_table = 32; @@ -13852,7 +14017,7 @@ public final class DebugProtoBuf { } else { sinceKotlinInfoTableBuilder_.setMessage(value); } - bitField0_ |= 0x00004000; + bitField0_ |= 0x00008000; return this; } /** @@ -13866,7 +14031,7 @@ public final class DebugProtoBuf { } else { sinceKotlinInfoTableBuilder_.setMessage(builderForValue.build()); } - bitField0_ |= 0x00004000; + bitField0_ |= 0x00008000; return this; } /** @@ -13874,7 +14039,7 @@ public final class DebugProtoBuf { */ public Builder mergeSinceKotlinInfoTable(org.jetbrains.kotlin.serialization.DebugProtoBuf.SinceKotlinInfoTable value) { if (sinceKotlinInfoTableBuilder_ == null) { - if (((bitField0_ & 0x00004000) == 0x00004000) && + if (((bitField0_ & 0x00008000) == 0x00008000) && sinceKotlinInfoTable_ != org.jetbrains.kotlin.serialization.DebugProtoBuf.SinceKotlinInfoTable.getDefaultInstance()) { sinceKotlinInfoTable_ = org.jetbrains.kotlin.serialization.DebugProtoBuf.SinceKotlinInfoTable.newBuilder(sinceKotlinInfoTable_).mergeFrom(value).buildPartial(); @@ -13885,7 +14050,7 @@ public final class DebugProtoBuf { } else { sinceKotlinInfoTableBuilder_.mergeFrom(value); } - bitField0_ |= 0x00004000; + bitField0_ |= 0x00008000; return this; } /** @@ -13898,14 +14063,14 @@ public final class DebugProtoBuf { } else { sinceKotlinInfoTableBuilder_.clear(); } - bitField0_ = (bitField0_ & ~0x00004000); + bitField0_ = (bitField0_ & ~0x00008000); return this; } /** * optional .org.jetbrains.kotlin.serialization.SinceKotlinInfoTable since_kotlin_info_table = 32; */ public org.jetbrains.kotlin.serialization.DebugProtoBuf.SinceKotlinInfoTable.Builder getSinceKotlinInfoTableBuilder() { - bitField0_ |= 0x00004000; + bitField0_ |= 0x00008000; onChanged(); return getSinceKotlinInfoTableFieldBuilder().getBuilder(); } @@ -27296,7 +27461,7 @@ public final class DebugProtoBuf { "ter.Variance:\003INV\022=\n\013upper_bound\030\005 \003(\0132(" + ".org.jetbrains.kotlin.serialization.Type" + "\022\026\n\016upper_bound_id\030\006 \003(\005\"$\n\010Variance\022\006\n\002" + - "IN\020\000\022\007\n\003OUT\020\001\022\007\n\003INV\020\002*\005\010d\020\350\007\"\236\007\n\005Class\022" + + "IN\020\000\022\007\n\003OUT\020\001\022\007\n\003INV\020\002*\005\010d\020\350\007\"\307\007\n\005Class\022" + "\020\n\005flags\030\001 \001(\005:\0016\022\025\n\007fq_name\030\003 \002(\005B\004\220\265\030\001", "\022#\n\025companion_object_name\030\004 \001(\005B\004\210\265\030\001\022I\n" + "\016type_parameter\030\005 \003(\01321.org.jetbrains.ko" + @@ -27312,86 +27477,87 @@ public final class DebugProtoBuf { "_alias\030\013 \003(\0132-.org.jetbrains.kotlin.seri" + "alization.TypeAlias\022A\n\nenum_entry\030\r \003(\0132" + "-.org.jetbrains.kotlin.serialization.Enu" + - "mEntry\022A\n\ntype_table\030\036 \001(\0132-.org.jetbrai" + - "ns.kotlin.serialization.TypeTable\022\027\n\017sin" + - "ceKotlinInfo\030\037 \001(\005\022Y\n\027since_kotlin_info_" + - "table\030 \001(\01328.org.jetbrains.kotlin.seria" + - "lization.SinceKotlinInfoTable\"x\n\004Kind\022\t\n" + - "\005CLASS\020\000\022\r\n\tINTERFACE\020\001\022\016\n\nENUM_CLASS\020\002\022", - "\016\n\nENUM_ENTRY\020\003\022\024\n\020ANNOTATION_CLASS\020\004\022\n\n" + - "\006OBJECT\020\005\022\024\n\020COMPANION_OBJECT\020\006*\005\010d\020\310\001\"\361" + - "\002\n\007Package\022>\n\010function\030\003 \003(\0132,.org.jetbr" + - "ains.kotlin.serialization.Function\022>\n\010pr" + - "operty\030\004 \003(\0132,.org.jetbrains.kotlin.seri" + - "alization.Property\022A\n\ntype_alias\030\005 \003(\0132-" + + "mEntry\022\'\n\027sealed_subclass_fq_name\030\020 \003(\005B" + + "\006\020\001\220\265\030\001\022A\n\ntype_table\030\036 \001(\0132-.org.jetbra" + + "ins.kotlin.serialization.TypeTable\022\027\n\017si" + + "nceKotlinInfo\030\037 \001(\005\022Y\n\027since_kotlin_info" + + "_table\030 \001(\01328.org.jetbrains.kotlin.seri" + + "alization.SinceKotlinInfoTable\"x\n\004Kind\022\t", + "\n\005CLASS\020\000\022\r\n\tINTERFACE\020\001\022\016\n\nENUM_CLASS\020\002" + + "\022\016\n\nENUM_ENTRY\020\003\022\024\n\020ANNOTATION_CLASS\020\004\022\n" + + "\n\006OBJECT\020\005\022\024\n\020COMPANION_OBJECT\020\006*\005\010d\020\310\001\"" + + "\361\002\n\007Package\022>\n\010function\030\003 \003(\0132,.org.jetb" + + "rains.kotlin.serialization.Function\022>\n\010p" + + "roperty\030\004 \003(\0132,.org.jetbrains.kotlin.ser" + + "ialization.Property\022A\n\ntype_alias\030\005 \003(\0132" + + "-.org.jetbrains.kotlin.serialization.Typ" + + "eAlias\022A\n\ntype_table\030\036 \001(\0132-.org.jetbrai" + + "ns.kotlin.serialization.TypeTable\022Y\n\027sin", + "ce_kotlin_info_table\030 \001(\01328.org.jetbrai" + + "ns.kotlin.serialization.SinceKotlinInfoT" + + "able*\005\010d\020\310\001\"_\n\tTypeTable\0226\n\004type\030\001 \003(\0132(" + ".org.jetbrains.kotlin.serialization.Type" + - "Alias\022A\n\ntype_table\030\036 \001(\0132-.org.jetbrain" + - "s.kotlin.serialization.TypeTable\022Y\n\027sinc" + - "e_kotlin_info_table\030 \001(\01328.org.jetbrain", - "s.kotlin.serialization.SinceKotlinInfoTa" + - "ble*\005\010d\020\310\001\"_\n\tTypeTable\0226\n\004type\030\001 \003(\0132(." + - "org.jetbrains.kotlin.serialization.Type\022" + - "\032\n\016first_nullable\030\002 \001(\005:\002-1\"\214\001\n\013Construc" + - "tor\022\020\n\005flags\030\001 \001(\005:\0016\022K\n\017value_parameter" + - "\030\002 \003(\01322.org.jetbrains.kotlin.serializat" + - "ion.ValueParameter\022\027\n\017sinceKotlinInfo\030\037 " + - "\001(\005*\005\010d\020\310\001\"\363\003\n\010Function\022\020\n\005flags\030\t \001(\005:\001" + - "6\022\024\n\told_flags\030\001 \001(\005:\0016\022\022\n\004name\030\002 \002(\005B\004\210" + - "\265\030\001\022=\n\013return_type\030\003 \001(\0132(.org.jetbrains", - ".kotlin.serialization.Type\022\026\n\016return_typ" + - "e_id\030\007 \001(\005\022I\n\016type_parameter\030\004 \003(\01321.org" + - ".jetbrains.kotlin.serialization.TypePara" + - "meter\022?\n\rreceiver_type\030\005 \001(\0132(.org.jetbr" + - "ains.kotlin.serialization.Type\022\030\n\020receiv" + - "er_type_id\030\010 \001(\005\022K\n\017value_parameter\030\006 \003(" + - "\01322.org.jetbrains.kotlin.serialization.V" + - "alueParameter\022A\n\ntype_table\030\036 \001(\0132-.org." + - "jetbrains.kotlin.serialization.TypeTable" + - "\022\027\n\017sinceKotlinInfo\030\037 \001(\005*\005\010d\020\310\001\"\350\003\n\010Pro", - "perty\022\022\n\005flags\030\013 \001(\005:\003518\022\027\n\told_flags\030\001" + - " \001(\005:\0042054\022\022\n\004name\030\002 \002(\005B\004\210\265\030\001\022=\n\013return" + - "_type\030\003 \001(\0132(.org.jetbrains.kotlin.seria" + - "lization.Type\022\026\n\016return_type_id\030\t \001(\005\022I\n" + - "\016type_parameter\030\004 \003(\01321.org.jetbrains.ko" + - "tlin.serialization.TypeParameter\022?\n\rrece" + - "iver_type\030\005 \001(\0132(.org.jetbrains.kotlin.s" + - "erialization.Type\022\030\n\020receiver_type_id\030\n " + - "\001(\005\022R\n\026setter_value_parameter\030\006 \001(\01322.or" + - "g.jetbrains.kotlin.serialization.ValuePa", - "rameter\022\024\n\014getter_flags\030\007 \001(\005\022\024\n\014setter_" + - "flags\030\010 \001(\005\022\027\n\017sinceKotlinInfo\030\037 \001(\005*\005\010d" + - "\020\310\001\"\355\001\n\016ValueParameter\022\020\n\005flags\030\001 \001(\005:\0010" + - "\022\022\n\004name\030\002 \002(\005B\004\210\265\030\001\0226\n\004type\030\003 \001(\0132(.org" + - ".jetbrains.kotlin.serialization.Type\022\017\n\007" + - "type_id\030\005 \001(\005\022E\n\023vararg_element_type\030\004 \001" + - "(\0132(.org.jetbrains.kotlin.serialization." + - "Type\022\036\n\026vararg_element_type_id\030\006 \001(\005*\005\010d" + - "\020\310\001\"\232\003\n\tTypeAlias\022\020\n\005flags\030\001 \001(\005:\0016\022\022\n\004n" + - "ame\030\002 \002(\005B\004\210\265\030\001\022I\n\016type_parameter\030\003 \003(\0132", - "1.org.jetbrains.kotlin.serialization.Typ" + - "eParameter\022A\n\017underlying_type\030\004 \001(\0132(.or" + - "g.jetbrains.kotlin.serialization.Type\022\032\n" + - "\022underlying_type_id\030\005 \001(\005\022?\n\rexpanded_ty" + - "pe\030\006 \001(\0132(.org.jetbrains.kotlin.serializ" + - "ation.Type\022\030\n\020expanded_type_id\030\007 \001(\005\022B\n\n" + - "annotation\030\010 \003(\0132..org.jetbrains.kotlin." + - "serialization.Annotation\022\027\n\017sinceKotlinI" + - "nfo\030\037 \001(\005*\005\010d\020\310\001\"&\n\tEnumEntry\022\022\n\004name\030\001 " + - "\001(\005B\004\210\265\030\001*\005\010d\020\310\001\"\341\001\n\017SinceKotlinInfo\022\017\n\007", - "version\030\001 \001(\005\022\024\n\014version_full\030\002 \001(\005\022O\n\005l" + - "evel\030\003 \001(\01629.org.jetbrains.kotlin.serial" + - "ization.SinceKotlinInfo.Level:\005ERROR\022\022\n\n" + - "error_code\030\004 \001(\005\022\025\n\007message\030\005 \001(\005B\004\230\265\030\001\"" + - "+\n\005Level\022\013\n\007WARNING\020\000\022\t\n\005ERROR\020\001\022\n\n\006HIDD" + - "EN\020\002\"Y\n\024SinceKotlinInfoTable\022A\n\004info\030\001 \003" + - "(\01323.org.jetbrains.kotlin.serialization." + - "SinceKotlinInfo*9\n\010Modality\022\t\n\005FINAL\020\000\022\010" + - "\n\004OPEN\020\001\022\014\n\010ABSTRACT\020\002\022\n\n\006SEALED\020\003*b\n\nVi" + - "sibility\022\014\n\010INTERNAL\020\000\022\013\n\007PRIVATE\020\001\022\r\n\tP", - "ROTECTED\020\002\022\n\n\006PUBLIC\020\003\022\023\n\017PRIVATE_TO_THI" + - "S\020\004\022\t\n\005LOCAL\020\005*Q\n\nMemberKind\022\017\n\013DECLARAT" + - "ION\020\000\022\021\n\rFAKE_OVERRIDE\020\001\022\016\n\nDELEGATION\020\002" + - "\022\017\n\013SYNTHESIZED\020\003B\017B\rDebugProtoBuf" + "\022\032\n\016first_nullable\030\002 \001(\005:\002-1\"\214\001\n\013Constru" + + "ctor\022\020\n\005flags\030\001 \001(\005:\0016\022K\n\017value_paramete" + + "r\030\002 \003(\01322.org.jetbrains.kotlin.serializa" + + "tion.ValueParameter\022\027\n\017sinceKotlinInfo\030\037" + + " \001(\005*\005\010d\020\310\001\"\363\003\n\010Function\022\020\n\005flags\030\t \001(\005:" + + "\0016\022\024\n\told_flags\030\001 \001(\005:\0016\022\022\n\004name\030\002 \002(\005B\004", + "\210\265\030\001\022=\n\013return_type\030\003 \001(\0132(.org.jetbrain" + + "s.kotlin.serialization.Type\022\026\n\016return_ty" + + "pe_id\030\007 \001(\005\022I\n\016type_parameter\030\004 \003(\01321.or" + + "g.jetbrains.kotlin.serialization.TypePar" + + "ameter\022?\n\rreceiver_type\030\005 \001(\0132(.org.jetb" + + "rains.kotlin.serialization.Type\022\030\n\020recei" + + "ver_type_id\030\010 \001(\005\022K\n\017value_parameter\030\006 \003" + + "(\01322.org.jetbrains.kotlin.serialization." + + "ValueParameter\022A\n\ntype_table\030\036 \001(\0132-.org" + + ".jetbrains.kotlin.serialization.TypeTabl", + "e\022\027\n\017sinceKotlinInfo\030\037 \001(\005*\005\010d\020\310\001\"\350\003\n\010Pr" + + "operty\022\022\n\005flags\030\013 \001(\005:\003518\022\027\n\told_flags\030" + + "\001 \001(\005:\0042054\022\022\n\004name\030\002 \002(\005B\004\210\265\030\001\022=\n\013retur" + + "n_type\030\003 \001(\0132(.org.jetbrains.kotlin.seri" + + "alization.Type\022\026\n\016return_type_id\030\t \001(\005\022I" + + "\n\016type_parameter\030\004 \003(\01321.org.jetbrains.k" + + "otlin.serialization.TypeParameter\022?\n\rrec" + + "eiver_type\030\005 \001(\0132(.org.jetbrains.kotlin." + + "serialization.Type\022\030\n\020receiver_type_id\030\n" + + " \001(\005\022R\n\026setter_value_parameter\030\006 \001(\01322.o", + "rg.jetbrains.kotlin.serialization.ValueP" + + "arameter\022\024\n\014getter_flags\030\007 \001(\005\022\024\n\014setter" + + "_flags\030\010 \001(\005\022\027\n\017sinceKotlinInfo\030\037 \001(\005*\005\010" + + "d\020\310\001\"\355\001\n\016ValueParameter\022\020\n\005flags\030\001 \001(\005:\001" + + "0\022\022\n\004name\030\002 \002(\005B\004\210\265\030\001\0226\n\004type\030\003 \001(\0132(.or" + + "g.jetbrains.kotlin.serialization.Type\022\017\n" + + "\007type_id\030\005 \001(\005\022E\n\023vararg_element_type\030\004 " + + "\001(\0132(.org.jetbrains.kotlin.serialization" + + ".Type\022\036\n\026vararg_element_type_id\030\006 \001(\005*\005\010" + + "d\020\310\001\"\232\003\n\tTypeAlias\022\020\n\005flags\030\001 \001(\005:\0016\022\022\n\004", + "name\030\002 \002(\005B\004\210\265\030\001\022I\n\016type_parameter\030\003 \003(\013" + + "21.org.jetbrains.kotlin.serialization.Ty" + + "peParameter\022A\n\017underlying_type\030\004 \001(\0132(.o" + + "rg.jetbrains.kotlin.serialization.Type\022\032" + + "\n\022underlying_type_id\030\005 \001(\005\022?\n\rexpanded_t" + + "ype\030\006 \001(\0132(.org.jetbrains.kotlin.seriali" + + "zation.Type\022\030\n\020expanded_type_id\030\007 \001(\005\022B\n" + + "\nannotation\030\010 \003(\0132..org.jetbrains.kotlin" + + ".serialization.Annotation\022\027\n\017sinceKotlin" + + "Info\030\037 \001(\005*\005\010d\020\310\001\"&\n\tEnumEntry\022\022\n\004name\030\001", + " \001(\005B\004\210\265\030\001*\005\010d\020\310\001\"\341\001\n\017SinceKotlinInfo\022\017\n" + + "\007version\030\001 \001(\005\022\024\n\014version_full\030\002 \001(\005\022O\n\005" + + "level\030\003 \001(\01629.org.jetbrains.kotlin.seria" + + "lization.SinceKotlinInfo.Level:\005ERROR\022\022\n" + + "\nerror_code\030\004 \001(\005\022\025\n\007message\030\005 \001(\005B\004\230\265\030\001" + + "\"+\n\005Level\022\013\n\007WARNING\020\000\022\t\n\005ERROR\020\001\022\n\n\006HID" + + "DEN\020\002\"Y\n\024SinceKotlinInfoTable\022A\n\004info\030\001 " + + "\003(\01323.org.jetbrains.kotlin.serialization" + + ".SinceKotlinInfo*9\n\010Modality\022\t\n\005FINAL\020\000\022" + + "\010\n\004OPEN\020\001\022\014\n\010ABSTRACT\020\002\022\n\n\006SEALED\020\003*b\n\nV", + "isibility\022\014\n\010INTERNAL\020\000\022\013\n\007PRIVATE\020\001\022\r\n\t" + + "PROTECTED\020\002\022\n\n\006PUBLIC\020\003\022\023\n\017PRIVATE_TO_TH" + + "IS\020\004\022\t\n\005LOCAL\020\005*Q\n\nMemberKind\022\017\n\013DECLARA" + + "TION\020\000\022\021\n\rFAKE_OVERRIDE\020\001\022\016\n\nDELEGATION\020" + + "\002\022\017\n\013SYNTHESIZED\020\003B\017B\rDebugProtoBuf" }; org.jetbrains.kotlin.protobuf.Descriptors.FileDescriptor.InternalDescriptorAssigner assigner = new org.jetbrains.kotlin.protobuf.Descriptors.FileDescriptor. InternalDescriptorAssigner() { @@ -27465,7 +27631,7 @@ public final class DebugProtoBuf { internal_static_org_jetbrains_kotlin_serialization_Class_fieldAccessorTable = new org.jetbrains.kotlin.protobuf.GeneratedMessage.FieldAccessorTable( internal_static_org_jetbrains_kotlin_serialization_Class_descriptor, - new java.lang.String[] { "Flags", "FqName", "CompanionObjectName", "TypeParameter", "Supertype", "SupertypeId", "NestedClassName", "Constructor", "Function", "Property", "TypeAlias", "EnumEntry", "TypeTable", "SinceKotlinInfo", "SinceKotlinInfoTable", }); + new java.lang.String[] { "Flags", "FqName", "CompanionObjectName", "TypeParameter", "Supertype", "SupertypeId", "NestedClassName", "Constructor", "Function", "Property", "TypeAlias", "EnumEntry", "SealedSubclassFqName", "TypeTable", "SinceKotlinInfo", "SinceKotlinInfoTable", }); internal_static_org_jetbrains_kotlin_serialization_Package_descriptor = getDescriptor().getMessageTypes().get(6); internal_static_org_jetbrains_kotlin_serialization_Package_fieldAccessorTable = new @@ -27541,6 +27707,7 @@ public final class DebugProtoBuf { registry.add(org.jetbrains.kotlin.serialization.DebugExtOptionsProtoBuf.fqNameIdInTable); registry.add(org.jetbrains.kotlin.serialization.DebugExtOptionsProtoBuf.nameIdInTable); registry.add(org.jetbrains.kotlin.serialization.DebugExtOptionsProtoBuf.nameIdInTable); + registry.add(org.jetbrains.kotlin.serialization.DebugExtOptionsProtoBuf.fqNameIdInTable); registry.add(org.jetbrains.kotlin.serialization.DebugExtOptionsProtoBuf.nameIdInTable); registry.add(org.jetbrains.kotlin.serialization.DebugExtOptionsProtoBuf.nameIdInTable); registry.add(org.jetbrains.kotlin.serialization.DebugExtOptionsProtoBuf.nameIdInTable); diff --git a/compiler/serialization/src/org/jetbrains/kotlin/serialization/DescriptorSerializer.kt b/compiler/serialization/src/org/jetbrains/kotlin/serialization/DescriptorSerializer.kt index 4ad03bce4ca..7f9c61f4341 100644 --- a/compiler/serialization/src/org/jetbrains/kotlin/serialization/DescriptorSerializer.kt +++ b/compiler/serialization/src/org/jetbrains/kotlin/serialization/DescriptorSerializer.kt @@ -28,6 +28,7 @@ import org.jetbrains.kotlin.resolve.DescriptorUtils.isEnumEntry import org.jetbrains.kotlin.resolve.MemberComparator import org.jetbrains.kotlin.resolve.constants.NullValue import org.jetbrains.kotlin.resolve.descriptorUtil.builtIns +import org.jetbrains.kotlin.resolve.descriptorUtil.classId import org.jetbrains.kotlin.types.* import org.jetbrains.kotlin.utils.Interner import java.io.ByteArrayOutputStream @@ -116,6 +117,10 @@ class DescriptorSerializer private constructor( } } + for (sealedSubclass in classDescriptor.sealedSubclasses) { + builder.addSealedSubclassFqName(getClassifierId(sealedSubclass)) + } + val companionObjectDescriptor = classDescriptor.companionObjectDescriptor if (companionObjectDescriptor != null) { builder.companionObjectName = getSimpleNameIndex(companionObjectDescriptor.name) diff --git a/compiler/testData/compileKotlinAgainstKotlin/sealedClass.kt b/compiler/testData/compileKotlinAgainstKotlin/sealedClass.kt new file mode 100644 index 00000000000..dff0e486a51 --- /dev/null +++ b/compiler/testData/compileKotlinAgainstKotlin/sealedClass.kt @@ -0,0 +1,38 @@ +// FILE: A.kt + +package a + +sealed class Empty + +sealed class OnlyNested { + class Nested : OnlyNested() +} + +sealed class NestedAndTopLevel { + class Nested : NestedAndTopLevel() +} +class TopLevel : NestedAndTopLevel() + +// FILE: B.kt + +import a.* + +// This test checks that we correctly load subclasses of a compiled sealed class from binaries. +// It's not a diagnostic test because there are no diagnostic tests where resolution is performed against compiled Kotlin binaries + +fun empty(e: Empty): String = when (e) { + else -> "1" +} + +fun onlyNested(on: OnlyNested): String = when (on) { + is OnlyNested.Nested -> "2" +} + +fun nestedAndTopLevel(natl: NestedAndTopLevel): String = when (natl) { + is NestedAndTopLevel.Nested -> "3" + is TopLevel -> "4" +} + +fun box(): String { + return "OK" +} diff --git a/compiler/tests/org/jetbrains/kotlin/codegen/CompileKotlinAgainstKotlinTestGenerated.java b/compiler/tests/org/jetbrains/kotlin/codegen/CompileKotlinAgainstKotlinTestGenerated.java index 66b56cfd526..73cf7c74e51 100644 --- a/compiler/tests/org/jetbrains/kotlin/codegen/CompileKotlinAgainstKotlinTestGenerated.java +++ b/compiler/tests/org/jetbrains/kotlin/codegen/CompileKotlinAgainstKotlinTestGenerated.java @@ -204,6 +204,12 @@ public class CompileKotlinAgainstKotlinTestGenerated extends AbstractCompileKotl doTest(fileName); } + @TestMetadata("sealedClass.kt") + public void testSealedClass() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/compileKotlinAgainstKotlin/sealedClass.kt"); + doTest(fileName); + } + @TestMetadata("secondaryConstructors.kt") public void testSecondaryConstructors() throws Exception { String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/compileKotlinAgainstKotlin/secondaryConstructors.kt"); diff --git a/core/deserialization/src/descriptors.proto b/core/deserialization/src/descriptors.proto index 0babf1dcbb2..db5734011cb 100644 --- a/core/deserialization/src/descriptors.proto +++ b/core/deserialization/src/descriptors.proto @@ -206,6 +206,8 @@ message Class { repeated EnumEntry enum_entry = 13; + repeated int32 sealed_subclass_fq_name = 16 [packed = true, (fq_name_id_in_table) = true]; + optional TypeTable type_table = 30; // Index into the SinceKotlinInfoTable diff --git a/core/deserialization/src/org/jetbrains/kotlin/serialization/ProtoBuf.java b/core/deserialization/src/org/jetbrains/kotlin/serialization/ProtoBuf.java index 23eee30e874..bd32a817f9c 100644 --- a/core/deserialization/src/org/jetbrains/kotlin/serialization/ProtoBuf.java +++ b/core/deserialization/src/org/jetbrains/kotlin/serialization/ProtoBuf.java @@ -8095,6 +8095,19 @@ public final class ProtoBuf { */ int getEnumEntryCount(); + /** + * repeated int32 sealed_subclass_fq_name = 16 [packed = true]; + */ + java.util.List getSealedSubclassFqNameList(); + /** + * repeated int32 sealed_subclass_fq_name = 16 [packed = true]; + */ + int getSealedSubclassFqNameCount(); + /** + * repeated int32 sealed_subclass_fq_name = 16 [packed = true]; + */ + int getSealedSubclassFqName(int index); + /** * optional .org.jetbrains.kotlin.serialization.TypeTable type_table = 30; */ @@ -8294,6 +8307,27 @@ public final class ProtoBuf { enumEntry_.add(input.readMessage(org.jetbrains.kotlin.serialization.ProtoBuf.EnumEntry.PARSER, extensionRegistry)); break; } + case 128: { + if (!((mutable_bitField0_ & 0x00001000) == 0x00001000)) { + sealedSubclassFqName_ = new java.util.ArrayList(); + mutable_bitField0_ |= 0x00001000; + } + sealedSubclassFqName_.add(input.readInt32()); + break; + } + case 130: { + int length = input.readRawVarint32(); + int limit = input.pushLimit(length); + if (!((mutable_bitField0_ & 0x00001000) == 0x00001000) && input.getBytesUntilLimit() > 0) { + sealedSubclassFqName_ = new java.util.ArrayList(); + mutable_bitField0_ |= 0x00001000; + } + while (input.getBytesUntilLimit() > 0) { + sealedSubclassFqName_.add(input.readInt32()); + } + input.popLimit(limit); + break; + } case 242: { org.jetbrains.kotlin.serialization.ProtoBuf.TypeTable.Builder subBuilder = null; if (((bitField0_ & 0x00000008) == 0x00000008)) { @@ -8360,6 +8394,9 @@ public final class ProtoBuf { if (((mutable_bitField0_ & 0x00000800) == 0x00000800)) { enumEntry_ = java.util.Collections.unmodifiableList(enumEntry_); } + if (((mutable_bitField0_ & 0x00001000) == 0x00001000)) { + sealedSubclassFqName_ = java.util.Collections.unmodifiableList(sealedSubclassFqName_); + } try { unknownFieldsCodedOutput.flush(); } catch (java.io.IOException e) { @@ -8849,6 +8886,29 @@ public final class ProtoBuf { return enumEntry_.get(index); } + public static final int SEALED_SUBCLASS_FQ_NAME_FIELD_NUMBER = 16; + private java.util.List sealedSubclassFqName_; + /** + * repeated int32 sealed_subclass_fq_name = 16 [packed = true]; + */ + public java.util.List + getSealedSubclassFqNameList() { + return sealedSubclassFqName_; + } + /** + * repeated int32 sealed_subclass_fq_name = 16 [packed = true]; + */ + public int getSealedSubclassFqNameCount() { + return sealedSubclassFqName_.size(); + } + /** + * repeated int32 sealed_subclass_fq_name = 16 [packed = true]; + */ + public int getSealedSubclassFqName(int index) { + return sealedSubclassFqName_.get(index); + } + private int sealedSubclassFqNameMemoizedSerializedSize = -1; + public static final int TYPE_TABLE_FIELD_NUMBER = 30; private org.jetbrains.kotlin.serialization.ProtoBuf.TypeTable typeTable_; /** @@ -8915,6 +8975,7 @@ public final class ProtoBuf { property_ = java.util.Collections.emptyList(); typeAlias_ = java.util.Collections.emptyList(); enumEntry_ = java.util.Collections.emptyList(); + sealedSubclassFqName_ = java.util.Collections.emptyList(); typeTable_ = org.jetbrains.kotlin.serialization.ProtoBuf.TypeTable.getDefaultInstance(); sinceKotlinInfo_ = 0; sinceKotlinInfoTable_ = org.jetbrains.kotlin.serialization.ProtoBuf.SinceKotlinInfoTable.getDefaultInstance(); @@ -9035,6 +9096,13 @@ public final class ProtoBuf { for (int i = 0; i < enumEntry_.size(); i++) { output.writeMessage(13, enumEntry_.get(i)); } + if (getSealedSubclassFqNameList().size() > 0) { + output.writeRawVarint32(130); + output.writeRawVarint32(sealedSubclassFqNameMemoizedSerializedSize); + } + for (int i = 0; i < sealedSubclassFqName_.size(); i++) { + output.writeInt32NoTag(sealedSubclassFqName_.get(i)); + } if (((bitField0_ & 0x00000008) == 0x00000008)) { output.writeMessage(30, typeTable_); } @@ -9122,6 +9190,20 @@ public final class ProtoBuf { size += org.jetbrains.kotlin.protobuf.CodedOutputStream .computeMessageSize(13, enumEntry_.get(i)); } + { + int dataSize = 0; + for (int i = 0; i < sealedSubclassFqName_.size(); i++) { + dataSize += org.jetbrains.kotlin.protobuf.CodedOutputStream + .computeInt32SizeNoTag(sealedSubclassFqName_.get(i)); + } + size += dataSize; + if (!getSealedSubclassFqNameList().isEmpty()) { + size += 2; + size += org.jetbrains.kotlin.protobuf.CodedOutputStream + .computeInt32SizeNoTag(dataSize); + } + sealedSubclassFqNameMemoizedSerializedSize = dataSize; + } if (((bitField0_ & 0x00000008) == 0x00000008)) { size += org.jetbrains.kotlin.protobuf.CodedOutputStream .computeMessageSize(30, typeTable_); @@ -9252,12 +9334,14 @@ public final class ProtoBuf { bitField0_ = (bitField0_ & ~0x00000400); enumEntry_ = java.util.Collections.emptyList(); bitField0_ = (bitField0_ & ~0x00000800); - typeTable_ = org.jetbrains.kotlin.serialization.ProtoBuf.TypeTable.getDefaultInstance(); + sealedSubclassFqName_ = java.util.Collections.emptyList(); bitField0_ = (bitField0_ & ~0x00001000); - sinceKotlinInfo_ = 0; + typeTable_ = org.jetbrains.kotlin.serialization.ProtoBuf.TypeTable.getDefaultInstance(); bitField0_ = (bitField0_ & ~0x00002000); - sinceKotlinInfoTable_ = org.jetbrains.kotlin.serialization.ProtoBuf.SinceKotlinInfoTable.getDefaultInstance(); + sinceKotlinInfo_ = 0; bitField0_ = (bitField0_ & ~0x00004000); + sinceKotlinInfoTable_ = org.jetbrains.kotlin.serialization.ProtoBuf.SinceKotlinInfoTable.getDefaultInstance(); + bitField0_ = (bitField0_ & ~0x00008000); return this; } @@ -9338,15 +9422,20 @@ public final class ProtoBuf { bitField0_ = (bitField0_ & ~0x00000800); } result.enumEntry_ = enumEntry_; - if (((from_bitField0_ & 0x00001000) == 0x00001000)) { + if (((bitField0_ & 0x00001000) == 0x00001000)) { + sealedSubclassFqName_ = java.util.Collections.unmodifiableList(sealedSubclassFqName_); + bitField0_ = (bitField0_ & ~0x00001000); + } + result.sealedSubclassFqName_ = sealedSubclassFqName_; + if (((from_bitField0_ & 0x00002000) == 0x00002000)) { to_bitField0_ |= 0x00000008; } result.typeTable_ = typeTable_; - if (((from_bitField0_ & 0x00002000) == 0x00002000)) { + if (((from_bitField0_ & 0x00004000) == 0x00004000)) { to_bitField0_ |= 0x00000010; } result.sinceKotlinInfo_ = sinceKotlinInfo_; - if (((from_bitField0_ & 0x00004000) == 0x00004000)) { + if (((from_bitField0_ & 0x00008000) == 0x00008000)) { to_bitField0_ |= 0x00000020; } result.sinceKotlinInfoTable_ = sinceKotlinInfoTable_; @@ -9454,6 +9543,16 @@ public final class ProtoBuf { enumEntry_.addAll(other.enumEntry_); } + } + if (!other.sealedSubclassFqName_.isEmpty()) { + if (sealedSubclassFqName_.isEmpty()) { + sealedSubclassFqName_ = other.sealedSubclassFqName_; + bitField0_ = (bitField0_ & ~0x00001000); + } else { + ensureSealedSubclassFqNameIsMutable(); + sealedSubclassFqName_.addAll(other.sealedSubclassFqName_); + } + } if (other.hasTypeTable()) { mergeTypeTable(other.getTypeTable()); @@ -10688,12 +10787,78 @@ public final class ProtoBuf { return this; } + private java.util.List sealedSubclassFqName_ = java.util.Collections.emptyList(); + private void ensureSealedSubclassFqNameIsMutable() { + if (!((bitField0_ & 0x00001000) == 0x00001000)) { + sealedSubclassFqName_ = new java.util.ArrayList(sealedSubclassFqName_); + bitField0_ |= 0x00001000; + } + } + /** + * repeated int32 sealed_subclass_fq_name = 16 [packed = true]; + */ + public java.util.List + getSealedSubclassFqNameList() { + return java.util.Collections.unmodifiableList(sealedSubclassFqName_); + } + /** + * repeated int32 sealed_subclass_fq_name = 16 [packed = true]; + */ + public int getSealedSubclassFqNameCount() { + return sealedSubclassFqName_.size(); + } + /** + * repeated int32 sealed_subclass_fq_name = 16 [packed = true]; + */ + public int getSealedSubclassFqName(int index) { + return sealedSubclassFqName_.get(index); + } + /** + * repeated int32 sealed_subclass_fq_name = 16 [packed = true]; + */ + public Builder setSealedSubclassFqName( + int index, int value) { + ensureSealedSubclassFqNameIsMutable(); + sealedSubclassFqName_.set(index, value); + + return this; + } + /** + * repeated int32 sealed_subclass_fq_name = 16 [packed = true]; + */ + public Builder addSealedSubclassFqName(int value) { + ensureSealedSubclassFqNameIsMutable(); + sealedSubclassFqName_.add(value); + + return this; + } + /** + * repeated int32 sealed_subclass_fq_name = 16 [packed = true]; + */ + public Builder addAllSealedSubclassFqName( + java.lang.Iterable values) { + ensureSealedSubclassFqNameIsMutable(); + org.jetbrains.kotlin.protobuf.AbstractMessageLite.Builder.addAll( + values, sealedSubclassFqName_); + + return this; + } + /** + * repeated int32 sealed_subclass_fq_name = 16 [packed = true]; + */ + public Builder clearSealedSubclassFqName() { + sealedSubclassFqName_ = java.util.Collections.emptyList(); + bitField0_ = (bitField0_ & ~0x00001000); + + return this; + } + private org.jetbrains.kotlin.serialization.ProtoBuf.TypeTable typeTable_ = org.jetbrains.kotlin.serialization.ProtoBuf.TypeTable.getDefaultInstance(); /** * optional .org.jetbrains.kotlin.serialization.TypeTable type_table = 30; */ public boolean hasTypeTable() { - return ((bitField0_ & 0x00001000) == 0x00001000); + return ((bitField0_ & 0x00002000) == 0x00002000); } /** * optional .org.jetbrains.kotlin.serialization.TypeTable type_table = 30; @@ -10710,7 +10875,7 @@ public final class ProtoBuf { } typeTable_ = value; - bitField0_ |= 0x00001000; + bitField0_ |= 0x00002000; return this; } /** @@ -10720,14 +10885,14 @@ public final class ProtoBuf { org.jetbrains.kotlin.serialization.ProtoBuf.TypeTable.Builder builderForValue) { typeTable_ = builderForValue.build(); - bitField0_ |= 0x00001000; + bitField0_ |= 0x00002000; return this; } /** * optional .org.jetbrains.kotlin.serialization.TypeTable type_table = 30; */ public Builder mergeTypeTable(org.jetbrains.kotlin.serialization.ProtoBuf.TypeTable value) { - if (((bitField0_ & 0x00001000) == 0x00001000) && + if (((bitField0_ & 0x00002000) == 0x00002000) && typeTable_ != org.jetbrains.kotlin.serialization.ProtoBuf.TypeTable.getDefaultInstance()) { typeTable_ = org.jetbrains.kotlin.serialization.ProtoBuf.TypeTable.newBuilder(typeTable_).mergeFrom(value).buildPartial(); @@ -10735,7 +10900,7 @@ public final class ProtoBuf { typeTable_ = value; } - bitField0_ |= 0x00001000; + bitField0_ |= 0x00002000; return this; } /** @@ -10744,7 +10909,7 @@ public final class ProtoBuf { public Builder clearTypeTable() { typeTable_ = org.jetbrains.kotlin.serialization.ProtoBuf.TypeTable.getDefaultInstance(); - bitField0_ = (bitField0_ & ~0x00001000); + bitField0_ = (bitField0_ & ~0x00002000); return this; } @@ -10757,7 +10922,7 @@ public final class ProtoBuf { * */ public boolean hasSinceKotlinInfo() { - return ((bitField0_ & 0x00002000) == 0x00002000); + return ((bitField0_ & 0x00004000) == 0x00004000); } /** * optional int32 sinceKotlinInfo = 31; @@ -10777,7 +10942,7 @@ public final class ProtoBuf { * */ public Builder setSinceKotlinInfo(int value) { - bitField0_ |= 0x00002000; + bitField0_ |= 0x00004000; sinceKotlinInfo_ = value; return this; @@ -10790,7 +10955,7 @@ public final class ProtoBuf { * */ public Builder clearSinceKotlinInfo() { - bitField0_ = (bitField0_ & ~0x00002000); + bitField0_ = (bitField0_ & ~0x00004000); sinceKotlinInfo_ = 0; return this; @@ -10801,7 +10966,7 @@ public final class ProtoBuf { * optional .org.jetbrains.kotlin.serialization.SinceKotlinInfoTable since_kotlin_info_table = 32; */ public boolean hasSinceKotlinInfoTable() { - return ((bitField0_ & 0x00004000) == 0x00004000); + return ((bitField0_ & 0x00008000) == 0x00008000); } /** * optional .org.jetbrains.kotlin.serialization.SinceKotlinInfoTable since_kotlin_info_table = 32; @@ -10818,7 +10983,7 @@ public final class ProtoBuf { } sinceKotlinInfoTable_ = value; - bitField0_ |= 0x00004000; + bitField0_ |= 0x00008000; return this; } /** @@ -10828,14 +10993,14 @@ public final class ProtoBuf { org.jetbrains.kotlin.serialization.ProtoBuf.SinceKotlinInfoTable.Builder builderForValue) { sinceKotlinInfoTable_ = builderForValue.build(); - bitField0_ |= 0x00004000; + bitField0_ |= 0x00008000; return this; } /** * optional .org.jetbrains.kotlin.serialization.SinceKotlinInfoTable since_kotlin_info_table = 32; */ public Builder mergeSinceKotlinInfoTable(org.jetbrains.kotlin.serialization.ProtoBuf.SinceKotlinInfoTable value) { - if (((bitField0_ & 0x00004000) == 0x00004000) && + if (((bitField0_ & 0x00008000) == 0x00008000) && sinceKotlinInfoTable_ != org.jetbrains.kotlin.serialization.ProtoBuf.SinceKotlinInfoTable.getDefaultInstance()) { sinceKotlinInfoTable_ = org.jetbrains.kotlin.serialization.ProtoBuf.SinceKotlinInfoTable.newBuilder(sinceKotlinInfoTable_).mergeFrom(value).buildPartial(); @@ -10843,7 +11008,7 @@ public final class ProtoBuf { sinceKotlinInfoTable_ = value; } - bitField0_ |= 0x00004000; + bitField0_ |= 0x00008000; return this; } /** @@ -10852,7 +11017,7 @@ public final class ProtoBuf { public Builder clearSinceKotlinInfoTable() { sinceKotlinInfoTable_ = org.jetbrains.kotlin.serialization.ProtoBuf.SinceKotlinInfoTable.getDefaultInstance(); - bitField0_ = (bitField0_ & ~0x00004000); + bitField0_ = (bitField0_ & ~0x00008000); return this; } 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 1927fb38466..3104f9a8fac 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 @@ -150,7 +150,16 @@ class DeserializedClassDescriptor( name in memberScope.classNames private fun computeSubclassesForSealedClass(): Collection { - // TODO: store the list of subclasses to metadata + if (modality != Modality.SEALED) return emptyList() + + val fqNames = classProto.sealedSubclassFqNameList + if (fqNames.isNotEmpty()) { + return fqNames.mapNotNull { index -> + c.components.deserializeClass(c.nameResolver.getClassId(index)) + } + } + + // This is needed because classes compiled with Kotlin 1.0 did not contain the sealed_subclass_fq_name field return computeSealedSubclasses(this) }