diff --git a/compiler/util-klib-metadata/src/org/jetbrains/kotlin/library/metadata/impl/KlibMetadataModuleDescriptorFactoryImpl.kt b/compiler/util-klib-metadata/src/org/jetbrains/kotlin/library/metadata/impl/KlibMetadataModuleDescriptorFactoryImpl.kt index ef394784ada..dcd70fbbe5f 100644 --- a/compiler/util-klib-metadata/src/org/jetbrains/kotlin/library/metadata/impl/KlibMetadataModuleDescriptorFactoryImpl.kt +++ b/compiler/util-klib-metadata/src/org/jetbrains/kotlin/library/metadata/impl/KlibMetadataModuleDescriptorFactoryImpl.kt @@ -16,18 +16,14 @@ import org.jetbrains.kotlin.descriptors.impl.ModuleDescriptorImpl import org.jetbrains.kotlin.incremental.components.LookupTracker import org.jetbrains.kotlin.library.KotlinLibrary import org.jetbrains.kotlin.library.metadata.* -import org.jetbrains.kotlin.library.hasDependencies -import org.jetbrains.kotlin.name.NativeForwardDeclarationKind -import org.jetbrains.kotlin.name.Name -import org.jetbrains.kotlin.name.parentOrNull +import org.jetbrains.kotlin.library.isNativeStdlib +import org.jetbrains.kotlin.name.* import org.jetbrains.kotlin.platform.jvm.isJvm import org.jetbrains.kotlin.resolve.CompilerDeserializationConfiguration import org.jetbrains.kotlin.resolve.sam.SamConversionResolverImpl import org.jetbrains.kotlin.serialization.deserialization.* import org.jetbrains.kotlin.storage.StorageManager - -private val ModuleDescriptorImpl.isStdlibModule - get() = (this.klibModuleOrigin as? DeserializedKlibModuleOrigin)?.library?.let { !it.hasDependencies } ?: false +import org.jetbrains.kotlin.utils.addToStdlib.runIf class KlibMetadataModuleDescriptorFactoryImpl( override val descriptorFactory: KlibModuleDescriptorFactory, @@ -49,27 +45,22 @@ class KlibMetadataModuleDescriptorFactoryImpl( val moduleName = Name.special(libraryProto.moduleName) val moduleOrigin = DeserializedKlibModuleOrigin(library) - val moduleDescriptor = if (builtIns != null ) + val moduleDescriptor = if (builtIns != null) descriptorFactory.createDescriptor(moduleName, storageManager, builtIns, moduleOrigin) else descriptorFactory.createDescriptorAndNewBuiltIns(moduleName, storageManager, moduleOrigin) - val deserializationConfiguration = CompilerDeserializationConfiguration(languageVersionSettings) - - val compositePackageFragmentAddend = - if (moduleDescriptor.isStdlibModule) { - functionInterfacePackageFragmentProvider(storageManager, moduleDescriptor) - } else null - val provider = createPackageFragmentProvider( library, packageAccessHandler, - libraryProto.packageFragmentNameList, + packageFragmentNames = libraryProto.packageFragmentNameList, storageManager, moduleDescriptor, - deserializationConfiguration, - compositePackageFragmentAddend, - lookupTracker + configuration = CompilerDeserializationConfiguration(languageVersionSettings), + compositePackageFragmentAddend = runIf(library.isNativeStdlib) { + functionInterfacePackageFragmentProvider(storageManager, moduleDescriptor) + }, + lookupTracker = lookupTracker ) moduleDescriptor.initialize(provider) diff --git a/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/CompilerOutput.kt b/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/CompilerOutput.kt index ffefcd296e8..7b4d02bfb4e 100644 --- a/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/CompilerOutput.kt +++ b/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/CompilerOutput.kt @@ -9,10 +9,8 @@ import org.jetbrains.kotlin.backend.konan.driver.PhaseContext import org.jetbrains.kotlin.backend.konan.llvm.* import org.jetbrains.kotlin.backend.konan.llvm.objc.patchObjCRuntimeModule import org.jetbrains.kotlin.konan.file.isBitcode -import org.jetbrains.kotlin.konan.library.KONAN_STDLIB_NAME import org.jetbrains.kotlin.konan.target.CompilerOutputKind -import org.jetbrains.kotlin.library.BaseKotlinLibrary -import org.jetbrains.kotlin.library.uniqueName +import org.jetbrains.kotlin.library.isNativeStdlib import org.jetbrains.kotlin.utils.addToStdlib.ifNotEmpty import java.io.File @@ -64,10 +62,6 @@ internal fun produceCStubs(generationState: NativeGenerationState) { } } -private val BaseKotlinLibrary.isStdlib: Boolean - get() = uniqueName == KONAN_STDLIB_NAME - - private data class LlvmModules( val runtimeModules: List, val additionalModules: List @@ -82,7 +76,7 @@ private fun collectLlvmModules(generationState: NativeGenerationState, generated val config = generationState.config val (bitcodePartOfStdlib, bitcodeLibraries) = generationState.dependenciesTracker.bitcodeToLink - .partition { it.isStdlib && generationState.producedLlvmModuleContainsStdlib } + .partition { it.isNativeStdlib && generationState.producedLlvmModuleContainsStdlib } .toList() .map { libraries -> libraries.flatMap { it.bitcodePaths }.filter { it.isBitcode } diff --git a/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/Fir2Ir.kt b/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/Fir2Ir.kt index 7fda319eac1..fba0c67bd29 100644 --- a/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/Fir2Ir.kt +++ b/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/Fir2Ir.kt @@ -42,9 +42,8 @@ import org.jetbrains.kotlin.ir.objcinterop.IrObjCOverridabilityCondition import org.jetbrains.kotlin.ir.types.IrTypeSystemContextImpl import org.jetbrains.kotlin.ir.util.* import org.jetbrains.kotlin.ir.visitors.acceptVoid -import org.jetbrains.kotlin.konan.library.KONAN_STDLIB_NAME +import org.jetbrains.kotlin.library.isNativeStdlib import org.jetbrains.kotlin.library.metadata.KlibMetadataFactories -import org.jetbrains.kotlin.library.uniqueName import org.jetbrains.kotlin.name.NativeForwardDeclarationKind import org.jetbrains.kotlin.storage.LockBasedStorageManager @@ -150,7 +149,7 @@ internal fun PhaseContext.fir2Ir( usedPackages.any { !module.packageFragmentProviderForModuleContentWithoutDependencies.isEmpty(it) } }.map { it.second }.toSet() - resolvedLibraries.find { it.library.uniqueName == KONAN_STDLIB_NAME }?.let { + resolvedLibraries.find { it.library.isNativeStdlib }?.let { require(usedLibraries.contains(it)) { "Internal error: stdlib must be in usedLibraries, if it's in resolvedLibraries" } diff --git a/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/objcexport/ObjCExportLazy.kt b/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/objcexport/ObjCExportLazy.kt index 474ccb7b2c6..219ede5788e 100644 --- a/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/objcexport/ObjCExportLazy.kt +++ b/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/objcexport/ObjCExportLazy.kt @@ -448,7 +448,7 @@ internal fun createNamerConfiguration(configuration: ObjCExportLazy.Configuratio override val topLevelNamePrefix = abbreviate(configuration.frameworkName) override fun getAdditionalPrefix(module: ModuleDescriptor): String? { - if (module.isStdlib()) return "Kotlin" + if (module.isNativeStdlib() || module.isCommonStdlibCheckSpecificallyForIDE()) return "Kotlin" // Note: incorrect for compiler since it doesn't store ModuleInfo to ModuleDescriptor. val moduleInfo = module.getCapability(ModuleInfo.Capability) ?: return null @@ -463,15 +463,11 @@ internal fun createNamerConfiguration(configuration: ObjCExportLazy.Configuratio } } -// TODO: find proper solution. -private fun ModuleDescriptor.isStdlib(): Boolean = - this.builtIns == this || this.isCommonStdlib() || this.isNativeStdlib() - private val kotlinSequenceClassId = ClassId.topLevel(FqName("kotlin.sequences.Sequence")) -private fun ModuleDescriptor.isCommonStdlib() = - this.findClassAcrossModuleDependencies(kotlinSequenceClassId)?.module == this - +// This is a special workaround needed for resolve in the IDE. +private fun ModuleDescriptor.isCommonStdlibCheckSpecificallyForIDE() = + findClassAcrossModuleDependencies(kotlinSequenceClassId)?.module == this private val KtModifierListOwner.isPublic: Boolean get() = this.visibilityModifierTypeOrDefault() == KtTokens.PUBLIC_KEYWORD diff --git a/native/frontend/src/org/jetbrains/kotlin/descriptors/konan/utils.kt b/native/frontend/src/org/jetbrains/kotlin/descriptors/konan/utils.kt index 5aa6daafc9e..f7ca03cd426 100644 --- a/native/frontend/src/org/jetbrains/kotlin/descriptors/konan/utils.kt +++ b/native/frontend/src/org/jetbrains/kotlin/descriptors/konan/utils.kt @@ -12,8 +12,9 @@ import org.jetbrains.kotlin.konan.library.KONAN_STDLIB_NAME import org.jetbrains.kotlin.name.NativeForwardDeclarationKind import org.jetbrains.kotlin.name.Name -val NATIVE_STDLIB_MODULE_NAME = Name.special("<$KONAN_STDLIB_NAME>") +val NATIVE_STDLIB_MODULE_NAME: Name = Name.special("<$KONAN_STDLIB_NAME>") -fun ModuleDescriptor.isNativeStdlib() = name == NATIVE_STDLIB_MODULE_NAME -fun ClassDescriptor.getForwardDeclarationKindOrNull() = +fun ModuleDescriptor.isNativeStdlib(): Boolean = name == NATIVE_STDLIB_MODULE_NAME + +fun ClassDescriptor.getForwardDeclarationKindOrNull(): NativeForwardDeclarationKind? = NativeForwardDeclarationKind.packageFqNameToKind[(containingDeclaration as? PackageFragmentDescriptor)?.fqName] \ No newline at end of file