FIR: Optimize SupertypeComputationSession::breakLoops

This commit is contained in:
Denis Zharkov
2020-01-29 12:33:55 +03:00
parent a44fa8db50
commit ac2b5beb4e
3 changed files with 14 additions and 10 deletions
@@ -310,15 +310,18 @@ private class SupertypeComputationSession {
}
supertypeStatusMap[classLikeDeclaration] = SupertypeComputationStatus.Computed(resolvedTypesRefs)
newClassifiersForBreakingLoops.add(classLikeDeclaration)
}
private val newClassifiersForBreakingLoops = mutableListOf<FirClassLikeDeclaration<*>>()
private val breakLoopsDfsVisited = hashSetOf<FirClassLikeDeclaration<*>>()
fun breakLoops(session: FirSession) {
val visited = hashSetOf<FirClassLikeDeclaration<*>>()
val inProcess = hashSetOf<FirClassLikeDeclaration<*>>()
fun dfs(classLikeDeclaration: FirClassLikeDeclaration<*>) {
if (classLikeDeclaration in breakLoopsDfsVisited) return
val supertypeComputationStatus = supertypeStatusMap[classLikeDeclaration] ?: return
if (classLikeDeclaration in visited) return
if (classLikeDeclaration in inProcess) return
inProcess.add(classLikeDeclaration)
@@ -351,12 +354,13 @@ private class SupertypeComputationSession {
}
inProcess.remove(classLikeDeclaration)
visited.add(classLikeDeclaration)
breakLoopsDfsVisited.add(classLikeDeclaration)
}
for (classifier in supertypeStatusMap.keys) {
for (classifier in newClassifiersForBreakingLoops) {
dfs(classifier)
}
newClassifiersForBreakingLoops.clear()
}
}
@@ -9,8 +9,8 @@ class Foo
class Bar
typealias YBar = ZBar
typealias ZBar = <!OTHER_ERROR!>YBar<!>
typealias YBar = <!OTHER_ERROR!>ZBar<!>
typealias ZBar = YBar
fun Foo.foo(body: Foo.() -> Unit) = body()
fun Foo.zbar(body: ZBar.() -> Unit) = Bar().body()
@@ -21,4 +21,4 @@ fun test() {
foo {}
}
}
}
}
@@ -2,10 +2,10 @@ typealias R = <!OTHER_ERROR!>R<!>
typealias L = List<L>
typealias A = B
typealias B = <!OTHER_ERROR!>A<!>
typealias A = <!OTHER_ERROR!>B<!>
typealias B = A
typealias F1 = (Int) -> F2
typealias F2 = (F1) -> Int
val x: A = TODO()
val x: A = TODO()