diff --git a/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/stubBased/deserialization/StubBasedClassDeserialization.kt b/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/stubBased/deserialization/StubBasedClassDeserialization.kt index 565cbf5cae5..c8efec478d3 100644 --- a/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/stubBased/deserialization/StubBasedClassDeserialization.kt +++ b/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/stubBased/deserialization/StubBasedClassDeserialization.kt @@ -14,21 +14,30 @@ import com.intellij.psi.stubs.StubTreeLoader import com.intellij.psi.util.PsiUtilCore import org.jetbrains.kotlin.KtFakeSourceElement import org.jetbrains.kotlin.KtRealPsiSourceElement -import org.jetbrains.kotlin.descriptors.* +import org.jetbrains.kotlin.descriptors.ClassKind +import org.jetbrains.kotlin.descriptors.Modality +import org.jetbrains.kotlin.descriptors.Visibilities +import org.jetbrains.kotlin.descriptors.Visibility import org.jetbrains.kotlin.fir.* import org.jetbrains.kotlin.fir.builder.createDataClassCopyFunction import org.jetbrains.kotlin.fir.declarations.* -import org.jetbrains.kotlin.fir.declarations.builder.* +import org.jetbrains.kotlin.fir.declarations.builder.buildOuterClassTypeParameterRef +import org.jetbrains.kotlin.fir.declarations.builder.buildRegularClass import org.jetbrains.kotlin.fir.declarations.comparators.FirMemberDeclarationComparator import org.jetbrains.kotlin.fir.declarations.impl.FirResolvedDeclarationStatusImpl -import org.jetbrains.kotlin.fir.declarations.utils.* -import org.jetbrains.kotlin.fir.deserialization.* +import org.jetbrains.kotlin.fir.declarations.utils.addDeclaration +import org.jetbrains.kotlin.fir.declarations.utils.isCompanion +import org.jetbrains.kotlin.fir.declarations.utils.sourceElement +import org.jetbrains.kotlin.fir.deserialization.addCloneForArrayIfNeeded +import org.jetbrains.kotlin.fir.deserialization.deserializationExtension import org.jetbrains.kotlin.fir.resolve.transformers.setLazyPublishedVisibility import org.jetbrains.kotlin.fir.scopes.FirScopeProvider import org.jetbrains.kotlin.fir.symbols.impl.FirRegularClassSymbol import org.jetbrains.kotlin.fir.symbols.impl.FirTypeAliasSymbol import org.jetbrains.kotlin.lexer.KtTokens -import org.jetbrains.kotlin.name.* +import org.jetbrains.kotlin.name.ClassId +import org.jetbrains.kotlin.name.Name +import org.jetbrains.kotlin.name.StandardClassIds import org.jetbrains.kotlin.psi.* import org.jetbrains.kotlin.serialization.deserialization.descriptors.DeserializedContainerSource import org.jetbrains.kotlin.utils.exceptions.errorWithAttachment @@ -229,8 +238,8 @@ internal fun deserializeClassToSymbol( } addCloneForArrayIfNeeded(classId, context.dispatchReceiver, session) - session.deserializedClassConfigurator?.run { - configure(classId) + session.deserializationExtension?.run { + configureDeserializedClass(classId) } declarations.sortWith(object : Comparator { @@ -257,14 +266,10 @@ internal fun deserializeClassToSymbol( replaceDeprecationsProvider(getDeprecationsProvider(session)) - session.deserializedClassConfigurator?.run { - configure(classId) - } - setLazyPublishedVisibility( hasPublishedApi = classOrObject.annotationEntries.any { context.annotationDeserializer.getAnnotationClassId(it) == StandardClassIds.Annotations.PublishedApi }, parentProperty = null, session ) } -} \ No newline at end of file +} 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 9f5e49be696..3d367d9dcc4 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 @@ -21,13 +21,13 @@ import org.jetbrains.kotlin.fir.declarations.FirDeclarationOverloadabilityHelper import org.jetbrains.kotlin.fir.declarations.FirTypeSpecificityComparatorProvider 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.deserialization.FirDeserializationExtension import org.jetbrains.kotlin.fir.extensions.* import org.jetbrains.kotlin.fir.java.FirJavaVisibilityChecker import org.jetbrains.kotlin.fir.java.FirJvmDefaultModeComponent import org.jetbrains.kotlin.fir.java.FirSyntheticPropertiesStorage import org.jetbrains.kotlin.fir.java.JvmSupertypeUpdater +import org.jetbrains.kotlin.fir.java.deserialization.FirJvmDeserializationExtension import org.jetbrains.kotlin.fir.java.enhancement.FirAnnotationTypeQualifierResolver import org.jetbrains.kotlin.fir.java.enhancement.FirEnhancedSymbolsStorage import org.jetbrains.kotlin.fir.java.enhancement.JavaCompilerRequiredAnnotationEnhancementProvider @@ -112,7 +112,7 @@ fun FirSession.registerCommonJavaComponents(javaModuleResolver: JavaModuleResolv ) register(PlatformSupertypeUpdater::class, JvmSupertypeUpdater(this)) register(PlatformSpecificOverridabilityRules::class, JavaOverridabilityRules(this)) - register(DeserializedClassConfigurator::class, JvmDeserializedClassConfigurator(this)) + register(FirDeserializationExtension::class, FirJvmDeserializationExtension(this)) register(FirEnumEntriesSupport::class, FirJvmEnumEntriesSupport(this)) register(CompilerRequiredAnnotationEnhancementProvider::class, JavaCompilerRequiredAnnotationEnhancementProvider) } diff --git a/compiler/fir/fir-deserialization/build.gradle.kts b/compiler/fir/fir-deserialization/build.gradle.kts index 3806f5ffe66..988cd130418 100644 --- a/compiler/fir/fir-deserialization/build.gradle.kts +++ b/compiler/fir/fir-deserialization/build.gradle.kts @@ -9,7 +9,6 @@ dependencies { implementation(project(":core:deserialization.common")) implementation(project(":core:deserialization.common.jvm")) implementation(project(":core:compiler.common")) - implementation(project(":core:compiler.common.jvm")) api(project(":compiler:fir:cones")) api(project(":compiler:fir:tree")) 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 0d09f0ef686..084c38473a6 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 @@ -5,7 +5,6 @@ package org.jetbrains.kotlin.fir.deserialization -import org.jetbrains.kotlin.builtins.jvm.JvmBuiltInsSignatures import org.jetbrains.kotlin.descriptors.ClassKind import org.jetbrains.kotlin.descriptors.EffectiveVisibility import org.jetbrains.kotlin.descriptors.Modality @@ -37,7 +36,10 @@ import org.jetbrains.kotlin.metadata.ProtoBuf import org.jetbrains.kotlin.metadata.SerializationPluginMetadataExtensions import org.jetbrains.kotlin.metadata.deserialization.* import org.jetbrains.kotlin.metadata.jvm.JvmProtoBuf -import org.jetbrains.kotlin.name.* +import org.jetbrains.kotlin.name.CallableId +import org.jetbrains.kotlin.name.ClassId +import org.jetbrains.kotlin.name.Name +import org.jetbrains.kotlin.name.StandardClassIds import org.jetbrains.kotlin.serialization.SerializerExtensionProtocol import org.jetbrains.kotlin.serialization.deserialization.ProtoEnumFlags import org.jetbrains.kotlin.serialization.deserialization.descriptors.DeserializedContainerSource @@ -203,8 +205,8 @@ fun deserializeClassToSymbol( } addCloneForArrayIfNeeded(classId, context.dispatchReceiver, session) - session.deserializedClassConfigurator?.run { - configure(classId) + session.deserializationExtension?.run { + configureDeserializedClass(classId) } companionObjectSymbol = (declarations.firstOrNull { it is FirRegularClass && it.isCompanion } as FirRegularClass?)?.symbol @@ -237,9 +239,6 @@ fun deserializeClassToSymbol( classProto.getExtensionOrNull(JvmProtoBuf.classModuleName)?.let { idx -> moduleName = nameResolver.getString(idx) } - session.deserializedClassConfigurator?.run { - configure(classId) - } if (!Flags.HAS_ENUM_ENTRIES.get(flags)) { hasNoEnumEntriesAttr = true @@ -262,19 +261,6 @@ private val ARRAY_CLASSES: Set = setOf( Name.identifier("BooleanArray"), ) -private val JAVA_IO_SERIALIZABLE = ClassId.topLevel(FqName("java.io.Serializable")) - -private fun FirRegularClassBuilder.addSerializableIfNeeded(classId: ClassId) { - if (!JvmBuiltInsSignatures.isSerializableInJava(classId.asSingleFqName().toUnsafe())) return - superTypeRefs += buildResolvedTypeRef { - type = ConeClassLikeTypeImpl( - JAVA_IO_SERIALIZABLE.toLookupTag(), - typeArguments = emptyArray(), - isNullable = false - ) - } -} - fun FirRegularClassBuilder.addCloneForArrayIfNeeded(classId: ClassId, dispatchReceiver: ConeClassLikeType?, session: FirSession) { if (classId.packageFqName != StandardClassIds.BASE_KOTLIN_PACKAGE) return if (classId.shortClassName !in ARRAY_CLASSES) return @@ -315,18 +301,6 @@ fun FirRegularClassBuilder.addCloneForArrayIfNeeded(classId: ClassId, dispatchRe } } -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) - } -} - private fun ProtoBuf.ClassOrBuilder.propertiesInOrder(context: FirDeserializationContext): List { val properties = propertyList val versionRequirements = VersionRequirement.create(this, context.nameResolver, context.versionRequirementTable) @@ -345,4 +319,4 @@ private fun ProtoBuf.ClassOrBuilder.propertiesInOrder(context: FirDeserializatio } } -val FirSession.deserializedClassConfigurator: DeserializedClassConfigurator? by FirSession.nullableSessionComponentAccessor() +val FirSession.deserializationExtension: FirDeserializationExtension? by FirSession.nullableSessionComponentAccessor() diff --git a/compiler/fir/fir-deserialization/src/org/jetbrains/kotlin/fir/deserialization/FirDeserializationExtension.kt b/compiler/fir/fir-deserialization/src/org/jetbrains/kotlin/fir/deserialization/FirDeserializationExtension.kt new file mode 100644 index 00000000000..745d046e0d0 --- /dev/null +++ b/compiler/fir/fir-deserialization/src/org/jetbrains/kotlin/fir/deserialization/FirDeserializationExtension.kt @@ -0,0 +1,15 @@ +/* + * Copyright 2010-2023 JetBrains s.r.o. and Kotlin Programming Language contributors. + * Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file. + */ + +package org.jetbrains.kotlin.fir.deserialization + +import org.jetbrains.kotlin.fir.FirSession +import org.jetbrains.kotlin.fir.FirSessionComponent +import org.jetbrains.kotlin.fir.declarations.builder.FirRegularClassBuilder +import org.jetbrains.kotlin.name.ClassId + +abstract class FirDeserializationExtension(val session: FirSession) : FirSessionComponent { + open fun FirRegularClassBuilder.configureDeserializedClass(classId: ClassId) {} +} diff --git a/compiler/fir/java/src/org/jetbrains/kotlin/fir/java/deserialization/FirJvmDeserializationExtension.kt b/compiler/fir/java/src/org/jetbrains/kotlin/fir/java/deserialization/FirJvmDeserializationExtension.kt new file mode 100644 index 00000000000..232d0aeba42 --- /dev/null +++ b/compiler/fir/java/src/org/jetbrains/kotlin/fir/java/deserialization/FirJvmDeserializationExtension.kt @@ -0,0 +1,37 @@ +/* + * Copyright 2010-2023 JetBrains s.r.o. and Kotlin Programming Language contributors. + * Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file. + */ + +package org.jetbrains.kotlin.fir.java.deserialization + +import org.jetbrains.kotlin.builtins.jvm.JvmBuiltInsSignatures +import org.jetbrains.kotlin.fir.FirSession +import org.jetbrains.kotlin.fir.declarations.builder.FirRegularClassBuilder +import org.jetbrains.kotlin.fir.deserialization.FirDeserializationExtension +import org.jetbrains.kotlin.fir.types.builder.buildResolvedTypeRef +import org.jetbrains.kotlin.fir.types.impl.ConeClassLikeTypeImpl +import org.jetbrains.kotlin.fir.types.toLookupTag +import org.jetbrains.kotlin.name.ClassId +import org.jetbrains.kotlin.name.FqName + +class FirJvmDeserializationExtension(session: FirSession) : FirDeserializationExtension(session) { + override fun FirRegularClassBuilder.configureDeserializedClass(classId: ClassId) { + addSerializableIfNeeded(classId) + } + + private fun FirRegularClassBuilder.addSerializableIfNeeded(classId: ClassId) { + if (!JvmBuiltInsSignatures.isSerializableInJava(classId.asSingleFqName().toUnsafe())) return + superTypeRefs += buildResolvedTypeRef { + type = ConeClassLikeTypeImpl( + JAVA_IO_SERIALIZABLE.toLookupTag(), + typeArguments = emptyArray(), + isNullable = false + ) + } + } + + companion object { + private val JAVA_IO_SERIALIZABLE = ClassId.topLevel(FqName("java.io.Serializable")) + } +}