diff --git a/backend.native/cli.bc/src/org/jetbrains/kotlin/cli/bc/K2Native.kt b/backend.native/cli.bc/src/org/jetbrains/kotlin/cli/bc/K2Native.kt index 2de4860a640..c84d843c4b4 100644 --- a/backend.native/cli.bc/src/org/jetbrains/kotlin/cli/bc/K2Native.kt +++ b/backend.native/cli.bc/src/org/jetbrains/kotlin/cli/bc/K2Native.kt @@ -283,8 +283,10 @@ private fun selectExportedLibraries( ): List { val exportedLibraries = arguments.exportedLibraries?.toList().orEmpty() - return if (exportedLibraries.isNotEmpty() && outputKind != CompilerOutputKind.FRAMEWORK) { - configuration.report(STRONG_WARNING, "-Xexport-library is only supported when producing frameworks, " + + return if (exportedLibraries.isNotEmpty() && outputKind != CompilerOutputKind.FRAMEWORK && + outputKind != CompilerOutputKind.STATIC && outputKind != CompilerOutputKind.DYNAMIC) { + configuration.report(STRONG_WARNING, + "-Xexport-library is only supported when producing frameworks or native libraries, " + "but the compiler is producing ${outputKind.name.toLowerCase()}") emptyList() diff --git a/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/CAdapterGenerator.kt b/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/CAdapterGenerator.kt index c6b249a668f..ee04df669c4 100644 --- a/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/CAdapterGenerator.kt +++ b/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/CAdapterGenerator.kt @@ -579,8 +579,9 @@ internal class CAdapterGenerator( } override fun visitPackageViewDescriptor(descriptor: PackageViewDescriptor, ignored: Void?): Boolean { - if (descriptor.module != context.moduleDescriptor) return true - val fragments = descriptor.module.getPackage(FqName.ROOT).fragments.filter { it.module == context.moduleDescriptor } + if (descriptor.module !in moduleDescriptors) return true + val fragments = descriptor.module.getPackage(FqName.ROOT).fragments.filter { + it.module in moduleDescriptors } visitChildren(fragments) return true } @@ -605,15 +606,10 @@ internal class CAdapterGenerator( private val seenPackageFragments = mutableSetOf() private var currentPackageFragments: List = emptyList() + private val packageScopes = mutableMapOf() override fun visitModuleDeclaration(descriptor: ModuleDescriptor, ignored: Void?): Boolean { - currentPackageFragments = descriptor.getPackageFragments().sortedWith( - Comparator { o1, o2 -> - o1.fqName.toString().compareTo(o2.fqName.toString()) - }) - seenPackageFragments.clear() - descriptor.getPackage(FqName.ROOT).accept(this, null) - return true + TODO("Shall not be called directly") } override fun visitTypeAliasDescriptor(descriptor: TypeAliasDescriptor, ignored: Void?): Boolean { @@ -624,8 +620,11 @@ internal class CAdapterGenerator( override fun visitPackageFragmentDescriptor(descriptor: PackageFragmentDescriptor, ignored: Void?): Boolean { val fqName = descriptor.fqName val name = if (fqName.isRoot) "root" else translateName(fqName.shortName().asString()) - val packageScope = ExportedElementScope(ScopeKind.PACKAGE, name) - scopes.last().scopes += packageScope + val packageScope = packageScopes.getOrPut(name) { + val scope = ExportedElementScope(ScopeKind.PACKAGE, name) + scopes.last().scopes += scope + scope + } scopes.push(packageScope) visitChildren(DescriptorUtils.getAllDescriptors(descriptor.getMemberScope())) for (currentPackageFragment in currentPackageFragments) { @@ -639,9 +638,21 @@ internal class CAdapterGenerator( return true } + + private val moduleDescriptors = mutableSetOf() + fun generateBindings() { scopes.push(ExportedElementScope(ScopeKind.TOP, "kotlin")) - context.moduleDescriptor.accept(this, null) + moduleDescriptors += context.moduleDescriptor + moduleDescriptors += context.getExportedDependencies() + + currentPackageFragments = moduleDescriptors.flatMap { it.getPackageFragments() }.toSet().sortedWith( + Comparator { o1, o2 -> + o1.fqName.toString().compareTo(o2.fqName.toString()) + }) + + context.moduleDescriptor.getPackage(FqName.ROOT).accept(this, null) + // TODO: add few predefined types. listOf( // context.builtIns.anyType, diff --git a/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/ToplevelPhases.kt b/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/ToplevelPhases.kt index 258dfeba76b..bcadc0a5a8d 100644 --- a/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/ToplevelPhases.kt +++ b/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/ToplevelPhases.kt @@ -80,7 +80,8 @@ internal val psiToIrPhase = konanUnitPhase( konanLibrary.irHeader?.let { header -> // TODO: consider skip deserializing explicitly exported declarations for libraries. // Now it's not valid because of all dependencies that must be computed. - val deserializationStrategy = DeserializationStrategy.EXPLICITLY_EXPORTED + val deserializationStrategy = if (getExportedDependencies().contains(dependency)) + DeserializationStrategy.ALL else DeserializationStrategy.EXPLICITLY_EXPORTED modules[konanLibrary.libraryName] = deserializer.deserializeIrModuleHeader(dependency, header, deserializationStrategy) } }