Skip to content

Commit ffd1a72

Browse files
committed
improve recursive descriptor extraction
1 parent e0583a3 commit ffd1a72

File tree

1 file changed

+14
-17
lines changed

1 file changed

+14
-17
lines changed

modules/kxs-ts-gen-core/src/commonMain/kotlin/dev.adamko.kxstsgen/processSerializers.kt

Lines changed: 14 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -40,24 +40,21 @@ fun interface SerializerDescriptorsExtractor {
4040
}
4141

4242
private val extractedDescriptors by MutableMapWithDefaultPut<SerialDescriptor, Sequence<SerialDescriptor>> { descriptor ->
43-
sequence {
44-
val seen = mutableSetOf<SerialDescriptor>()
45-
val deque = ArrayDeque<SerialDescriptor>()
46-
deque.addLast(descriptor)
47-
48-
while (deque.isNotEmpty()) {
49-
val next = deque.removeFirst()
50-
51-
val nextElementDescriptors = elementDescriptors.getValue(next)
52-
53-
nextElementDescriptors
54-
.filter { it !in seen }
55-
.forEach { deque.addLast(it) }
43+
extractDescriptors(descriptor).asSequence()
44+
}
5645

57-
seen.add(next)
58-
yield(next)
59-
}
60-
}.distinct()
46+
private tailrec fun extractDescriptors(
47+
current: SerialDescriptor? = null,
48+
queue: ArrayDeque<SerialDescriptor> = ArrayDeque(),
49+
extracted: Set<SerialDescriptor> = emptySet(),
50+
): Set<SerialDescriptor> {
51+
return if (current == null) {
52+
extracted
53+
} else {
54+
val currentDescriptors = elementDescriptors.getValue(current)
55+
queue.addAll(currentDescriptors - extracted)
56+
extractDescriptors(queue.removeFirstOrNull(), queue, extracted + current)
57+
}
6158
}
6259

6360
private val elementDescriptors by MutableMapWithDefaultPut<SerialDescriptor, Iterable<SerialDescriptor>> { descriptor ->

0 commit comments

Comments
 (0)