From dbd4cecff6ace3888303ab390123171e804171f7 Mon Sep 17 00:00:00 2001 From: Mikhail Glukhikh Date: Fri, 24 Apr 2020 14:50:04 +0300 Subject: [PATCH] FIR serializer: accept FirClass instead of IrClass to get rid of IR deps --- compiler/fir/fir-serialization/build.gradle.kts | 2 -- .../kotlin/fir/serialization/FirElementSerializer.kt | 7 ++----- .../fir/serialization/FirSerializerExtension.kt | 3 +-- .../fir/backend/jvm/FirJvmSerializerExtension.kt | 11 ++++++----- .../backend/jvm/codegen/FirBasedClassCodegen.kt | 4 ++-- 5 files changed, 11 insertions(+), 16 deletions(-) diff --git a/compiler/fir/fir-serialization/build.gradle.kts b/compiler/fir/fir-serialization/build.gradle.kts index 1bc22156e23..1c49e07f037 100644 --- a/compiler/fir/fir-serialization/build.gradle.kts +++ b/compiler/fir/fir-serialization/build.gradle.kts @@ -8,8 +8,6 @@ dependencies { compile(project(":compiler:fir:cones")) compile(project(":compiler:fir:tree")) compile(project(":compiler:fir:resolve")) - compileOnly(project(":compiler:ir.tree")) - compileOnly(project(":compiler:fir:fir2ir")) compileOnly(intellijCoreDep()) { includeJars("intellij-core", rootProject = rootProject) } } diff --git a/compiler/fir/fir-serialization/src/org/jetbrains/kotlin/fir/serialization/FirElementSerializer.kt b/compiler/fir/fir-serialization/src/org/jetbrains/kotlin/fir/serialization/FirElementSerializer.kt index 25b02c9b34f..00ca03b277b 100644 --- a/compiler/fir/fir-serialization/src/org/jetbrains/kotlin/fir/serialization/FirElementSerializer.kt +++ b/compiler/fir/fir-serialization/src/org/jetbrains/kotlin/fir/serialization/FirElementSerializer.kt @@ -10,7 +10,6 @@ import org.jetbrains.kotlin.config.LanguageFeature import org.jetbrains.kotlin.descriptors.* import org.jetbrains.kotlin.fir.FirAnnotationContainer 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.impl.FirDefaultPropertyAccessor 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.types.* 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.deserialization.Flags import org.jetbrains.kotlin.metadata.deserialization.VersionRequirement @@ -84,8 +82,7 @@ class FirElementSerializer private constructor( return builder } - fun classProto(irClass: IrClass): ProtoBuf.Class.Builder { - val klass = (irClass.metadata as FirMetadataSource.Class).klass + fun classProto(klass: FirClass<*>): ProtoBuf.Class.Builder { val builder = ProtoBuf.Class.newBuilder() val regularClass = klass as? FirRegularClass @@ -178,7 +175,7 @@ class FirElementSerializer private constructor( builder.addAllVersionRequirement(versionRequirementTable.serializeVersionRequirements(klass)) - extension.serializeClass(irClass, builder, versionRequirementTable, this) + extension.serializeClass(klass, builder, versionRequirementTable, this) writeVersionRequirementForInlineClasses(klass, builder, versionRequirementTable) diff --git a/compiler/fir/fir-serialization/src/org/jetbrains/kotlin/fir/serialization/FirSerializerExtension.kt b/compiler/fir/fir-serialization/src/org/jetbrains/kotlin/fir/serialization/FirSerializerExtension.kt index 7b20dd36bb9..90b88bacb90 100644 --- a/compiler/fir/fir-serialization/src/org/jetbrains/kotlin/fir/serialization/FirSerializerExtension.kt +++ b/compiler/fir/fir-serialization/src/org/jetbrains/kotlin/fir/serialization/FirSerializerExtension.kt @@ -10,7 +10,6 @@ import org.jetbrains.kotlin.fir.declarations.* import org.jetbrains.kotlin.fir.types.ConeFlexibleType import org.jetbrains.kotlin.fir.types.ConeKotlinErrorType 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.deserialization.BinaryVersion import org.jetbrains.kotlin.metadata.serialization.MutableVersionRequirementTable @@ -36,7 +35,7 @@ abstract class FirSerializerExtension { } open fun serializeClass( - klass: IrClass, + klass: FirClass<*>, proto: ProtoBuf.Class.Builder, versionRequirementTable: MutableVersionRequirementTable, childSerializer: FirElementSerializer diff --git a/compiler/fir/fir2ir/jvm-backend/src/org/jetbrains/kotlin/fir/backend/jvm/FirJvmSerializerExtension.kt b/compiler/fir/fir2ir/jvm-backend/src/org/jetbrains/kotlin/fir/backend/jvm/FirJvmSerializerExtension.kt index 5f2f553d1ce..7e7709e75ce 100644 --- a/compiler/fir/fir2ir/jvm-backend/src/org/jetbrains/kotlin/fir/backend/jvm/FirJvmSerializerExtension.kt +++ b/compiler/fir/fir2ir/jvm-backend/src/org/jetbrains/kotlin/fir/backend/jvm/FirJvmSerializerExtension.kt @@ -44,6 +44,7 @@ class FirJvmSerializerExtension @JvmOverloads constructor( override val session: FirSession, private val bindings: JvmSerializationBindings, state: GenerationState, + private val irClass: IrClass, private val typeMapper: KotlinTypeMapperBase = state.typeMapper ) : FirSerializerExtension() { private val globalBindings = state.globalSerializationBindings @@ -75,21 +76,21 @@ class FirJvmSerializerExtension @JvmOverloads constructor( } override fun serializeClass( - klass: IrClass, + klass: FirClass<*>, proto: ProtoBuf.Class.Builder, versionRequirementTable: MutableVersionRequirementTable, childSerializer: FirElementSerializer ) { + assert((irClass.metadata as FirMetadataSource.Class).klass == klass) if (moduleName != JvmProtoBufUtil.DEFAULT_MODULE_NAME) { proto.setExtension(JvmProtoBuf.classModuleName, stringTable.getStringIndex(moduleName)) } //TODO: support local delegated properties in new defaults scheme val containerAsmType = - if (klass is FirRegularClass && klass.classKind == ClassKind.INTERFACE) typeMapper.mapDefaultImpls(klass.descriptor) - else typeMapper.mapClass(klass.descriptor) + if (klass is FirRegularClass && klass.classKind == ClassKind.INTERFACE) typeMapper.mapDefaultImpls(irClass.descriptor) + else typeMapper.mapClass(irClass.descriptor) writeLocalProperties(proto, containerAsmType, JvmProtoBuf.classLocalVariable) - val firClass = (klass.metadata as FirMetadataSource.Class).klass - writeVersionRequirementForJvmDefaultIfNeeded(firClass, proto, versionRequirementTable) + writeVersionRequirementForJvmDefaultIfNeeded(klass, proto, versionRequirementTable) if (jvmDefaultMode.forAllMethodsWithBody && klass is FirRegularClass && klass.classKind == ClassKind.INTERFACE) { proto.setExtension(JvmProtoBuf.jvmClassFlags, JvmFlags.getClassFlags(true)) diff --git a/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/codegen/FirBasedClassCodegen.kt b/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/codegen/FirBasedClassCodegen.kt index 5f1828c09f6..77b1a73fd55 100644 --- a/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/codegen/FirBasedClassCodegen.kt +++ b/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/codegen/FirBasedClassCodegen.kt @@ -36,7 +36,7 @@ class FirBasedClassCodegen internal constructor( 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? = when (val metadata = irClass.metadata) { is FirMetadataSource.Class -> FirElementSerializer.create( @@ -77,7 +77,7 @@ class FirBasedClassCodegen internal constructor( when (val metadata = irClass.metadata) { is FirMetadataSource.Class -> { - val classProto = serializer!!.classProto(irClass).build() + val classProto = serializer!!.classProto(metadata.klass).build() writeKotlinMetadata(visitor, state, KotlinClassHeader.Kind.CLASS, extraFlags) { AsmUtil.writeAnnotationData(it, classProto, serializer.stringTable as JvmStringTable) }