diff --git a/native/objcexport-header-generator/impl/k1/build.gradle.kts b/native/objcexport-header-generator/impl/k1/build.gradle.kts index 4462d32b3cb5a..51632572a354a 100644 --- a/native/objcexport-header-generator/impl/k1/build.gradle.kts +++ b/native/objcexport-header-generator/impl/k1/build.gradle.kts @@ -8,7 +8,12 @@ sourceSets { "test" { projectDefault() } } +repositories { + mavenCentral() +} + dependencies { + implementation(libs.kotlinx.coroutines.core) api(project(":native:objcexport-header-generator")) testImplementation(project(":compiler:cli-base")) implementation(project(":compiler:ir.backend.common")) diff --git a/native/objcexport-header-generator/impl/k1/src/org/jetbrains/kotlin/backend/konan/objcexport/ObjCExportHeaderGenerator.kt b/native/objcexport-header-generator/impl/k1/src/org/jetbrains/kotlin/backend/konan/objcexport/ObjCExportHeaderGenerator.kt index 1b60e07c1b579..fef46ed1365e8 100644 --- a/native/objcexport-header-generator/impl/k1/src/org/jetbrains/kotlin/backend/konan/objcexport/ObjCExportHeaderGenerator.kt +++ b/native/objcexport-header-generator/impl/k1/src/org/jetbrains/kotlin/backend/konan/objcexport/ObjCExportHeaderGenerator.kt @@ -14,6 +14,7 @@ import org.jetbrains.kotlin.descriptors.ClassDescriptor import org.jetbrains.kotlin.descriptors.ModuleDescriptor import org.jetbrains.kotlin.descriptors.SourceFile import org.jetbrains.kotlin.resolve.scopes.MemberScope +import kotlinx.coroutines.* abstract class ObjCExportHeaderGenerator @InternalKotlinNativeApi constructor( val moduleDescriptors: List, @@ -117,32 +118,42 @@ abstract class ObjCExportHeaderGenerator @InternalKotlinNativeApi constructor( .flatMap { it.getPackageFragments() } .makePackagesOrderStable() - packageFragments.forEach { packageFragment -> - packageFragment.getMemberScope().getContributedDescriptors() - .asSequence() - .filterIsInstance() - .filter { mapper.shouldBeExposed(it) } - .forEach { - val classDescriptor = getClassIfCategory(it) - if (classDescriptor == null) { - topLevel.getOrPut(it.findSourceFile(), { mutableListOf() }) += it - } else { - // If a class is hidden from Objective-C API then it is meaningless - // to export its extensions. - if (!classDescriptor.isHiddenFromObjC()) { - extensions.getOrPut(classDescriptor, { mutableListOf() }) += it + val classesToTranslate = mutableListOf>() + + runBlocking { + packageFragments.forEach { packageFragment -> + val memberScope = packageFragment.getMemberScope() + + // Keep Order + val inOrderCollector = mutableListOf() + classesToTranslate.add(inOrderCollector) + + launch(Dispatchers.Default) { + memberScope.getContributedDescriptors() + .asSequence() + .filterIsInstance() + .filter { mapper.shouldBeExposed(it) } + .forEach { + val classDescriptor = getClassIfCategory(it) + if (classDescriptor == null) { + topLevel.getOrPut(it.findSourceFile(), { mutableListOf() }) += it + } else { + // If a class is hidden from Objective-C API then it is meaningless + // to export its extensions. + if (!classDescriptor.isHiddenFromObjC()) { + extensions.getOrPut(classDescriptor, { mutableListOf() }) += it + } + } } - } } - } - - val classesToTranslate = mutableListOf() - packageFragments.forEach { packageFragment -> - packageFragment.getMemberScope().collectClasses(classesToTranslate) + launch(Dispatchers.Default) { + memberScope.collectClasses(inOrderCollector) + } + } } - classesToTranslate.makeClassesOrderStable().forEach { translateClass(it) } + classesToTranslate.flatten().makeClassesOrderStable().forEach { translateClass(it) } extensions.makeCategoriesOrderStable().forEach { (classDescriptor, declarations) -> generateExtensions(classDescriptor, declarations)