IR: add IrClass.getInlineClassRepresentation, serialize/deserialize it

The change in FirDeclarationUtil is needed because in case of unsigned
types loaded from the standard library, the primary constructor for some
reason is not the first, but the second in the list of constructors.
This commit is contained in:
Alexander Udalov
2021-03-30 18:16:37 +02:00
parent 4c7f207309
commit 54befa769f
33 changed files with 950 additions and 59 deletions
@@ -10,6 +10,7 @@ import java.util.Collections
import org.jetbrains.kotlin.descriptors.ClassDescriptor
import org.jetbrains.kotlin.descriptors.ClassKind
import org.jetbrains.kotlin.descriptors.DescriptorVisibility
import org.jetbrains.kotlin.descriptors.InlineClassRepresentation
import org.jetbrains.kotlin.descriptors.Modality
import org.jetbrains.kotlin.descriptors.SourceElement
import org.jetbrains.kotlin.ir.ObsoleteDescriptorBasedAPI
@@ -27,6 +28,7 @@ import org.jetbrains.kotlin.ir.expressions.IrConstructorCall
import org.jetbrains.kotlin.ir.symbols.IrClassSymbol
import org.jetbrains.kotlin.ir.symbols.IrTypeParameterSymbol
import org.jetbrains.kotlin.ir.symbols.IrValueParameterSymbol
import org.jetbrains.kotlin.ir.types.IrSimpleType
import org.jetbrains.kotlin.ir.types.IrType
import org.jetbrains.kotlin.name.Name
@@ -157,5 +159,16 @@ internal class PersistentIrClass(
}
}
override var inlineClassRepresentationField: InlineClassRepresentation<IrSimpleType>? = null
override var inlineClassRepresentation: InlineClassRepresentation<IrSimpleType>?
get() = getCarrier().inlineClassRepresentationField
set(v) {
if (inlineClassRepresentation !== v) {
setCarrier()
inlineClassRepresentationField = v
}
}
override var attributeOwnerId: IrAttributeContainer = this
}
@@ -6,6 +6,7 @@
package org.jetbrains.kotlin.ir.declarations.persistent.carriers
import org.jetbrains.kotlin.descriptors.DescriptorVisibility
import org.jetbrains.kotlin.descriptors.InlineClassRepresentation
import org.jetbrains.kotlin.descriptors.Modality
import org.jetbrains.kotlin.ir.declarations.IrDeclarationOrigin
import org.jetbrains.kotlin.ir.declarations.IrTypeParameter
@@ -14,6 +15,7 @@ import org.jetbrains.kotlin.ir.expressions.IrConstructorCall
import org.jetbrains.kotlin.ir.symbols.IrSymbol
import org.jetbrains.kotlin.ir.symbols.IrTypeParameterSymbol
import org.jetbrains.kotlin.ir.symbols.IrValueParameterSymbol
import org.jetbrains.kotlin.ir.types.IrSimpleType
import org.jetbrains.kotlin.ir.types.IrType
// Auto-generated by compiler/ir/ir.tree.persistent/generator/src/org/jetbrains/kotlin/ir/persistentIrGenerator/Main.kt. DO NOT EDIT!
@@ -26,6 +28,7 @@ internal interface ClassCarrier : DeclarationCarrier{
val typeParametersField: List<IrTypeParameter>
val typeParametersSymbolField: List<IrTypeParameterSymbol>
val superTypesField: List<IrType>
val inlineClassRepresentationField: InlineClassRepresentation<IrSimpleType>?
override fun clone(): ClassCarrier {
return ClassCarrierImpl(
@@ -37,7 +40,8 @@ internal interface ClassCarrier : DeclarationCarrier{
visibilityField,
modalityField,
typeParametersSymbolField,
superTypesField
superTypesField,
inlineClassRepresentationField
)
}
}
@@ -51,7 +55,8 @@ internal class ClassCarrierImpl(
override val visibilityField: DescriptorVisibility,
override val modalityField: Modality,
override val typeParametersSymbolField: List<IrTypeParameterSymbol>,
override val superTypesField: List<IrType>
override val superTypesField: List<IrType>,
override val inlineClassRepresentationField: InlineClassRepresentation<IrSimpleType>?
) : ClassCarrier {
override val thisReceiverField: IrValueParameter?
@@ -7,6 +7,7 @@ package org.jetbrains.kotlin.ir.serialization
import org.jetbrains.kotlin.backend.common.serialization.codedInputStream
import org.jetbrains.kotlin.backend.common.serialization.proto.IrConstructorCall as ProtoIrConstructorCall
import org.jetbrains.kotlin.backend.common.serialization.proto.IrInlineClassRepresentation as ProtoIrInlineClassRepresentation
import org.jetbrains.kotlin.backend.common.serialization.proto.IrVariable as ProtoIrVariable
import org.jetbrains.kotlin.backend.common.serialization.proto.PirAnonymousInitializerCarrier
import org.jetbrains.kotlin.backend.common.serialization.proto.PirClassCarrier
@@ -21,6 +22,7 @@ import org.jetbrains.kotlin.backend.common.serialization.proto.PirTypeAliasCarri
import org.jetbrains.kotlin.backend.common.serialization.proto.PirTypeParameterCarrier
import org.jetbrains.kotlin.backend.common.serialization.proto.PirValueParameterCarrier
import org.jetbrains.kotlin.descriptors.DescriptorVisibility
import org.jetbrains.kotlin.descriptors.InlineClassRepresentation
import org.jetbrains.kotlin.descriptors.Modality
import org.jetbrains.kotlin.ir.declarations.IrDeclarationOrigin
import org.jetbrains.kotlin.ir.declarations.IrVariable
@@ -59,6 +61,7 @@ import org.jetbrains.kotlin.ir.symbols.IrSimpleFunctionSymbol
import org.jetbrains.kotlin.ir.symbols.IrSymbol
import org.jetbrains.kotlin.ir.symbols.IrTypeParameterSymbol
import org.jetbrains.kotlin.ir.symbols.IrValueParameterSymbol
import org.jetbrains.kotlin.ir.types.IrSimpleType
import org.jetbrains.kotlin.ir.types.IrType
import org.jetbrains.kotlin.protobuf.ExtensionRegistryLite
@@ -102,6 +105,8 @@ internal abstract class IrCarrierDeserializer {
abstract fun deserializeModality(proto: Long): Modality
abstract fun deserializeInlineClassRepresentation(proto: ProtoIrInlineClassRepresentation): InlineClassRepresentation<IrSimpleType>
abstract fun deserializeIsExternalClass(proto: Long): Boolean
abstract fun deserializeIsExternalField(proto: Long): Boolean
@@ -132,7 +137,8 @@ internal abstract class IrCarrierDeserializer {
deserializeVisibility(proto.flags),
deserializeModality(proto.flags),
proto.typeParametersList.map { deserializeTypeParameter(it) },
proto.superTypesList.map { deserializeSuperType(it) }
proto.superTypesList.map { deserializeSuperType(it) },
if (proto.hasInlineClassRepresentation()) deserializeInlineClassRepresentation(proto.inlineClassRepresentation) else null
)
}
@@ -6,6 +6,7 @@
package org.jetbrains.kotlin.ir.serialization
import org.jetbrains.kotlin.backend.common.serialization.proto.IrConstructorCall as ProtoIrConstructorCall
import org.jetbrains.kotlin.backend.common.serialization.proto.IrInlineClassRepresentation as ProtoIrInlineClassRepresentation
import org.jetbrains.kotlin.backend.common.serialization.proto.IrVariable as ProtoIrVariable
import org.jetbrains.kotlin.backend.common.serialization.proto.PirAnonymousInitializerCarrier
import org.jetbrains.kotlin.backend.common.serialization.proto.PirClassCarrier
@@ -20,6 +21,7 @@ import org.jetbrains.kotlin.backend.common.serialization.proto.PirTypeAliasCarri
import org.jetbrains.kotlin.backend.common.serialization.proto.PirTypeParameterCarrier
import org.jetbrains.kotlin.backend.common.serialization.proto.PirValueParameterCarrier
import org.jetbrains.kotlin.descriptors.DescriptorVisibility
import org.jetbrains.kotlin.descriptors.InlineClassRepresentation
import org.jetbrains.kotlin.descriptors.Modality
import org.jetbrains.kotlin.ir.declarations.IrDeclarationOrigin
import org.jetbrains.kotlin.ir.declarations.IrVariable
@@ -46,6 +48,7 @@ import org.jetbrains.kotlin.ir.symbols.IrSimpleFunctionSymbol
import org.jetbrains.kotlin.ir.symbols.IrSymbol
import org.jetbrains.kotlin.ir.symbols.IrTypeParameterSymbol
import org.jetbrains.kotlin.ir.symbols.IrValueParameterSymbol
import org.jetbrains.kotlin.ir.types.IrSimpleType
import org.jetbrains.kotlin.ir.types.IrType
// Auto-generated by compiler/ir/ir.tree.persistent/generator/src/org/jetbrains/kotlin/ir/persistentIrGenerator/Main.kt. DO NOT EDIT!
@@ -88,6 +91,8 @@ internal abstract class IrCarrierSerializer {
abstract fun serializeModality(value: Modality): Long
abstract fun serializeInlineClassRepresentation(value: InlineClassRepresentation<IrSimpleType>): ProtoIrInlineClassRepresentation
abstract fun serializeIsExternalClass(value: Boolean): Long
abstract fun serializeIsExternalField(value: Boolean): Long
@@ -116,6 +121,7 @@ internal abstract class IrCarrierSerializer {
proto.setFlags(serializeVisibility(carrier.visibilityField) or serializeModality(carrier.modalityField))
proto.addAllTypeParameters(carrier.typeParametersSymbolField.map { serializeTypeParameter(it) })
proto.addAllSuperTypes(carrier.superTypesField.map { serializeSuperType(it) })
carrier.inlineClassRepresentationField?.let { proto.setInlineClassRepresentation(serializeInlineClassRepresentation(it)) }
return proto.build().toByteArray()
}
@@ -17,6 +17,11 @@ internal fun PersistentIrGenerator.generateClass() {
)
val superTypesField = Field("superTypes", +"List<" + import("IrType", "org.jetbrains.kotlin.ir.types") + ">", superTypeListProto)
val modalityField = Field("modality", descriptorType("Modality"), modalityProto)
val inlineClassRepresentationField = Field(
"inlineClassRepresentation",
descriptorType("InlineClassRepresentation") + "<" + import("IrSimpleType", "org.jetbrains.kotlin.ir.types") + ">?",
inlineClassRepresentationProto
)
writeFile("PersistentIrClass.kt", renderFile("org.jetbrains.kotlin.ir.declarations.persistent") {
lines(
@@ -72,6 +77,7 @@ internal fun PersistentIrGenerator.generateClass() {
superTypesField.toPersistentField(+"emptyList()"),
+"override var metadata: " + MetadataSource + "? = null",
modalityField.toPersistentField(+"modality"),
inlineClassRepresentationField.toPersistentField(+"null"),
+"override var attributeOwnerId: " + IrAttributeContainer + " = this",
),
id,
@@ -86,6 +92,7 @@ internal fun PersistentIrGenerator.generateClass() {
modalityField,
typeParametersField,
superTypesField,
inlineClassRepresentationField,
)()
})
@@ -96,5 +103,6 @@ internal fun PersistentIrGenerator.generateClass() {
modalityField,
typeParametersField,
superTypesField,
inlineClassRepresentationField,
)
}
}
@@ -3,11 +3,11 @@
* Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file.
*/
@file:Suppress("MemberVisibilityCanBePrivate")
package org.jetbrains.kotlin.ir.persistentIrGenerator
import java.io.File
import java.lang.IllegalStateException
import java.lang.StringBuilder
internal interface R {
fun text(t: String): R
@@ -156,6 +156,11 @@ internal object PersistentIrGenerator {
val visibilityProto = Proto(null, "visibility", +"Long", DescriptorVisibility)
val modalityProto = Proto(null, "modality", +"Long", descriptorType("Modality"))
val inlineClassRepresentationProto = Proto(
"IrInlineClassRepresentation", "inlineClassRepresentation",
import("IrInlineClassRepresentation", protoPackage, "ProtoIrInlineClassRepresentation"),
descriptorType("InlineClassRepresentation") + "<" + import("IrSimpleType", "org.jetbrains.kotlin.ir.types") + ">"
)
val isExternalClassProto = Proto(null, "isExternalClass", +"Long", +"Boolean")
val isExternalFieldProto = Proto(null, "isExternalField", +"Long", +"Boolean")
@@ -180,6 +185,7 @@ internal object PersistentIrGenerator {
variableProto,
visibilityProto,
modalityProto,
inlineClassRepresentationProto,
isExternalClassProto,
isExternalFieldProto,
isExternalFunctionProto,
@@ -8,8 +8,8 @@ package org.jetbrains.kotlin.ir.serialization
import org.jetbrains.kotlin.backend.common.serialization.IrDeclarationDeserializer
import org.jetbrains.kotlin.backend.common.serialization.IrFlags
import org.jetbrains.kotlin.descriptors.DescriptorVisibility
import org.jetbrains.kotlin.descriptors.InlineClassRepresentation
import org.jetbrains.kotlin.descriptors.Modality
import org.jetbrains.kotlin.ir.UNDEFINED_OFFSET
import org.jetbrains.kotlin.ir.declarations.IrDeclarationOrigin
import org.jetbrains.kotlin.ir.declarations.IrVariable
import org.jetbrains.kotlin.ir.expressions.IrBlockBody
@@ -17,11 +17,12 @@ import org.jetbrains.kotlin.ir.expressions.IrBody
import org.jetbrains.kotlin.ir.expressions.IrConstructorCall
import org.jetbrains.kotlin.ir.expressions.IrExpressionBody
import org.jetbrains.kotlin.ir.symbols.*
import org.jetbrains.kotlin.ir.types.IrSimpleType
import org.jetbrains.kotlin.ir.types.IrType
import org.jetbrains.kotlin.serialization.deserialization.ProtoEnumFlags
import org.jetbrains.kotlin.serialization.deserialization.descriptorVisibility
import org.jetbrains.kotlin.backend.common.serialization.proto.IrConstructorCall as ProtoIrConstructorCall
import org.jetbrains.kotlin.backend.common.serialization.proto.IrInlineClassRepresentation as ProtoIrInlineClassRepresentation
import org.jetbrains.kotlin.backend.common.serialization.proto.IrVariable as ProtoIrVariable
internal class IrCarrierDeserializerImpl(
@@ -102,6 +103,10 @@ internal class IrCarrierDeserializerImpl(
return ProtoEnumFlags.modality(IrFlags.MODALITY.get(proto.toInt()))
}
override fun deserializeInlineClassRepresentation(proto: ProtoIrInlineClassRepresentation): InlineClassRepresentation<IrSimpleType> {
return declarationDeserializer.deserializeInlineClassRepresentation(proto)
}
override fun deserializeIsExternalClass(proto: Long): Boolean {
return IrFlags.IS_EXTERNAL_CLASS.get(proto.toInt())
}
@@ -117,4 +122,4 @@ internal class IrCarrierDeserializerImpl(
override fun deserializeIsExternalProperty(proto: Long): Boolean {
return IrFlags.IS_EXTERNAL_PROPERTY.get(proto.toInt())
}
}
}
@@ -8,6 +8,7 @@ package org.jetbrains.kotlin.ir.serialization
import org.jetbrains.kotlin.backend.common.serialization.IrFileSerializer
import org.jetbrains.kotlin.backend.common.serialization.IrFlags
import org.jetbrains.kotlin.descriptors.DescriptorVisibility
import org.jetbrains.kotlin.descriptors.InlineClassRepresentation
import org.jetbrains.kotlin.descriptors.Modality
import org.jetbrains.kotlin.ir.declarations.IrDeclarationOrigin
import org.jetbrains.kotlin.ir.declarations.IrVariable
@@ -16,12 +17,13 @@ import org.jetbrains.kotlin.ir.expressions.IrBody
import org.jetbrains.kotlin.ir.expressions.IrConstructorCall
import org.jetbrains.kotlin.ir.expressions.IrExpressionBody
import org.jetbrains.kotlin.ir.symbols.*
import org.jetbrains.kotlin.ir.types.IrSimpleType
import org.jetbrains.kotlin.ir.types.IrType
import org.jetbrains.kotlin.metadata.deserialization.Flags
import org.jetbrains.kotlin.serialization.deserialization.ProtoEnumFlags
import org.jetbrains.kotlin.serialization.deserialization.descriptorVisibility
import org.jetbrains.kotlin.backend.common.serialization.proto.IrConstructorCall as ProtoIrConstructorCall
import org.jetbrains.kotlin.backend.common.serialization.proto.IrInlineClassRepresentation as ProtoIrInlineClassRepresentation
import org.jetbrains.kotlin.backend.common.serialization.proto.IrVariable as ProtoIrVariable
internal class IrCarrierSerializerImpl(val fileSerializer: IrFileSerializer, val bodyIndex: (IrBody) -> Int) : IrCarrierSerializer() {
@@ -97,6 +99,10 @@ internal class IrCarrierSerializerImpl(val fileSerializer: IrFileSerializer, val
return Flags.MODALITY.toFlags(ProtoEnumFlags.modality(value)).toLong()
}
override fun serializeInlineClassRepresentation(value: InlineClassRepresentation<IrSimpleType>): ProtoIrInlineClassRepresentation {
return fileSerializer.serializeInlineClassRepresentation(value)
}
override fun serializeIsExternalClass(value: Boolean): Long {
return IrFlags.IS_EXTERNAL_CLASS.toFlags(value).toLong()
}
@@ -112,4 +118,4 @@ internal class IrCarrierSerializerImpl(val fileSerializer: IrFileSerializer, val
override fun serializeIsExternalProperty(value: Boolean): Long {
return IrFlags.IS_EXTERNAL_PROPERTY.toFlags(value).toLong()
}
}
}