diff --git a/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/providers/LLFirModuleWithDependenciesSymbolProvider.kt b/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/providers/LLFirModuleWithDependenciesSymbolProvider.kt index 57ed122c6e8..cbfa62c93ee 100644 --- a/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/providers/LLFirModuleWithDependenciesSymbolProvider.kt +++ b/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/providers/LLFirModuleWithDependenciesSymbolProvider.kt @@ -5,6 +5,7 @@ package org.jetbrains.kotlin.analysis.low.level.api.fir.providers +import org.jetbrains.kotlin.analysis.low.level.api.fir.stubBased.deserialization.JvmStubDeserializedBuiltInsContainerSource import org.jetbrains.kotlin.analysis.low.level.api.fir.stubBased.deserialization.StubBasedFirDeserializedSymbolProvider import org.jetbrains.kotlin.analysis.utils.collections.buildSmartList import org.jetbrains.kotlin.fir.FirSession @@ -182,7 +183,14 @@ internal class LLFirDependenciesSymbolProvider( } private fun FirCallableSymbol<*>.jvmClassName(): JvmClassName? { - val jvmPackagePartSource = fir.containerSource as? FacadeClassSource ?: return null - return jvmPackagePartSource.facadeClassName ?: jvmPackagePartSource.className + val containerSource = fir.containerSource + + return when (containerSource) { + is JvmStubDeserializedBuiltInsContainerSource -> containerSource.facadeClassName + + is FacadeClassSource -> containerSource.facadeClassName ?: containerSource.className + + else -> null + } } } diff --git a/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/stubBased/deserialization/JvmStubDeserializedBuiltInsContainerSource.kt b/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/stubBased/deserialization/JvmStubDeserializedBuiltInsContainerSource.kt new file mode 100644 index 00000000000..4ecf7c76232 --- /dev/null +++ b/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/stubBased/deserialization/JvmStubDeserializedBuiltInsContainerSource.kt @@ -0,0 +1,45 @@ +/* + * 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.analysis.low.level.api.fir.stubBased.deserialization + +import org.jetbrains.kotlin.descriptors.SourceFile +import org.jetbrains.kotlin.resolve.jvm.JvmClassName +import org.jetbrains.kotlin.serialization.deserialization.IncompatibleVersionErrorData +import org.jetbrains.kotlin.serialization.deserialization.builtins.BuiltInSerializerProtocol +import org.jetbrains.kotlin.serialization.deserialization.descriptors.DeserializedContainerAbiStability +import org.jetbrains.kotlin.serialization.deserialization.descriptors.DeserializedContainerSource + +/** + * Container source for deserialized declarations from ".kotlin_builtins" file. + * + * [facadeClassName] points to a facade class (e.g. "kotlin/LibraryKt") and + * is used to differentiate between different builtins files. + * + * We have a dedicated container source for such declaration because we don't want + * them to be identified as belonging to a facade class. + * + * For that specific reason, this class **DOES NOT** implement + * [org.jetbrains.kotlin.load.kotlin.FacadeClassSource], + * because compiler backend might use instance checks to detect + * regular facade files. + * + * See for KTIJ-27124 for an example of an issue in IR lowerings. + */ +internal class JvmStubDeserializedBuiltInsContainerSource(val facadeClassName: JvmClassName) : DeserializedContainerSource { + override val incompatibility: IncompatibleVersionErrorData<*>? + get() = null + + override val isPreReleaseInvisible: Boolean + get() = false + + override val abiStability: DeserializedContainerAbiStability + get() = DeserializedContainerAbiStability.STABLE + + override val presentableString: String + get() = "Declarations from ${BuiltInSerializerProtocol.BUILTINS_FILE_EXTENSION} file '${facadeClassName}'" + + override fun getContainingFile(): SourceFile = SourceFile.NO_SOURCE_FILE +} diff --git a/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/stubBased/deserialization/StubBasedFirDeserializedSymbolProvider.kt b/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/stubBased/deserialization/StubBasedFirDeserializedSymbolProvider.kt index 09d58b790ce..964e556b2c0 100644 --- a/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/stubBased/deserialization/StubBasedFirDeserializedSymbolProvider.kt +++ b/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/stubBased/deserialization/StubBasedFirDeserializedSymbolProvider.kt @@ -29,6 +29,8 @@ import org.jetbrains.kotlin.name.* import org.jetbrains.kotlin.psi.* import org.jetbrains.kotlin.psi.stubs.impl.* import org.jetbrains.kotlin.resolve.jvm.JvmClassName +import org.jetbrains.kotlin.serialization.deserialization.builtins.BuiltInSerializerProtocol +import org.jetbrains.kotlin.serialization.deserialization.descriptors.DeserializedContainerSource import org.jetbrains.kotlin.utils.addToStdlib.ifNotEmpty typealias DeserializedTypeAliasPostProcessor = (FirTypeAliasSymbol) -> Unit @@ -177,7 +179,17 @@ internal open class StubBasedFirDeserializedSymbolProvider( } } - private fun getFacadeContainerSource(file: KtFile, origin: KotlinStubOrigin?): JvmStubDeserializedFacadeContainerSource { + private fun getContainerSource(file: KtFile, origin: KotlinStubOrigin?): DeserializedContainerSource { + if (file.virtualFile.extension == BuiltInSerializerProtocol.BUILTINS_FILE_EXTENSION) { + require(origin is KotlinStubOrigin.Facade) { + "Expected builtins file to have Facade origin, got origin=$origin instead" + } + + return JvmStubDeserializedBuiltInsContainerSource( + facadeClassName = JvmClassName.byInternalName(origin.className) + ) + } + return when (origin) { is KotlinStubOrigin.Facade -> { val className = JvmClassName.byInternalName(origin.className)