@@ -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