From 8feb2a9505733de959b15ef3228eda1803c137e1 Mon Sep 17 00:00:00 2001 From: Ilya Chernikov Date: Mon, 1 Aug 2022 11:54:18 +0200 Subject: [PATCH] FIR: component for deserialized class configuration do not add Serializable JVM interface to non-JVM classes --- .../structure/LLFirBuiltinsSessionFactory.kt | 3 +++ .../fir/session/ComponentsContainers.kt | 3 +++ .../deserialization/ClassDeserialization.kt | 22 +++++++++++++++++-- 3 files changed, 26 insertions(+), 2 deletions(-) diff --git a/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/project/structure/LLFirBuiltinsSessionFactory.kt b/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/project/structure/LLFirBuiltinsSessionFactory.kt index 818628fc7c6..78955a00816 100644 --- a/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/project/structure/LLFirBuiltinsSessionFactory.kt +++ b/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/project/structure/LLFirBuiltinsSessionFactory.kt @@ -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) diff --git a/compiler/fir/entrypoint/src/org/jetbrains/kotlin/fir/session/ComponentsContainers.kt b/compiler/fir/entrypoint/src/org/jetbrains/kotlin/fir/session/ComponentsContainers.kt index dc1b6f4c50e..ee8758e2bc7 100644 --- a/compiler/fir/entrypoint/src/org/jetbrains/kotlin/fir/session/ComponentsContainers.kt +++ b/compiler/fir/entrypoint/src/org/jetbrains/kotlin/fir/session/ComponentsContainers.kt @@ -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 -------------------------- diff --git a/compiler/fir/fir-deserialization/src/org/jetbrains/kotlin/fir/deserialization/ClassDeserialization.kt b/compiler/fir/fir-deserialization/src/org/jetbrains/kotlin/fir/deserialization/ClassDeserialization.kt index b78e718df5a..4beafe1df92 100644 --- a/compiler/fir/fir-deserialization/src/org/jetbrains/kotlin/fir/deserialization/ClassDeserialization.kt +++ b/compiler/fir/fir-deserialization/src/org/jetbrains/kotlin/fir/deserialization/ClassDeserialization.kt @@ -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 { 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()