From bd78e7e0aa292177b62f01b16a4845818ab77667 Mon Sep 17 00:00:00 2001 From: Alexander Gorshenev Date: Fri, 26 Apr 2019 02:33:15 +0300 Subject: [PATCH] Move property serialization to symbols Make sure private field's wrapped descriptor is bound --- .../ir/util/DeclarationStubGenerator.kt | 2 +- .../jetbrains/kotlin/ir/util/SymbolTable.kt | 9 - .../serialization.common/src/KotlinIr.proto | 5 +- .../serialization/IrModuleDeserializer.kt | 91 ++--- .../serialization/IrModuleSerializer.kt | 8 +- .../common/serialization/KotlinIr.java | 317 +++++++----------- .../common/serialization/KotlinIrLinker.kt | 12 +- 7 files changed, 185 insertions(+), 259 deletions(-) diff --git a/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/util/DeclarationStubGenerator.kt b/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/util/DeclarationStubGenerator.kt index 21da6367281..e7ec16f25ee 100644 --- a/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/util/DeclarationStubGenerator.kt +++ b/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/util/DeclarationStubGenerator.kt @@ -95,7 +95,7 @@ class DeclarationStubGenerator( UNDEFINED_OFFSET, UNDEFINED_OFFSET, origin, descriptor.original, isDelegated = @Suppress("DEPRECATION") descriptor.isDelegated ) { - deserializer?.findDeserializedDeclaration(descriptor) + deserializer?.findDeserializedDeclaration(referenced) as? IrProperty ?: IrLazyProperty(UNDEFINED_OFFSET, UNDEFINED_OFFSET, origin, it, this, typeTranslator, bindingContext) } } diff --git a/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/util/SymbolTable.kt b/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/util/SymbolTable.kt index cc3e34c6244..f2a1e453407 100644 --- a/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/util/SymbolTable.kt +++ b/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/util/SymbolTable.kt @@ -29,15 +29,6 @@ import org.jetbrains.kotlin.ir.types.impl.IrUninitializedType interface IrDeserializer { fun findDeserializedDeclaration(symbol: IrSymbol): IrDeclaration? - // We need a separate method for properties, because properties - // are treated differently in the SymbolTable. - // See SymbolTable.propertyTable and SymbolTable.referenceProperty. - // There was an attempt to solve this asymmetry in the symbol table - // using property symbols, but it was not successful. - // For now we have to live with a special treatment of properties. - // TODO: eventually get rid of this asymmetry. - fun findDeserializedDeclaration(propertyDescriptor: PropertyDescriptor): IrProperty? - fun declareForwardDeclarations() } diff --git a/compiler/ir/serialization.common/src/KotlinIr.proto b/compiler/ir/serialization.common/src/KotlinIr.proto index 8a200215923..14126832fd9 100644 --- a/compiler/ir/serialization.common/src/KotlinIr.proto +++ b/compiler/ir/serialization.common/src/KotlinIr.proto @@ -127,6 +127,7 @@ enum IrSymbolKind { ANONYMOUS_INIT_SYMBOL = 10; STANDALONE_FIELD_SYMBOL = 11; // For fields without properties. WrappedFieldDescriptor, rather than WrappedPropertyDescriptor. RECEIVER_PARAMETER_SYMBOL = 12; // ReceiverParameterDescriptor rather than ValueParameterDescriptor. + PROPERTY_SYMBOL = 13; } message IrSymbolData { @@ -266,7 +267,7 @@ message IrPropertyReference { optional IrSymbol setter = 3; optional IrStatementOrigin origin = 4; required MemberAccessCommon member_access = 5; - optional DescriptorReference descriptor_reference = 6; // IrProperty doesn't have a symbol at all. Preserve this rudiment for now. + required IrSymbol symbol = 6; } message IrComposite { @@ -584,7 +585,7 @@ message IrLocalDelegatedProperty { } message IrProperty { - optional DescriptorReference descriptor_reference = 1; // IrProperty doesn't have a symbol at all. Preserve this rudiment for now. + required IrSymbol symbol = 1; required String name = 2; required Visibility visibility = 3; required ModalityKind modality = 4; diff --git a/compiler/ir/serialization.common/src/org/jetbrains/kotlin/backend/common/serialization/IrModuleDeserializer.kt b/compiler/ir/serialization.common/src/org/jetbrains/kotlin/backend/common/serialization/IrModuleDeserializer.kt index bb5a80e63ab..e1b87f619cc 100644 --- a/compiler/ir/serialization.common/src/org/jetbrains/kotlin/backend/common/serialization/IrModuleDeserializer.kt +++ b/compiler/ir/serialization.common/src/org/jetbrains/kotlin/backend/common/serialization/IrModuleDeserializer.kt @@ -439,28 +439,21 @@ abstract class IrModuleDeserializer( ) } - private val getterToPropertyDescriptorMap = mutableMapOf() - private fun deserializePropertyReference( proto: KotlinIr.IrPropertyReference, start: Int, end: Int, type: IrType ): IrPropertyReference { + val symbol = deserializeIrSymbol(proto.symbol) as IrPropertySymbol + val field = if (proto.hasField()) deserializeIrSymbol(proto.field) as IrFieldSymbol else null val getter = if (proto.hasGetter()) deserializeIrSymbol(proto.getter) as IrSimpleFunctionSymbol else null val setter = if (proto.hasSetter()) deserializeIrSymbol(proto.setter) as IrSimpleFunctionSymbol else null val origin = if (proto.hasOrigin()) deserializeIrStatementOrigin(proto.origin) else null - val descriptor = - if (proto.hasDescriptorReference()) - deserializeDescriptorReference(proto.descriptorReference) as PropertyDescriptor - else - field?.descriptor as? WrappedPropertyDescriptor // If field's descriptor coincides with property's. - ?: getterToPropertyDescriptorMap.getOrPut(getter!!) { WrappedPropertyDescriptor() } - val callable = IrPropertyReferenceImpl( start, end, type, - descriptor, + symbol, proto.memberAccess.typeArguments.typeArgumentCount, field, getter, @@ -1178,44 +1171,56 @@ abstract class IrModuleDeserializer( origin: IrDeclarationOrigin ): IrProperty { + val symbol = deserializeIrSymbol(proto.symbol) as IrPropertySymbol + val backingField = if (proto.hasBackingField()) deserializeIrField(proto.backingField, start, end, origin) else null val getter = if (proto.hasGetter()) deserializeIrFunction(proto.getter, start, end, origin) else null val setter = if (proto.hasSetter()) deserializeIrFunction(proto.setter, start, end, origin) else null - backingField?.let { (it.descriptor as? WrappedFieldDescriptor)?.bind(it) } + val property = + symbolTable.declareProperty( + UNDEFINED_OFFSET, UNDEFINED_OFFSET, irrelevantOrigin, + symbol.descriptor, proto.isDelegated + ) { + IrPropertyImpl( + start, end, origin, + symbol, + deserializeName(proto.name), + deserializeVisibility(proto.visibility), + deserializeModality(proto.modality), + proto.isVar, + proto.isConst, + proto.isLateinit, + proto.isDelegated, + proto.isExternal + ) + } + + backingField?.let { + val descriptor = it.descriptor + when (descriptor) { + is WrappedFieldDescriptor -> + descriptor.bind(it) + is WrappedPropertyDescriptor -> + // A property symbol and its field symbol share the same descriptor. + // Unfortunately symbol deserialization doesn't know anything about that. + // So we can end up with two wrapped property descriptors for property and its field. + // In that case we need to bind the field's one here. + if (symbol.descriptor != descriptor) descriptor.bind(property) + } + + } getter?.let { (it.descriptor as? WrappedSimpleFunctionDescriptor)?.bind(it) } setter?.let { (it.descriptor as? WrappedSimpleFunctionDescriptor)?.bind(it) } - val descriptor = - if (proto.hasDescriptorReference()) - deserializeDescriptorReference(proto.descriptorReference) as PropertyDescriptor - else - backingField?.descriptor as? WrappedPropertyDescriptor // If field's descriptor coincides with property's. - ?: getterToPropertyDescriptorMap.getOrPut(getter!!.symbol) { WrappedPropertyDescriptor() } - - val property = IrPropertyImpl( - start, end, origin, - descriptor, - deserializeName(proto.name), - deserializeVisibility(proto.visibility), - deserializeModality(proto.modality), - proto.isVar, - proto.isConst, - proto.isLateinit, - proto.isDelegated, - proto.isExternal - ) - - symbolTable.referenceProperty(descriptor, { property }) - property.backingField = backingField property.getter = getter property.setter = setter - backingField?.let { it.correspondingProperty = property } - getter?.let { it.correspondingProperty = property } - setter?.let { it.correspondingProperty = property } + backingField?.let { it.correspondingPropertySymbol = symbol } + getter?.let { it.correspondingPropertySymbol = symbol } + setter?.let { it.correspondingPropertySymbol = symbol } return property } @@ -1231,18 +1236,15 @@ abstract class IrModuleDeserializer( private val allKnownDeclarationOrigins = IrDeclarationOrigin::class.nestedClasses.toList() + DeclarationFactory.FIELD_FOR_OUTER_THIS::class -<<<<<<< HEAD - val originIndex = allKnownOrigins.map { it.objectInstance as IrDeclarationOriginImpl }.associateBy { it.name } - fun deserializeIrDeclarationOrigin(proto: KotlinIr.IrDeclarationOrigin): IrDeclarationOriginImpl { - val originName = deserializeString(proto.custom) - return originIndex[originName] ?: object : IrDeclarationOriginImpl(originName) {} -======= val declarationOriginIndex = allKnownDeclarationOrigins.map { it.objectInstance as IrDeclarationOriginImpl }.associateBy { it.name } - fun deserializeIrDeclarationOrigin(proto: KotlinIr.IrDeclarationOrigin) = - declarationOriginIndex[deserializeString(proto.custom)]!! + + fun deserializeIrDeclarationOrigin(proto: KotlinIr.IrDeclarationOrigin): IrDeclarationOriginImpl { + val originName = deserializeString(proto.custom) + return declarationOriginIndex[originName] ?: object : IrDeclarationOriginImpl(originName) {} + } private val allKnownStatementOrigins = IrStatementOrigin::class.nestedClasses.toList() @@ -1259,7 +1261,6 @@ abstract class IrModuleDeserializer( else -> statementOriginIndex[it] ?: error("Unexpected statement origin: $it") } } ->>>>>>> Introduced proper IrStatementOrigin serialization. } open fun deserializeDeclaration(proto: KotlinIr.IrDeclaration, parent: IrDeclarationParent?): IrDeclaration { diff --git a/compiler/ir/serialization.common/src/org/jetbrains/kotlin/backend/common/serialization/IrModuleSerializer.kt b/compiler/ir/serialization.common/src/org/jetbrains/kotlin/backend/common/serialization/IrModuleSerializer.kt index 77047a17b3d..1484a0eac09 100644 --- a/compiler/ir/serialization.common/src/org/jetbrains/kotlin/backend/common/serialization/IrModuleSerializer.kt +++ b/compiler/ir/serialization.common/src/org/jetbrains/kotlin/backend/common/serialization/IrModuleSerializer.kt @@ -120,6 +120,8 @@ open class IrModuleSerializer( KotlinIr.IrSymbolKind.STANDALONE_FIELD_SYMBOL else KotlinIr.IrSymbolKind.FIELD_SYMBOL + is IrPropertySymbol -> + KotlinIr.IrSymbolKind.PROPERTY_SYMBOL else -> TODO("Unexpected symbol kind: $symbol") } @@ -434,13 +436,12 @@ open class IrModuleSerializer( private fun serializePropertyReference(callable: IrPropertyReference): KotlinIr.IrPropertyReference { val proto = KotlinIr.IrPropertyReference.newBuilder() .setMemberAccess(serializeMemberAccessCommon(callable)) + .setSymbol(serializeIrSymbol(callable.symbol)) callable.origin?.let { proto.origin = serializeIrStatementOrigin(it) } callable.field?.let { proto.field = serializeIrSymbol(it) } callable.getter?.let { proto.getter = serializeIrSymbol(it) } callable.setter?.let { proto.setter = serializeIrSymbol(it) } - val property = callable.getter!!.owner.correspondingProperty!! - descriptorReferenceSerializer.serializeDescriptorReference(property)?.let { proto.setDescriptorReference(it) } return proto.build() } @@ -998,8 +999,7 @@ open class IrModuleSerializer( .setIsLateinit(property.isLateinit) .setIsDelegated(property.isDelegated) .setIsExternal(property.isExternal) - - descriptorReferenceSerializer.serializeDescriptorReference(property)?.let { proto.setDescriptorReference(it) } + .setSymbol(serializeIrSymbol(property.symbol)) val backingField = property.backingField val getter = property.getter diff --git a/compiler/ir/serialization.common/src/org/jetbrains/kotlin/backend/common/serialization/KotlinIr.java b/compiler/ir/serialization.common/src/org/jetbrains/kotlin/backend/common/serialization/KotlinIr.java index 09cc962e5d7..cbac0ad7737 100644 --- a/compiler/ir/serialization.common/src/org/jetbrains/kotlin/backend/common/serialization/KotlinIr.java +++ b/compiler/ir/serialization.common/src/org/jetbrains/kotlin/backend/common/serialization/KotlinIr.java @@ -359,6 +359,10 @@ public final class KotlinIr { * */ RECEIVER_PARAMETER_SYMBOL(11, 12), + /** + * PROPERTY_SYMBOL = 13; + */ + PROPERTY_SYMBOL(12, 13), ; /** @@ -417,6 +421,10 @@ public final class KotlinIr { * */ public static final int RECEIVER_PARAMETER_SYMBOL_VALUE = 12; + /** + * PROPERTY_SYMBOL = 13; + */ + public static final int PROPERTY_SYMBOL_VALUE = 13; public final int getNumber() { return value; } @@ -435,6 +443,7 @@ public final class KotlinIr { case 10: return ANONYMOUS_INIT_SYMBOL; case 11: return STANDALONE_FIELD_SYMBOL; case 12: return RECEIVER_PARAMETER_SYMBOL; + case 13: return PROPERTY_SYMBOL; default: return null; } } @@ -21057,21 +21066,13 @@ public final class KotlinIr { org.jetbrains.kotlin.backend.common.serialization.KotlinIr.MemberAccessCommon getMemberAccess(); /** - * optional .org.jetbrains.kotlin.backend.common.serialization.DescriptorReference descriptor_reference = 6; - * - *
-     * IrProperty doesn't have a symbol at all. Preserve this rudiment for now.
-     * 
+ * required .org.jetbrains.kotlin.backend.common.serialization.IrSymbol symbol = 6; */ - boolean hasDescriptorReference(); + boolean hasSymbol(); /** - * optional .org.jetbrains.kotlin.backend.common.serialization.DescriptorReference descriptor_reference = 6; - * - *
-     * IrProperty doesn't have a symbol at all. Preserve this rudiment for now.
-     * 
+ * required .org.jetbrains.kotlin.backend.common.serialization.IrSymbol symbol = 6; */ - org.jetbrains.kotlin.backend.common.serialization.KotlinIr.DescriptorReference getDescriptorReference(); + org.jetbrains.kotlin.backend.common.serialization.KotlinIr.IrSymbol getSymbol(); } /** * Protobuf type {@code org.jetbrains.kotlin.backend.common.serialization.IrPropertyReference} @@ -21189,14 +21190,14 @@ public final class KotlinIr { break; } case 50: { - org.jetbrains.kotlin.backend.common.serialization.KotlinIr.DescriptorReference.Builder subBuilder = null; + org.jetbrains.kotlin.backend.common.serialization.KotlinIr.IrSymbol.Builder subBuilder = null; if (((bitField0_ & 0x00000020) == 0x00000020)) { - subBuilder = descriptorReference_.toBuilder(); + subBuilder = symbol_.toBuilder(); } - descriptorReference_ = input.readMessage(org.jetbrains.kotlin.backend.common.serialization.KotlinIr.DescriptorReference.PARSER, extensionRegistry); + symbol_ = input.readMessage(org.jetbrains.kotlin.backend.common.serialization.KotlinIr.IrSymbol.PARSER, extensionRegistry); if (subBuilder != null) { - subBuilder.mergeFrom(descriptorReference_); - descriptorReference_ = subBuilder.buildPartial(); + subBuilder.mergeFrom(symbol_); + symbol_ = subBuilder.buildPartial(); } bitField0_ |= 0x00000020; break; @@ -21310,27 +21311,19 @@ public final class KotlinIr { return memberAccess_; } - public static final int DESCRIPTOR_REFERENCE_FIELD_NUMBER = 6; - private org.jetbrains.kotlin.backend.common.serialization.KotlinIr.DescriptorReference descriptorReference_; + public static final int SYMBOL_FIELD_NUMBER = 6; + private org.jetbrains.kotlin.backend.common.serialization.KotlinIr.IrSymbol symbol_; /** - * optional .org.jetbrains.kotlin.backend.common.serialization.DescriptorReference descriptor_reference = 6; - * - *
-     * IrProperty doesn't have a symbol at all. Preserve this rudiment for now.
-     * 
+ * required .org.jetbrains.kotlin.backend.common.serialization.IrSymbol symbol = 6; */ - public boolean hasDescriptorReference() { + public boolean hasSymbol() { return ((bitField0_ & 0x00000020) == 0x00000020); } /** - * optional .org.jetbrains.kotlin.backend.common.serialization.DescriptorReference descriptor_reference = 6; - * - *
-     * IrProperty doesn't have a symbol at all. Preserve this rudiment for now.
-     * 
+ * required .org.jetbrains.kotlin.backend.common.serialization.IrSymbol symbol = 6; */ - public org.jetbrains.kotlin.backend.common.serialization.KotlinIr.DescriptorReference getDescriptorReference() { - return descriptorReference_; + public org.jetbrains.kotlin.backend.common.serialization.KotlinIr.IrSymbol getSymbol() { + return symbol_; } private void initFields() { @@ -21339,7 +21332,7 @@ public final class KotlinIr { setter_ = org.jetbrains.kotlin.backend.common.serialization.KotlinIr.IrSymbol.getDefaultInstance(); origin_ = org.jetbrains.kotlin.backend.common.serialization.KotlinIr.IrStatementOrigin.getDefaultInstance(); memberAccess_ = org.jetbrains.kotlin.backend.common.serialization.KotlinIr.MemberAccessCommon.getDefaultInstance(); - descriptorReference_ = org.jetbrains.kotlin.backend.common.serialization.KotlinIr.DescriptorReference.getDefaultInstance(); + symbol_ = org.jetbrains.kotlin.backend.common.serialization.KotlinIr.IrSymbol.getDefaultInstance(); } private byte memoizedIsInitialized = -1; public final boolean isInitialized() { @@ -21351,6 +21344,10 @@ public final class KotlinIr { memoizedIsInitialized = 0; return false; } + if (!hasSymbol()) { + memoizedIsInitialized = 0; + return false; + } if (hasField()) { if (!getField().isInitialized()) { memoizedIsInitialized = 0; @@ -21379,11 +21376,9 @@ public final class KotlinIr { memoizedIsInitialized = 0; return false; } - if (hasDescriptorReference()) { - if (!getDescriptorReference().isInitialized()) { - memoizedIsInitialized = 0; - return false; - } + if (!getSymbol().isInitialized()) { + memoizedIsInitialized = 0; + return false; } memoizedIsInitialized = 1; return true; @@ -21408,7 +21403,7 @@ public final class KotlinIr { output.writeMessage(5, memberAccess_); } if (((bitField0_ & 0x00000020) == 0x00000020)) { - output.writeMessage(6, descriptorReference_); + output.writeMessage(6, symbol_); } output.writeRawBytes(unknownFields); } @@ -21441,7 +21436,7 @@ public final class KotlinIr { } if (((bitField0_ & 0x00000020) == 0x00000020)) { size += org.jetbrains.kotlin.protobuf.CodedOutputStream - .computeMessageSize(6, descriptorReference_); + .computeMessageSize(6, symbol_); } size += unknownFields.size(); memoizedSerializedSize = size; @@ -21547,7 +21542,7 @@ public final class KotlinIr { bitField0_ = (bitField0_ & ~0x00000008); memberAccess_ = org.jetbrains.kotlin.backend.common.serialization.KotlinIr.MemberAccessCommon.getDefaultInstance(); bitField0_ = (bitField0_ & ~0x00000010); - descriptorReference_ = org.jetbrains.kotlin.backend.common.serialization.KotlinIr.DescriptorReference.getDefaultInstance(); + symbol_ = org.jetbrains.kotlin.backend.common.serialization.KotlinIr.IrSymbol.getDefaultInstance(); bitField0_ = (bitField0_ & ~0x00000020); return this; } @@ -21595,7 +21590,7 @@ public final class KotlinIr { if (((from_bitField0_ & 0x00000020) == 0x00000020)) { to_bitField0_ |= 0x00000020; } - result.descriptorReference_ = descriptorReference_; + result.symbol_ = symbol_; result.bitField0_ = to_bitField0_; return result; } @@ -21617,8 +21612,8 @@ public final class KotlinIr { if (other.hasMemberAccess()) { mergeMemberAccess(other.getMemberAccess()); } - if (other.hasDescriptorReference()) { - mergeDescriptorReference(other.getDescriptorReference()); + if (other.hasSymbol()) { + mergeSymbol(other.getSymbol()); } setUnknownFields( getUnknownFields().concat(other.unknownFields)); @@ -21630,6 +21625,10 @@ public final class KotlinIr { return false; } + if (!hasSymbol()) { + + return false; + } if (hasField()) { if (!getField().isInitialized()) { @@ -21658,11 +21657,9 @@ public final class KotlinIr { return false; } - if (hasDescriptorReference()) { - if (!getDescriptorReference().isInitialized()) { - - return false; - } + if (!getSymbol().isInitialized()) { + + return false; } return true; } @@ -21986,85 +21983,61 @@ public final class KotlinIr { return this; } - private org.jetbrains.kotlin.backend.common.serialization.KotlinIr.DescriptorReference descriptorReference_ = org.jetbrains.kotlin.backend.common.serialization.KotlinIr.DescriptorReference.getDefaultInstance(); + private org.jetbrains.kotlin.backend.common.serialization.KotlinIr.IrSymbol symbol_ = org.jetbrains.kotlin.backend.common.serialization.KotlinIr.IrSymbol.getDefaultInstance(); /** - * optional .org.jetbrains.kotlin.backend.common.serialization.DescriptorReference descriptor_reference = 6; - * - *
-       * IrProperty doesn't have a symbol at all. Preserve this rudiment for now.
-       * 
+ * required .org.jetbrains.kotlin.backend.common.serialization.IrSymbol symbol = 6; */ - public boolean hasDescriptorReference() { + public boolean hasSymbol() { return ((bitField0_ & 0x00000020) == 0x00000020); } /** - * optional .org.jetbrains.kotlin.backend.common.serialization.DescriptorReference descriptor_reference = 6; - * - *
-       * IrProperty doesn't have a symbol at all. Preserve this rudiment for now.
-       * 
+ * required .org.jetbrains.kotlin.backend.common.serialization.IrSymbol symbol = 6; */ - public org.jetbrains.kotlin.backend.common.serialization.KotlinIr.DescriptorReference getDescriptorReference() { - return descriptorReference_; + public org.jetbrains.kotlin.backend.common.serialization.KotlinIr.IrSymbol getSymbol() { + return symbol_; } /** - * optional .org.jetbrains.kotlin.backend.common.serialization.DescriptorReference descriptor_reference = 6; - * - *
-       * IrProperty doesn't have a symbol at all. Preserve this rudiment for now.
-       * 
+ * required .org.jetbrains.kotlin.backend.common.serialization.IrSymbol symbol = 6; */ - public Builder setDescriptorReference(org.jetbrains.kotlin.backend.common.serialization.KotlinIr.DescriptorReference value) { + public Builder setSymbol(org.jetbrains.kotlin.backend.common.serialization.KotlinIr.IrSymbol value) { if (value == null) { throw new NullPointerException(); } - descriptorReference_ = value; + symbol_ = value; bitField0_ |= 0x00000020; return this; } /** - * optional .org.jetbrains.kotlin.backend.common.serialization.DescriptorReference descriptor_reference = 6; - * - *
-       * IrProperty doesn't have a symbol at all. Preserve this rudiment for now.
-       * 
+ * required .org.jetbrains.kotlin.backend.common.serialization.IrSymbol symbol = 6; */ - public Builder setDescriptorReference( - org.jetbrains.kotlin.backend.common.serialization.KotlinIr.DescriptorReference.Builder builderForValue) { - descriptorReference_ = builderForValue.build(); + public Builder setSymbol( + org.jetbrains.kotlin.backend.common.serialization.KotlinIr.IrSymbol.Builder builderForValue) { + symbol_ = builderForValue.build(); bitField0_ |= 0x00000020; return this; } /** - * optional .org.jetbrains.kotlin.backend.common.serialization.DescriptorReference descriptor_reference = 6; - * - *
-       * IrProperty doesn't have a symbol at all. Preserve this rudiment for now.
-       * 
+ * required .org.jetbrains.kotlin.backend.common.serialization.IrSymbol symbol = 6; */ - public Builder mergeDescriptorReference(org.jetbrains.kotlin.backend.common.serialization.KotlinIr.DescriptorReference value) { + public Builder mergeSymbol(org.jetbrains.kotlin.backend.common.serialization.KotlinIr.IrSymbol value) { if (((bitField0_ & 0x00000020) == 0x00000020) && - descriptorReference_ != org.jetbrains.kotlin.backend.common.serialization.KotlinIr.DescriptorReference.getDefaultInstance()) { - descriptorReference_ = - org.jetbrains.kotlin.backend.common.serialization.KotlinIr.DescriptorReference.newBuilder(descriptorReference_).mergeFrom(value).buildPartial(); + symbol_ != org.jetbrains.kotlin.backend.common.serialization.KotlinIr.IrSymbol.getDefaultInstance()) { + symbol_ = + org.jetbrains.kotlin.backend.common.serialization.KotlinIr.IrSymbol.newBuilder(symbol_).mergeFrom(value).buildPartial(); } else { - descriptorReference_ = value; + symbol_ = value; } bitField0_ |= 0x00000020; return this; } /** - * optional .org.jetbrains.kotlin.backend.common.serialization.DescriptorReference descriptor_reference = 6; - * - *
-       * IrProperty doesn't have a symbol at all. Preserve this rudiment for now.
-       * 
+ * required .org.jetbrains.kotlin.backend.common.serialization.IrSymbol symbol = 6; */ - public Builder clearDescriptorReference() { - descriptorReference_ = org.jetbrains.kotlin.backend.common.serialization.KotlinIr.DescriptorReference.getDefaultInstance(); + public Builder clearSymbol() { + symbol_ = org.jetbrains.kotlin.backend.common.serialization.KotlinIr.IrSymbol.getDefaultInstance(); bitField0_ = (bitField0_ & ~0x00000020); return this; @@ -50552,21 +50525,13 @@ public final class KotlinIr { org.jetbrains.kotlin.protobuf.MessageLiteOrBuilder { /** - * optional .org.jetbrains.kotlin.backend.common.serialization.DescriptorReference descriptor_reference = 1; - * - *
-     * IrProperty doesn't have a symbol at all. Preserve this rudiment for now.
-     * 
+ * required .org.jetbrains.kotlin.backend.common.serialization.IrSymbol symbol = 1; */ - boolean hasDescriptorReference(); + boolean hasSymbol(); /** - * optional .org.jetbrains.kotlin.backend.common.serialization.DescriptorReference descriptor_reference = 1; - * - *
-     * IrProperty doesn't have a symbol at all. Preserve this rudiment for now.
-     * 
+ * required .org.jetbrains.kotlin.backend.common.serialization.IrSymbol symbol = 1; */ - org.jetbrains.kotlin.backend.common.serialization.KotlinIr.DescriptorReference getDescriptorReference(); + org.jetbrains.kotlin.backend.common.serialization.KotlinIr.IrSymbol getSymbol(); /** * required .org.jetbrains.kotlin.backend.common.serialization.String name = 2; @@ -50718,14 +50683,14 @@ public final class KotlinIr { break; } case 10: { - org.jetbrains.kotlin.backend.common.serialization.KotlinIr.DescriptorReference.Builder subBuilder = null; + org.jetbrains.kotlin.backend.common.serialization.KotlinIr.IrSymbol.Builder subBuilder = null; if (((bitField0_ & 0x00000001) == 0x00000001)) { - subBuilder = descriptorReference_.toBuilder(); + subBuilder = symbol_.toBuilder(); } - descriptorReference_ = input.readMessage(org.jetbrains.kotlin.backend.common.serialization.KotlinIr.DescriptorReference.PARSER, extensionRegistry); + symbol_ = input.readMessage(org.jetbrains.kotlin.backend.common.serialization.KotlinIr.IrSymbol.PARSER, extensionRegistry); if (subBuilder != null) { - subBuilder.mergeFrom(descriptorReference_); - descriptorReference_ = subBuilder.buildPartial(); + subBuilder.mergeFrom(symbol_); + symbol_ = subBuilder.buildPartial(); } bitField0_ |= 0x00000001; break; @@ -50866,27 +50831,19 @@ public final class KotlinIr { } private int bitField0_; - public static final int DESCRIPTOR_REFERENCE_FIELD_NUMBER = 1; - private org.jetbrains.kotlin.backend.common.serialization.KotlinIr.DescriptorReference descriptorReference_; + public static final int SYMBOL_FIELD_NUMBER = 1; + private org.jetbrains.kotlin.backend.common.serialization.KotlinIr.IrSymbol symbol_; /** - * optional .org.jetbrains.kotlin.backend.common.serialization.DescriptorReference descriptor_reference = 1; - * - *
-     * IrProperty doesn't have a symbol at all. Preserve this rudiment for now.
-     * 
+ * required .org.jetbrains.kotlin.backend.common.serialization.IrSymbol symbol = 1; */ - public boolean hasDescriptorReference() { + public boolean hasSymbol() { return ((bitField0_ & 0x00000001) == 0x00000001); } /** - * optional .org.jetbrains.kotlin.backend.common.serialization.DescriptorReference descriptor_reference = 1; - * - *
-     * IrProperty doesn't have a symbol at all. Preserve this rudiment for now.
-     * 
+ * required .org.jetbrains.kotlin.backend.common.serialization.IrSymbol symbol = 1; */ - public org.jetbrains.kotlin.backend.common.serialization.KotlinIr.DescriptorReference getDescriptorReference() { - return descriptorReference_; + public org.jetbrains.kotlin.backend.common.serialization.KotlinIr.IrSymbol getSymbol() { + return symbol_; } public static final int NAME_FIELD_NUMBER = 2; @@ -51055,7 +51012,7 @@ public final class KotlinIr { } private void initFields() { - descriptorReference_ = org.jetbrains.kotlin.backend.common.serialization.KotlinIr.DescriptorReference.getDefaultInstance(); + symbol_ = org.jetbrains.kotlin.backend.common.serialization.KotlinIr.IrSymbol.getDefaultInstance(); name_ = org.jetbrains.kotlin.backend.common.serialization.KotlinIr.String.getDefaultInstance(); visibility_ = org.jetbrains.kotlin.backend.common.serialization.KotlinIr.Visibility.getDefaultInstance(); modality_ = org.jetbrains.kotlin.backend.common.serialization.KotlinIr.ModalityKind.FINAL_MODALITY; @@ -51074,6 +51031,10 @@ public final class KotlinIr { if (isInitialized == 1) return true; if (isInitialized == 0) return false; + if (!hasSymbol()) { + memoizedIsInitialized = 0; + return false; + } if (!hasName()) { memoizedIsInitialized = 0; return false; @@ -51106,11 +51067,9 @@ public final class KotlinIr { memoizedIsInitialized = 0; return false; } - if (hasDescriptorReference()) { - if (!getDescriptorReference().isInitialized()) { - memoizedIsInitialized = 0; - return false; - } + if (!getSymbol().isInitialized()) { + memoizedIsInitialized = 0; + return false; } if (!getName().isInitialized()) { memoizedIsInitialized = 0; @@ -51146,7 +51105,7 @@ public final class KotlinIr { throws java.io.IOException { getSerializedSize(); if (((bitField0_ & 0x00000001) == 0x00000001)) { - output.writeMessage(1, descriptorReference_); + output.writeMessage(1, symbol_); } if (((bitField0_ & 0x00000002) == 0x00000002)) { output.writeMessage(2, name_); @@ -51192,7 +51151,7 @@ public final class KotlinIr { size = 0; if (((bitField0_ & 0x00000001) == 0x00000001)) { size += org.jetbrains.kotlin.protobuf.CodedOutputStream - .computeMessageSize(1, descriptorReference_); + .computeMessageSize(1, symbol_); } if (((bitField0_ & 0x00000002) == 0x00000002)) { size += org.jetbrains.kotlin.protobuf.CodedOutputStream @@ -51332,7 +51291,7 @@ public final class KotlinIr { public Builder clear() { super.clear(); - descriptorReference_ = org.jetbrains.kotlin.backend.common.serialization.KotlinIr.DescriptorReference.getDefaultInstance(); + symbol_ = org.jetbrains.kotlin.backend.common.serialization.KotlinIr.IrSymbol.getDefaultInstance(); bitField0_ = (bitField0_ & ~0x00000001); name_ = org.jetbrains.kotlin.backend.common.serialization.KotlinIr.String.getDefaultInstance(); bitField0_ = (bitField0_ & ~0x00000002); @@ -51382,7 +51341,7 @@ public final class KotlinIr { if (((from_bitField0_ & 0x00000001) == 0x00000001)) { to_bitField0_ |= 0x00000001; } - result.descriptorReference_ = descriptorReference_; + result.symbol_ = symbol_; if (((from_bitField0_ & 0x00000002) == 0x00000002)) { to_bitField0_ |= 0x00000002; } @@ -51433,8 +51392,8 @@ public final class KotlinIr { public Builder mergeFrom(org.jetbrains.kotlin.backend.common.serialization.KotlinIr.IrProperty other) { if (other == org.jetbrains.kotlin.backend.common.serialization.KotlinIr.IrProperty.getDefaultInstance()) return this; - if (other.hasDescriptorReference()) { - mergeDescriptorReference(other.getDescriptorReference()); + if (other.hasSymbol()) { + mergeSymbol(other.getSymbol()); } if (other.hasName()) { mergeName(other.getName()); @@ -51475,6 +51434,10 @@ public final class KotlinIr { } public final boolean isInitialized() { + if (!hasSymbol()) { + + return false; + } if (!hasName()) { return false; @@ -51507,11 +51470,9 @@ public final class KotlinIr { return false; } - if (hasDescriptorReference()) { - if (!getDescriptorReference().isInitialized()) { - - return false; - } + if (!getSymbol().isInitialized()) { + + return false; } if (!getName().isInitialized()) { @@ -51561,85 +51522,61 @@ public final class KotlinIr { } private int bitField0_; - private org.jetbrains.kotlin.backend.common.serialization.KotlinIr.DescriptorReference descriptorReference_ = org.jetbrains.kotlin.backend.common.serialization.KotlinIr.DescriptorReference.getDefaultInstance(); + private org.jetbrains.kotlin.backend.common.serialization.KotlinIr.IrSymbol symbol_ = org.jetbrains.kotlin.backend.common.serialization.KotlinIr.IrSymbol.getDefaultInstance(); /** - * optional .org.jetbrains.kotlin.backend.common.serialization.DescriptorReference descriptor_reference = 1; - * - *
-       * IrProperty doesn't have a symbol at all. Preserve this rudiment for now.
-       * 
+ * required .org.jetbrains.kotlin.backend.common.serialization.IrSymbol symbol = 1; */ - public boolean hasDescriptorReference() { + public boolean hasSymbol() { return ((bitField0_ & 0x00000001) == 0x00000001); } /** - * optional .org.jetbrains.kotlin.backend.common.serialization.DescriptorReference descriptor_reference = 1; - * - *
-       * IrProperty doesn't have a symbol at all. Preserve this rudiment for now.
-       * 
+ * required .org.jetbrains.kotlin.backend.common.serialization.IrSymbol symbol = 1; */ - public org.jetbrains.kotlin.backend.common.serialization.KotlinIr.DescriptorReference getDescriptorReference() { - return descriptorReference_; + public org.jetbrains.kotlin.backend.common.serialization.KotlinIr.IrSymbol getSymbol() { + return symbol_; } /** - * optional .org.jetbrains.kotlin.backend.common.serialization.DescriptorReference descriptor_reference = 1; - * - *
-       * IrProperty doesn't have a symbol at all. Preserve this rudiment for now.
-       * 
+ * required .org.jetbrains.kotlin.backend.common.serialization.IrSymbol symbol = 1; */ - public Builder setDescriptorReference(org.jetbrains.kotlin.backend.common.serialization.KotlinIr.DescriptorReference value) { + public Builder setSymbol(org.jetbrains.kotlin.backend.common.serialization.KotlinIr.IrSymbol value) { if (value == null) { throw new NullPointerException(); } - descriptorReference_ = value; + symbol_ = value; bitField0_ |= 0x00000001; return this; } /** - * optional .org.jetbrains.kotlin.backend.common.serialization.DescriptorReference descriptor_reference = 1; - * - *
-       * IrProperty doesn't have a symbol at all. Preserve this rudiment for now.
-       * 
+ * required .org.jetbrains.kotlin.backend.common.serialization.IrSymbol symbol = 1; */ - public Builder setDescriptorReference( - org.jetbrains.kotlin.backend.common.serialization.KotlinIr.DescriptorReference.Builder builderForValue) { - descriptorReference_ = builderForValue.build(); + public Builder setSymbol( + org.jetbrains.kotlin.backend.common.serialization.KotlinIr.IrSymbol.Builder builderForValue) { + symbol_ = builderForValue.build(); bitField0_ |= 0x00000001; return this; } /** - * optional .org.jetbrains.kotlin.backend.common.serialization.DescriptorReference descriptor_reference = 1; - * - *
-       * IrProperty doesn't have a symbol at all. Preserve this rudiment for now.
-       * 
+ * required .org.jetbrains.kotlin.backend.common.serialization.IrSymbol symbol = 1; */ - public Builder mergeDescriptorReference(org.jetbrains.kotlin.backend.common.serialization.KotlinIr.DescriptorReference value) { + public Builder mergeSymbol(org.jetbrains.kotlin.backend.common.serialization.KotlinIr.IrSymbol value) { if (((bitField0_ & 0x00000001) == 0x00000001) && - descriptorReference_ != org.jetbrains.kotlin.backend.common.serialization.KotlinIr.DescriptorReference.getDefaultInstance()) { - descriptorReference_ = - org.jetbrains.kotlin.backend.common.serialization.KotlinIr.DescriptorReference.newBuilder(descriptorReference_).mergeFrom(value).buildPartial(); + symbol_ != org.jetbrains.kotlin.backend.common.serialization.KotlinIr.IrSymbol.getDefaultInstance()) { + symbol_ = + org.jetbrains.kotlin.backend.common.serialization.KotlinIr.IrSymbol.newBuilder(symbol_).mergeFrom(value).buildPartial(); } else { - descriptorReference_ = value; + symbol_ = value; } bitField0_ |= 0x00000001; return this; } /** - * optional .org.jetbrains.kotlin.backend.common.serialization.DescriptorReference descriptor_reference = 1; - * - *
-       * IrProperty doesn't have a symbol at all. Preserve this rudiment for now.
-       * 
+ * required .org.jetbrains.kotlin.backend.common.serialization.IrSymbol symbol = 1; */ - public Builder clearDescriptorReference() { - descriptorReference_ = org.jetbrains.kotlin.backend.common.serialization.KotlinIr.DescriptorReference.getDefaultInstance(); + public Builder clearSymbol() { + symbol_ = org.jetbrains.kotlin.backend.common.serialization.KotlinIr.IrSymbol.getDefaultInstance(); bitField0_ = (bitField0_ & ~0x00000001); return this; diff --git a/compiler/ir/serialization.common/src/org/jetbrains/kotlin/backend/common/serialization/KotlinIrLinker.kt b/compiler/ir/serialization.common/src/org/jetbrains/kotlin/backend/common/serialization/KotlinIrLinker.kt index 7e88c68c3d0..5fc7649da96 100644 --- a/compiler/ir/serialization.common/src/org/jetbrains/kotlin/backend/common/serialization/KotlinIrLinker.kt +++ b/compiler/ir/serialization.common/src/org/jetbrains/kotlin/backend/common/serialization/KotlinIrLinker.kt @@ -125,6 +125,10 @@ abstract class KotlinIrLinker( IrValueParameterSymbolImpl( descriptor as ParameterDescriptor? ?: WrappedReceiverParameterDescriptor() ) + KotlinIr.IrSymbolKind.PROPERTY_SYMBOL -> + symbolTable.referenceProperty( + descriptor as PropertyDescriptor? ?: WrappedPropertyDescriptor() + ) else -> TODO("Unexpected classifier symbol kind: ${proto.kind}") } @@ -365,14 +369,6 @@ abstract class KotlinIrLinker( return symbol.owner as IrDeclaration } - override fun findDeserializedDeclaration(propertyDescriptor: PropertyDescriptor): IrProperty? { - val topLevelDesecriptor = findDeserializedDeclarationForDescriptor(propertyDescriptor) - if (topLevelDesecriptor == null) return null - - return symbolTable.propertyTable[propertyDescriptor] - ?: error("findDeserializedDeclaration: property descriptor $propertyDescriptor} is not present in propertyTable after deserialization}") - } - // TODO: This is Native specific. Eliminate me. override fun declareForwardDeclarations() { if (forwardModuleDescriptor == null) return