FIR: component for deserialized class configuration

do not add Serializable JVM interface to non-JVM classes
This commit is contained in:
Ilya Chernikov
2022-08-01 11:54:18 +02:00
parent 44cce3ad52
commit 8feb2a9505
3 changed files with 26 additions and 2 deletions
@@ -17,6 +17,8 @@ import org.jetbrains.kotlin.fir.caches.FirCachesFactory
import org.jetbrains.kotlin.fir.caches.FirThreadUnsafeCachesFactory
import org.jetbrains.kotlin.fir.declarations.SealedClassInheritorsProvider
import org.jetbrains.kotlin.fir.declarations.SealedClassInheritorsProviderImpl
import org.jetbrains.kotlin.fir.deserialization.DeserializedClassConfigurator
import org.jetbrains.kotlin.fir.deserialization.JvmDeserializedClassConfigurator
import org.jetbrains.kotlin.fir.extensions.*
import org.jetbrains.kotlin.fir.java.FirJavaVisibilityChecker
import org.jetbrains.kotlin.fir.java.FirJvmDefaultModeComponent
@@ -91,6 +93,7 @@ fun FirSession.registerCommonJavaComponents(javaModuleResolver: JavaModuleResolv
)
register(PlatformSupertypeUpdater::class, JvmSupertypeUpdater(this))
register(PlatformSpecificOverridabilityRules::class, JavaOverridabilityRules(this))
register(DeserializedClassConfigurator::class, JvmDeserializedClassConfigurator(this))
}
// -------------------------- Resolve components --------------------------
@@ -32,7 +32,6 @@ import org.jetbrains.kotlin.metadata.jvm.JvmProtoBuf
import org.jetbrains.kotlin.name.*
import org.jetbrains.kotlin.serialization.SerializerExtensionProtocol
import org.jetbrains.kotlin.serialization.deserialization.ProtoEnumFlags
import org.jetbrains.kotlin.serialization.deserialization.builtins.BuiltInSerializerProtocol
import org.jetbrains.kotlin.serialization.deserialization.descriptors.DeserializedContainerSource
import org.jetbrains.kotlin.serialization.deserialization.getName
import org.jetbrains.kotlin.serialization.deserialization.loadValueClassRepresentation
@@ -193,7 +192,9 @@ fun deserializeClassToSymbol(
}
addCloneForArrayIfNeeded(classId, context.dispatchReceiver)
addSerializableIfNeeded(classId)
session.deserializedClassConfigurator?.run {
configure(classId)
}
declarations.sortWith(object : Comparator<FirDeclaration> {
override fun compare(a: FirDeclaration, b: FirDeclaration): Int {
@@ -234,6 +235,9 @@ fun deserializeClassToSymbol(
classProto.getExtensionOrNull(JvmProtoBuf.classModuleName)?.let { idx ->
moduleName = nameResolver.getString(idx)
}
session.deserializedClassConfigurator?.run {
configure(classId)
}
}
}
@@ -301,3 +305,17 @@ private fun FirRegularClassBuilder.addCloneForArrayIfNeeded(classId: ClassId, di
dispatchReceiverType = dispatchReceiver!!
}
}
abstract class DeserializedClassConfigurator(val session: FirSession) : FirSessionComponent {
open fun FirRegularClassBuilder.configure(classId: ClassId) {}
open fun FirRegularClass.configure(classId: ClassId) {}
}
class JvmDeserializedClassConfigurator(session: FirSession): DeserializedClassConfigurator(session) {
override fun FirRegularClassBuilder.configure(classId: ClassId) {
addSerializableIfNeeded(classId)
}
}
val FirSession.deserializedClassConfigurator: DeserializedClassConfigurator? by FirSession.nullableSessionComponentAccessor()