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
@@ -22,6 +22,7 @@ import org.jetbrains.kotlin.fir.resolve.scopes.wrapScopeWithJvmMapped
import org.jetbrains.kotlin.fir.resolve.transformers.FirCompilerLazyDeclarationResolver
import org.jetbrains.kotlin.fir.scopes.FirKotlinScopeProvider
import org.jetbrains.kotlin.fir.session.registerCommonComponents
import org.jetbrains.kotlin.fir.session.registerCommonJavaComponents
import org.jetbrains.kotlin.fir.session.registerModuleData
import org.jetbrains.kotlin.fir.symbols.FirLazyDeclarationResolver
import java.util.concurrent.ConcurrentHashMap
@@ -30,6 +31,7 @@ import org.jetbrains.kotlin.platform.TargetPlatform
import org.jetbrains.kotlin.platform.isCommon
import org.jetbrains.kotlin.platform.js.isJs
import org.jetbrains.kotlin.platform.jvm.isJvm
import org.jetbrains.kotlin.resolve.jvm.modules.JavaModuleResolver
import org.jetbrains.kotlin.resolve.jvm.platform.JvmPlatformAnalyzerServices
@OptIn(PrivateSessionConstructor::class, SessionConfiguration::class)
@@ -52,6 +54,7 @@ class LLFirBuiltinsSessionFactory(
registerIdeComponents(project)
register(FirLazyDeclarationResolver::class, FirCompilerLazyDeclarationResolver)
registerCommonComponents(LanguageVersionSettingsImpl.DEFAULT/*TODO*/)
registerCommonJavaComponents(JavaModuleResolver.getInstance(project))
registerModuleData(moduleData)
val kotlinScopeProvider = FirKotlinScopeProvider(::wrapScopeWithJvmMapped)
@@ -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()