FIR: add bfs helper and use it
It's also used in Kotlin quickfixes in intellij repo
This commit is contained in:
committed by
Ilya Kirillov
parent
64a0d492b9
commit
dbb0496d23
+2
-8
@@ -46,6 +46,7 @@ import org.jetbrains.kotlin.psi.KtElement
|
|||||||
import org.jetbrains.kotlin.psi.KtTypeReference
|
import org.jetbrains.kotlin.psi.KtTypeReference
|
||||||
import org.jetbrains.kotlin.types.TypeApproximatorConfiguration
|
import org.jetbrains.kotlin.types.TypeApproximatorConfiguration
|
||||||
import org.jetbrains.kotlin.types.model.CaptureStatus
|
import org.jetbrains.kotlin.types.model.CaptureStatus
|
||||||
|
import org.jetbrains.kotlin.util.bfs
|
||||||
|
|
||||||
internal class KtFirTypeProvider(
|
internal class KtFirTypeProvider(
|
||||||
override val analysisSession: KtFirAnalysisSession,
|
override val analysisSession: KtFirAnalysisSession,
|
||||||
@@ -176,14 +177,7 @@ internal class KtFirTypeProvider(
|
|||||||
|
|
||||||
override fun getAllSuperTypes(type: KtType, shouldApproximate: Boolean): List<KtType> {
|
override fun getAllSuperTypes(type: KtType, shouldApproximate: Boolean): List<KtType> {
|
||||||
require(type is KtFirType)
|
require(type is KtFirType)
|
||||||
val queue = type.coneType.getDirectSuperTypes(shouldApproximate).toCollection(ArrayDeque())
|
return listOf(type.coneType).bfs { it.getDirectSuperTypes(shouldApproximate).iterator() }.mapTo(mutableListOf()) { it.asKtType() }
|
||||||
return buildSet {
|
|
||||||
while (queue.isNotEmpty()) {
|
|
||||||
val current = queue.removeFirst()
|
|
||||||
if (!add(current)) continue
|
|
||||||
queue.addAll(current.getDirectSuperTypes(shouldApproximate))
|
|
||||||
}
|
|
||||||
}.map { it.asKtType() }
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -0,0 +1,23 @@
|
|||||||
|
/*
|
||||||
|
* Copyright 2010-2021 JetBrains s.r.o. and Kotlin Programming Language contributors.
|
||||||
|
* Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file.
|
||||||
|
*/
|
||||||
|
|
||||||
|
package org.jetbrains.kotlin.util
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Perform BFS on the given collection with neighbors created by the given function.
|
||||||
|
*/
|
||||||
|
fun <T> Collection<T>.bfs(getNeighbors: (T) -> Iterator<T>): Sequence<T> {
|
||||||
|
val queue = ArrayDeque(this)
|
||||||
|
val visited = mutableSetOf<T>()
|
||||||
|
return sequence {
|
||||||
|
while (queue.isNotEmpty()) {
|
||||||
|
val current = queue.removeFirst()
|
||||||
|
if (current in visited) continue
|
||||||
|
visited.add(current)
|
||||||
|
yield(current)
|
||||||
|
getNeighbors(current).forEach(queue::add)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user