@@ -14,6 +14,7 @@ import org.jetbrains.kotlin.descriptors.ClassDescriptor
1414import org.jetbrains.kotlin.descriptors.ModuleDescriptor
1515import org.jetbrains.kotlin.descriptors.SourceFile
1616import org.jetbrains.kotlin.resolve.scopes.MemberScope
17+ import kotlinx.coroutines.*
1718
1819abstract class ObjCExportHeaderGenerator @InternalKotlinNativeApi constructor(
1920 val moduleDescriptors : List <ModuleDescriptor >,
@@ -23,6 +24,7 @@ abstract class ObjCExportHeaderGenerator @InternalKotlinNativeApi constructor(
2324 val objcExportBlockExplicitParameterNames : Boolean ,
2425 problemCollector : ObjCExportProblemCollector ,
2526) {
27+ private val mutex = Mutex ()
2628 private val stubs = mutableListOf<ObjCExportStub >()
2729
2830 private val classForwardDeclarations = linkedSetOf<ObjCClassForwardDeclaration >()
@@ -117,30 +119,38 @@ abstract class ObjCExportHeaderGenerator @InternalKotlinNativeApi constructor(
117119 .flatMap { it.getPackageFragments() }
118120 .makePackagesOrderStable()
119121
120- packageFragments.forEach { packageFragment ->
121- packageFragment.getMemberScope().getContributedDescriptors()
122- .asSequence()
123- .filterIsInstance<CallableMemberDescriptor >()
124- .filter { mapper.shouldBeExposed(it) }
125- .forEach {
126- val classDescriptor = getClassIfCategory(it)
127- if (classDescriptor == null ) {
128- topLevel.getOrPut(it.findSourceFile(), { mutableListOf () }) + = it
129- } else {
130- // If a class is hidden from Objective-C API then it is meaningless
131- // to export its extensions.
132- if (! classDescriptor.isHiddenFromObjC()) {
133- extensions.getOrPut(classDescriptor, { mutableListOf () }) + = it
122+ val classesToTranslate = mutableListOf<ClassDescriptor >()
123+
124+ runBlocking {
125+ packageFragments.forEach { packageFragment ->
126+ val memberScope = packageFragment.getMemberScope()
127+
128+ launch(Dispatchers .Default ) {
129+ memberScope.getContributedDescriptors()
130+ .asSequence()
131+ .filterIsInstance<CallableMemberDescriptor >()
132+ .filter { mapper.shouldBeExposed(it) }
133+ .forEach {
134+ val classDescriptor = getClassIfCategory(it)
135+ if (classDescriptor == null ) {
136+ mutex.withLock {
137+ topLevel.getOrPut(it.findSourceFile(), { mutableListOf () }) + = it
138+ }
139+ } else {
140+ // If a class is hidden from Objective-C API then it is meaningless
141+ // to export its extensions.
142+ if (! classDescriptor.isHiddenFromObjC()) {
143+ mutex.withLock {
144+ extnsions.getOrPut(classDescriptor, { mutableListOf () }) + = it
145+ }
146+ }
147+ }
134148 }
135- }
136149 }
150+ }
137151 }
138152
139- val classesToTranslate = mutableListOf<ClassDescriptor >()
140-
141- packageFragments.forEach { packageFragment ->
142- packageFragment.getMemberScope().collectClasses(classesToTranslate)
143- }
153+ memberScope.collectClasses(classesToTranslate)
144154
145155 classesToTranslate.makeClassesOrderStable().forEach { translateClass(it) }
146156
0 commit comments