diff --git a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/FirSupertypesResolution.kt b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/FirSupertypesResolution.kt index 562c8b43af3..a835643fe0c 100644 --- a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/FirSupertypesResolution.kt +++ b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/FirSupertypesResolution.kt @@ -310,15 +310,18 @@ private class SupertypeComputationSession { } supertypeStatusMap[classLikeDeclaration] = SupertypeComputationStatus.Computed(resolvedTypesRefs) + newClassifiersForBreakingLoops.add(classLikeDeclaration) } + private val newClassifiersForBreakingLoops = mutableListOf>() + private val breakLoopsDfsVisited = hashSetOf>() + fun breakLoops(session: FirSession) { - val visited = hashSetOf>() val inProcess = hashSetOf>() 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() } } diff --git a/compiler/testData/diagnostics/tests/resolve/dslMarker/dslMarkerWithTypealiasRecursion.fir.kt b/compiler/testData/diagnostics/tests/resolve/dslMarker/dslMarkerWithTypealiasRecursion.fir.kt index 1f56174c324..ac479bd5be8 100644 --- a/compiler/testData/diagnostics/tests/resolve/dslMarker/dslMarkerWithTypealiasRecursion.fir.kt +++ b/compiler/testData/diagnostics/tests/resolve/dslMarker/dslMarkerWithTypealiasRecursion.fir.kt @@ -9,8 +9,8 @@ class Foo class Bar -typealias YBar = ZBar -typealias ZBar = YBar +typealias YBar = 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 {} } } -} \ No newline at end of file +} diff --git a/compiler/testData/diagnostics/tests/typealias/recursive.fir.kt b/compiler/testData/diagnostics/tests/typealias/recursive.fir.kt index ffa482edf53..e0297a7c193 100644 --- a/compiler/testData/diagnostics/tests/typealias/recursive.fir.kt +++ b/compiler/testData/diagnostics/tests/typealias/recursive.fir.kt @@ -2,10 +2,10 @@ typealias R = R typealias L = List -typealias A = B -typealias B = A +typealias A = B +typealias B = A typealias F1 = (Int) -> F2 typealias F2 = (F1) -> Int -val x: A = TODO() \ No newline at end of file +val x: A = TODO()