[Native] Simplify *.isNativeStdlib() checks as much as possible

...still preserving their reliability.
This commit is contained in:
Dmitriy Dolovov
2023-11-09 16:03:23 +01:00
committed by Space Team
parent 6a0a64eb6d
commit 4892a81178
5 changed files with 22 additions and 41 deletions
@@ -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)
@@ -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<LLVMModuleRef>,
val additionalModules: List<LLVMModuleRef>
@@ -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 }
@@ -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"
}
@@ -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
@@ -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]