JVM_IR KT-41214 emit PermittedSubclasses on JDK17+

This commit is contained in:
Dmitry Petrov
2021-10-08 09:57:05 +03:00
committed by TeamCityServer
parent dca4a8e722
commit 146f0f4904
41 changed files with 695 additions and 43 deletions
@@ -5,9 +5,23 @@
package org.jetbrains.kotlin.ir.declarations.persistent
import org.jetbrains.kotlin.descriptors.*
import java.util.ArrayList
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
import org.jetbrains.kotlin.ir.declarations.*
import org.jetbrains.kotlin.ir.declarations.IrAttributeContainer
import org.jetbrains.kotlin.ir.declarations.IrClass
import org.jetbrains.kotlin.ir.declarations.IrDeclaration
import org.jetbrains.kotlin.ir.declarations.IrDeclarationOrigin
import org.jetbrains.kotlin.ir.declarations.IrDeclarationParent
import org.jetbrains.kotlin.ir.declarations.IrTypeParameter
import org.jetbrains.kotlin.ir.declarations.IrValueParameter
import org.jetbrains.kotlin.ir.declarations.MetadataSource
import org.jetbrains.kotlin.ir.declarations.persistent.carriers.Carrier
import org.jetbrains.kotlin.ir.declarations.persistent.carriers.ClassCarrier
import org.jetbrains.kotlin.ir.expressions.IrConstructorCall
@@ -18,7 +32,6 @@ import org.jetbrains.kotlin.ir.types.IrSimpleType
import org.jetbrains.kotlin.ir.types.IrType
import org.jetbrains.kotlin.ir.util.IdSignature
import org.jetbrains.kotlin.name.Name
import java.util.*
// Auto-generated by compiler/ir/ir.tree.persistent/generator/src/org/jetbrains/kotlin/ir/persistentIrGenerator/Main.kt. DO NOT EDIT!
@@ -164,4 +177,15 @@ internal class PersistentIrClass(
}
override var attributeOwnerId: IrAttributeContainer = this
override var sealedSubclassesField: List<IrClassSymbol> = emptyList()
override var sealedSubclasses: List<IrClassSymbol>
get() = getCarrier().sealedSubclassesField
set(v) {
if (sealedSubclasses !== v) {
setCarrier()
sealedSubclassesField = v
}
}
}
@@ -12,6 +12,7 @@ import org.jetbrains.kotlin.ir.declarations.IrDeclarationOrigin
import org.jetbrains.kotlin.ir.declarations.IrTypeParameter
import org.jetbrains.kotlin.ir.declarations.IrValueParameter
import org.jetbrains.kotlin.ir.expressions.IrConstructorCall
import org.jetbrains.kotlin.ir.symbols.IrClassSymbol
import org.jetbrains.kotlin.ir.symbols.IrSymbol
import org.jetbrains.kotlin.ir.symbols.IrTypeParameterSymbol
import org.jetbrains.kotlin.ir.symbols.IrValueParameterSymbol
@@ -29,6 +30,7 @@ internal interface ClassCarrier : DeclarationCarrier{
val typeParametersSymbolField: List<IrTypeParameterSymbol>
val superTypesField: List<IrType>
val inlineClassRepresentationField: InlineClassRepresentation<IrSimpleType>?
val sealedSubclassesField: List<IrClassSymbol>
override fun clone(): ClassCarrier {
return ClassCarrierImpl(
@@ -41,7 +43,8 @@ internal interface ClassCarrier : DeclarationCarrier{
modalityField,
typeParametersSymbolField,
superTypesField,
inlineClassRepresentationField
inlineClassRepresentationField,
sealedSubclassesField
)
}
}
@@ -56,7 +59,8 @@ internal class ClassCarrierImpl(
override val modalityField: Modality,
override val typeParametersSymbolField: List<IrTypeParameterSymbol>,
override val superTypesField: List<IrType>,
override val inlineClassRepresentationField: InlineClassRepresentation<IrSimpleType>?
override val inlineClassRepresentationField: InlineClassRepresentation<IrSimpleType>?,
override val sealedSubclassesField: List<IrClassSymbol>
) : ClassCarrier {
override val thisReceiverField: IrValueParameter?
@@ -87,6 +87,8 @@ internal abstract class IrCarrierDeserializer {
abstract fun deserializeSuperType(proto: Int): IrType
abstract fun deserializeSealedSubclass(proto: Long): IrClassSymbol
abstract fun deserializeType(proto: Int): IrType
abstract fun deserializeClass(proto: Long): IrClassSymbol
@@ -138,7 +140,8 @@ internal abstract class IrCarrierDeserializer {
deserializeModality(proto.flags),
proto.typeParametersList.map { deserializeTypeParameter(it) },
proto.superTypesList.map { deserializeSuperType(it) },
if (proto.hasInlineClassRepresentation()) deserializeInlineClassRepresentation(proto.inlineClassRepresentation) else null
if (proto.hasInlineClassRepresentation()) deserializeInlineClassRepresentation(proto.inlineClassRepresentation) else null,
proto.sealedSubclassesList.map { deserializeSealedSubclass(it) }
)
}
@@ -73,6 +73,8 @@ internal abstract class IrCarrierSerializer {
abstract fun serializeSuperType(value: IrType): Int
abstract fun serializeSealedSubclass(value: IrClassSymbol): Long
abstract fun serializeType(value: IrType): Int
abstract fun serializeClass(value: IrClassSymbol): Long
@@ -122,6 +124,7 @@ internal abstract class IrCarrierSerializer {
proto.addAllTypeParameters(carrier.typeParametersSymbolField.map { serializeTypeParameter(it) })
proto.addAllSuperTypes(carrier.superTypesField.map { serializeSuperType(it) })
carrier.inlineClassRepresentationField?.let { proto.setInlineClassRepresentation(serializeInlineClassRepresentation(it)) }
proto.addAllSealedSubclasses(carrier.sealedSubclassesField.map { serializeSealedSubclass(it) })
return proto.build().toByteArray()
}
@@ -22,6 +22,7 @@ internal fun PersistentIrGenerator.generateClass() {
descriptorType("InlineClassRepresentation") + "<" + import("IrSimpleType", "org.jetbrains.kotlin.ir.types") + ">?",
inlineClassRepresentationProto
)
val sealedSubclassesField = Field("sealedSubclasses", +"List<" + irSymbol("IrClassSymbol") + ">", sealedSubclassListProto)
writeFile("PersistentIrClass.kt", renderFile("org.jetbrains.kotlin.ir.declarations.persistent") {
lines(
@@ -79,6 +80,7 @@ internal fun PersistentIrGenerator.generateClass() {
modalityField.toPersistentField(+"modality"),
inlineClassRepresentationField.toPersistentField(+"null"),
+"override var attributeOwnerId: " + IrAttributeContainer + " = this",
sealedSubclassesField.toPersistentField(+"emptyList()"),
),
id,
)()
@@ -93,6 +95,7 @@ internal fun PersistentIrGenerator.generateClass() {
typeParametersField,
superTypesField,
inlineClassRepresentationField,
sealedSubclassesField,
)()
})
@@ -104,5 +107,6 @@ internal fun PersistentIrGenerator.generateClass() {
typeParametersField,
superTypesField,
inlineClassRepresentationField,
sealedSubclassesField,
)
}
@@ -152,6 +152,7 @@ internal object PersistentIrGenerator {
val valueParameterListProto = Proto("int64", "valueParameter", +"Long", IrValueParameterSymbol, fieldKind = FieldKind.REPEATED)
val typeParameterListProto = Proto("int64", "typeParameter", +"Long", IrTypeParameterSymbol, fieldKind = FieldKind.REPEATED)
val superTypeListProto = Proto("int32", "superType", +"Int", IrType, fieldKind = FieldKind.REPEATED)
val sealedSubclassListProto = Proto("int64", "sealedSubclass", +"Long", IrClassSymbol, fieldKind = FieldKind.REPEATED)
val typeProto = Proto("int32", "type", +"Int", IrType, fieldKind = FieldKind.REQUIRED)
val optionalTypeProto = Proto("int32", "type", +"Int", IrType, fieldKind = FieldKind.OPTIONAL)
val variableProto = Proto("IrVariable", "variable", protoVariable, IrVariable)
@@ -187,6 +188,7 @@ internal object PersistentIrGenerator {
valueParameterListProto,
typeParameterListProto,
superTypeListProto,
sealedSubclassListProto,
typeProto,
optionalTypeProto,
classProto,
@@ -30,7 +30,6 @@ internal class IrCarrierDeserializerImpl(
val indexToBody: (Int) -> IrBody,
val indexToExpressionBody: (Int) -> IrExpressionBody
) : IrCarrierDeserializer() {
override fun deserializeParentSymbol(proto: Long): IrSymbol {
return declarationDeserializer.symbolDeserializer.deserializeIrSymbol(proto)
}
@@ -67,6 +66,10 @@ internal class IrCarrierDeserializerImpl(
return declarationDeserializer.deserializeIrType(proto)
}
override fun deserializeSealedSubclass(proto: Long): IrClassSymbol {
return declarationDeserializer.symbolDeserializer.deserializeIrSymbol(proto) as IrClassSymbol
}
override fun deserializeType(proto: Int): IrType {
return declarationDeserializer.deserializeIrType(proto)
}
@@ -63,6 +63,10 @@ internal class IrCarrierSerializerImpl(val fileSerializer: IrFileSerializer, val
return fileSerializer.serializeIrType(value)
}
override fun serializeSealedSubclass(value: IrClassSymbol): Long {
return fileSerializer.serializeIrSymbol(value)
}
override fun serializeType(value: IrType): Int {
return fileSerializer.serializeIrType(value)
}