FIR serializer: accept FirClass instead of IrClass to get rid of IR deps

This commit is contained in:
Mikhail Glukhikh
2020-04-24 14:50:04 +03:00
parent 8d85e7a401
commit dbd4cecff6
5 changed files with 11 additions and 16 deletions
@@ -8,8 +8,6 @@ dependencies {
compile(project(":compiler:fir:cones")) compile(project(":compiler:fir:cones"))
compile(project(":compiler:fir:tree")) compile(project(":compiler:fir:tree"))
compile(project(":compiler:fir:resolve")) compile(project(":compiler:fir:resolve"))
compileOnly(project(":compiler:ir.tree"))
compileOnly(project(":compiler:fir:fir2ir"))
compileOnly(intellijCoreDep()) { includeJars("intellij-core", rootProject = rootProject) } compileOnly(intellijCoreDep()) { includeJars("intellij-core", rootProject = rootProject) }
} }
@@ -10,7 +10,6 @@ import org.jetbrains.kotlin.config.LanguageFeature
import org.jetbrains.kotlin.descriptors.* import org.jetbrains.kotlin.descriptors.*
import org.jetbrains.kotlin.fir.FirAnnotationContainer import org.jetbrains.kotlin.fir.FirAnnotationContainer
import org.jetbrains.kotlin.fir.FirSession import org.jetbrains.kotlin.fir.FirSession
import org.jetbrains.kotlin.fir.backend.FirMetadataSource
import org.jetbrains.kotlin.fir.declarations.* import org.jetbrains.kotlin.fir.declarations.*
import org.jetbrains.kotlin.fir.declarations.impl.FirDefaultPropertyAccessor import org.jetbrains.kotlin.fir.declarations.impl.FirDefaultPropertyAccessor
import org.jetbrains.kotlin.fir.deserialization.CONTINUATION_INTERFACE_CLASS_ID import org.jetbrains.kotlin.fir.deserialization.CONTINUATION_INTERFACE_CLASS_ID
@@ -28,7 +27,6 @@ import org.jetbrains.kotlin.fir.symbols.StandardClassIds
import org.jetbrains.kotlin.fir.symbols.impl.ConeClassLikeLookupTagImpl import org.jetbrains.kotlin.fir.symbols.impl.ConeClassLikeLookupTagImpl
import org.jetbrains.kotlin.fir.types.* import org.jetbrains.kotlin.fir.types.*
import org.jetbrains.kotlin.fir.types.impl.FirImplicitNullableAnyTypeRef import org.jetbrains.kotlin.fir.types.impl.FirImplicitNullableAnyTypeRef
import org.jetbrains.kotlin.ir.declarations.IrClass
import org.jetbrains.kotlin.metadata.ProtoBuf import org.jetbrains.kotlin.metadata.ProtoBuf
import org.jetbrains.kotlin.metadata.deserialization.Flags import org.jetbrains.kotlin.metadata.deserialization.Flags
import org.jetbrains.kotlin.metadata.deserialization.VersionRequirement import org.jetbrains.kotlin.metadata.deserialization.VersionRequirement
@@ -84,8 +82,7 @@ class FirElementSerializer private constructor(
return builder return builder
} }
fun classProto(irClass: IrClass): ProtoBuf.Class.Builder { fun classProto(klass: FirClass<*>): ProtoBuf.Class.Builder {
val klass = (irClass.metadata as FirMetadataSource.Class).klass
val builder = ProtoBuf.Class.newBuilder() val builder = ProtoBuf.Class.newBuilder()
val regularClass = klass as? FirRegularClass val regularClass = klass as? FirRegularClass
@@ -178,7 +175,7 @@ class FirElementSerializer private constructor(
builder.addAllVersionRequirement(versionRequirementTable.serializeVersionRequirements(klass)) builder.addAllVersionRequirement(versionRequirementTable.serializeVersionRequirements(klass))
extension.serializeClass(irClass, builder, versionRequirementTable, this) extension.serializeClass(klass, builder, versionRequirementTable, this)
writeVersionRequirementForInlineClasses(klass, builder, versionRequirementTable) writeVersionRequirementForInlineClasses(klass, builder, versionRequirementTable)
@@ -10,7 +10,6 @@ import org.jetbrains.kotlin.fir.declarations.*
import org.jetbrains.kotlin.fir.types.ConeFlexibleType import org.jetbrains.kotlin.fir.types.ConeFlexibleType
import org.jetbrains.kotlin.fir.types.ConeKotlinErrorType import org.jetbrains.kotlin.fir.types.ConeKotlinErrorType
import org.jetbrains.kotlin.fir.types.ConeKotlinType import org.jetbrains.kotlin.fir.types.ConeKotlinType
import org.jetbrains.kotlin.ir.declarations.IrClass
import org.jetbrains.kotlin.metadata.ProtoBuf import org.jetbrains.kotlin.metadata.ProtoBuf
import org.jetbrains.kotlin.metadata.deserialization.BinaryVersion import org.jetbrains.kotlin.metadata.deserialization.BinaryVersion
import org.jetbrains.kotlin.metadata.serialization.MutableVersionRequirementTable import org.jetbrains.kotlin.metadata.serialization.MutableVersionRequirementTable
@@ -36,7 +35,7 @@ abstract class FirSerializerExtension {
} }
open fun serializeClass( open fun serializeClass(
klass: IrClass, klass: FirClass<*>,
proto: ProtoBuf.Class.Builder, proto: ProtoBuf.Class.Builder,
versionRequirementTable: MutableVersionRequirementTable, versionRequirementTable: MutableVersionRequirementTable,
childSerializer: FirElementSerializer childSerializer: FirElementSerializer
@@ -44,6 +44,7 @@ class FirJvmSerializerExtension @JvmOverloads constructor(
override val session: FirSession, override val session: FirSession,
private val bindings: JvmSerializationBindings, private val bindings: JvmSerializationBindings,
state: GenerationState, state: GenerationState,
private val irClass: IrClass,
private val typeMapper: KotlinTypeMapperBase = state.typeMapper private val typeMapper: KotlinTypeMapperBase = state.typeMapper
) : FirSerializerExtension() { ) : FirSerializerExtension() {
private val globalBindings = state.globalSerializationBindings private val globalBindings = state.globalSerializationBindings
@@ -75,21 +76,21 @@ class FirJvmSerializerExtension @JvmOverloads constructor(
} }
override fun serializeClass( override fun serializeClass(
klass: IrClass, klass: FirClass<*>,
proto: ProtoBuf.Class.Builder, proto: ProtoBuf.Class.Builder,
versionRequirementTable: MutableVersionRequirementTable, versionRequirementTable: MutableVersionRequirementTable,
childSerializer: FirElementSerializer childSerializer: FirElementSerializer
) { ) {
assert((irClass.metadata as FirMetadataSource.Class).klass == klass)
if (moduleName != JvmProtoBufUtil.DEFAULT_MODULE_NAME) { if (moduleName != JvmProtoBufUtil.DEFAULT_MODULE_NAME) {
proto.setExtension(JvmProtoBuf.classModuleName, stringTable.getStringIndex(moduleName)) proto.setExtension(JvmProtoBuf.classModuleName, stringTable.getStringIndex(moduleName))
} }
//TODO: support local delegated properties in new defaults scheme //TODO: support local delegated properties in new defaults scheme
val containerAsmType = val containerAsmType =
if (klass is FirRegularClass && klass.classKind == ClassKind.INTERFACE) typeMapper.mapDefaultImpls(klass.descriptor) if (klass is FirRegularClass && klass.classKind == ClassKind.INTERFACE) typeMapper.mapDefaultImpls(irClass.descriptor)
else typeMapper.mapClass(klass.descriptor) else typeMapper.mapClass(irClass.descriptor)
writeLocalProperties(proto, containerAsmType, JvmProtoBuf.classLocalVariable) writeLocalProperties(proto, containerAsmType, JvmProtoBuf.classLocalVariable)
val firClass = (klass.metadata as FirMetadataSource.Class).klass writeVersionRequirementForJvmDefaultIfNeeded(klass, proto, versionRequirementTable)
writeVersionRequirementForJvmDefaultIfNeeded(firClass, proto, versionRequirementTable)
if (jvmDefaultMode.forAllMethodsWithBody && klass is FirRegularClass && klass.classKind == ClassKind.INTERFACE) { if (jvmDefaultMode.forAllMethodsWithBody && klass is FirRegularClass && klass.classKind == ClassKind.INTERFACE) {
proto.setExtension(JvmProtoBuf.jvmClassFlags, JvmFlags.getClassFlags(true)) proto.setExtension(JvmProtoBuf.jvmClassFlags, JvmFlags.getClassFlags(true))
@@ -36,7 +36,7 @@ class FirBasedClassCodegen internal constructor(
private val session = (irClass.metadata as FirMetadataSource).session private val session = (irClass.metadata as FirMetadataSource).session
private val serializerExtension = FirJvmSerializerExtension(session, visitor.serializationBindings, state, typeMapper) private val serializerExtension = FirJvmSerializerExtension(session, visitor.serializationBindings, state, irClass, typeMapper)
private val serializer: FirElementSerializer? = private val serializer: FirElementSerializer? =
when (val metadata = irClass.metadata) { when (val metadata = irClass.metadata) {
is FirMetadataSource.Class -> FirElementSerializer.create( is FirMetadataSource.Class -> FirElementSerializer.create(
@@ -77,7 +77,7 @@ class FirBasedClassCodegen internal constructor(
when (val metadata = irClass.metadata) { when (val metadata = irClass.metadata) {
is FirMetadataSource.Class -> { is FirMetadataSource.Class -> {
val classProto = serializer!!.classProto(irClass).build() val classProto = serializer!!.classProto(metadata.klass).build()
writeKotlinMetadata(visitor, state, KotlinClassHeader.Kind.CLASS, extraFlags) { writeKotlinMetadata(visitor, state, KotlinClassHeader.Kind.CLASS, extraFlags) {
AsmUtil.writeAnnotationData(it, classProto, serializer.stringTable as JvmStringTable) AsmUtil.writeAnnotationData(it, classProto, serializer.stringTable as JvmStringTable)
} }