diff --git a/compiler/util-klib-metadata/src/org/jetbrains/kotlin/library/metadata/KlibResolvedModuleDescriptorsFactory.kt b/compiler/util-klib-metadata/src/org/jetbrains/kotlin/library/metadata/KlibResolvedModuleDescriptorsFactory.kt index 5b7ac637a9b..7f0fb20e856 100644 --- a/compiler/util-klib-metadata/src/org/jetbrains/kotlin/library/metadata/KlibResolvedModuleDescriptorsFactory.kt +++ b/compiler/util-klib-metadata/src/org/jetbrains/kotlin/library/metadata/KlibResolvedModuleDescriptorsFactory.kt @@ -32,7 +32,8 @@ interface KlibResolvedModuleDescriptorsFactory { languageVersionSettings: LanguageVersionSettings, friendModuleFiles: Set, includedLibraryFiles: Set, - additionalDependencyModules: Iterable + additionalDependencyModules: Iterable, + isForMetadataCompilation: Boolean, ): KotlinResolvedModuleDescriptors } 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 9fc38a8493f..7b8c4ac278a 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 @@ -190,6 +190,7 @@ class KlibMetadataModuleDescriptorFactoryImpl( } ?: provider } + // Used from IDEA plugin. fun createForwardDeclarationHackPackagePartProvider( storageManager: StorageManager, module: ModuleDescriptorImpl @@ -200,7 +201,8 @@ class KlibMetadataModuleDescriptorFactoryImpl( module, fqName, Name.identifier(supertypeName), - classKind + classKind, + isExpect = true ) val packageFragmentProvider = PackageFragmentProviderImpl( diff --git a/compiler/util-klib-metadata/src/org/jetbrains/kotlin/library/metadata/impl/KlibResolvedModuleDescriptorsFactoryImpl.kt b/compiler/util-klib-metadata/src/org/jetbrains/kotlin/library/metadata/impl/KlibResolvedModuleDescriptorsFactoryImpl.kt index bd192b71f6d..dbf038b23f0 100644 --- a/compiler/util-klib-metadata/src/org/jetbrains/kotlin/library/metadata/impl/KlibResolvedModuleDescriptorsFactoryImpl.kt +++ b/compiler/util-klib-metadata/src/org/jetbrains/kotlin/library/metadata/impl/KlibResolvedModuleDescriptorsFactoryImpl.kt @@ -40,7 +40,8 @@ class KlibResolvedModuleDescriptorsFactoryImpl( languageVersionSettings: LanguageVersionSettings, friendModuleFiles: Set, includedLibraryFiles: Set, - additionalDependencyModules: Iterable + additionalDependencyModules: Iterable, + isForMetadataCompilation: Boolean, ): KotlinResolvedModuleDescriptors { val moduleDescriptors = mutableListOf() @@ -69,7 +70,20 @@ class KlibResolvedModuleDescriptorsFactoryImpl( } } - val forwardDeclarationsModule = createForwardDeclarationsModule(builtIns, storageManager) + val forwardDeclarationsModule = createForwardDeclarationsModule( + builtIns, + storageManager, + // If we are compiling metadata, make synthetic forward declarations `expect`, + // because otherwise `getFirstClassifierDiscriminateHeaders` would prefer it over a + // "real" `expect` declaration from a commonized interop library, which would ruin + // the whole idea of using synthetic forward declarations only when no proper definitions + // are found. + // + // If we are compiling for the actual native platform, continue using non-expect + // forward declarations (to prevent getting non-actualized expects into the backend, + // and to prevent related klib signature changes). + isExpect = isForMetadataCompilation, + ) // Set inter-dependencies between module descriptors, add forwarding declarations module. for (module in moduleDescriptors) { @@ -88,7 +102,8 @@ class KlibResolvedModuleDescriptorsFactoryImpl( fun createForwardDeclarationsModule( builtIns: KotlinBuiltIns?, - storageManager: StorageManager + storageManager: StorageManager, + isExpect: Boolean ): ModuleDescriptorImpl { val module = createDescriptorOptionalBuiltsIns(FORWARD_DECLARATIONS_MODULE_NAME, storageManager, builtIns, SyntheticModulesOrigin) @@ -99,7 +114,8 @@ class KlibResolvedModuleDescriptorsFactoryImpl( module, fqName, Name.identifier(supertypeName), - classKind + classKind, + isExpect ) val packageFragmentProvider = PackageFragmentProviderImpl( @@ -150,7 +166,8 @@ class ForwardDeclarationsPackageFragmentDescriptor( module: ModuleDescriptor, fqName: FqName, supertypeName: Name, - classKind: ClassKind + classKind: ClassKind, + isExpect: Boolean ) : PackageFragmentDescriptorImpl(module, fqName) { private val memberScope = object : MemberScopeImpl() { @@ -166,7 +183,7 @@ class ForwardDeclarationsPackageFragmentDescriptor( } private fun createDeclaration(name: Name): ClassDescriptor { - return ClassDescriptorImpl( + return object : ClassDescriptorImpl( this@ForwardDeclarationsPackageFragmentDescriptor, name, Modality.FINAL, @@ -175,7 +192,9 @@ class ForwardDeclarationsPackageFragmentDescriptor( SourceElement.NO_SOURCE, false, LockBasedStorageManager.NO_LOCKS - ).apply { + ) { + override fun isExpect(): Boolean = isExpect + }.apply { this.initialize(MemberScope.Empty, emptySet(), null) } } diff --git a/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/TopDownAnalyzerFacadeForKonan.kt b/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/TopDownAnalyzerFacadeForKonan.kt index ecd4d8009da..ea4b10c5c47 100644 --- a/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/TopDownAnalyzerFacadeForKonan.kt +++ b/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/TopDownAnalyzerFacadeForKonan.kt @@ -41,7 +41,8 @@ internal object TopDownAnalyzerFacadeForKonan { val resolvedModuleDescriptors = nativeFactories.DefaultResolvedDescriptorsFactory.createResolved( config.resolvedLibraries, projectContext.storageManager, module.builtIns, config.languageVersionSettings, - config.friendModuleFiles, config.resolve.includedLibraries.map { it.libraryFile }.toSet(), listOf(module)) + config.friendModuleFiles, config.resolve.includedLibraries.map { it.libraryFile }.toSet(), listOf(module), + isForMetadataCompilation = config.metadataKlib) val additionalPackages = mutableListOf() if (!module.isNativeStdlib()) {