diff --git a/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/transformers/LLFirSupertypeLazyResolver.kt b/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/transformers/LLFirSupertypeLazyResolver.kt index c02b50b3a0b..94572e95e05 100644 --- a/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/transformers/LLFirSupertypeLazyResolver.kt +++ b/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/transformers/LLFirSupertypeLazyResolver.kt @@ -188,7 +188,7 @@ private class LLFirSuperTypeTargetResolver( } private fun FirClassLikeDeclaration.asResolveTarget(): LLFirSingleResolveTarget? { - return takeIf { it.canHaveLoopInSupertypesHierarchy(session, forceSkipResolvedClasses = true) } + return takeIf { it.canHaveLoopInSupertypesHierarchy(session) } ?.tryCollectDesignationWithFile() ?.asResolveTarget() } @@ -253,45 +253,20 @@ private class LLFirSuperTypeTargetResolver( * means that this class can't have loop with our class, because in this case this declaration will be present * in the current supertypes resolve session */ -private fun FirClassLikeDeclaration.canHaveLoopInSupertypesHierarchy( - session: FirSession, - forceSkipResolvedClasses: Boolean = false, -): Boolean = when { +private fun FirClassLikeDeclaration.canHaveLoopInSupertypesHierarchy(session: FirSession): Boolean = when { this is FirJavaClass -> origin is FirDeclarationOrigin.Java.Source + origin !is FirDeclarationOrigin.Source -> false resolvePhase < FirResolvePhase.SUPER_TYPES -> true - // We should still process resolved if it has loop in super type refs, because we can be part of this cycle - !forceSkipResolvedClasses && this is FirRegularClass -> hasLoopInSupertypeRefs(session) - !forceSkipResolvedClasses && this is FirTypeAlias -> hasLoopInSupertypeRefs(session) - else -> false + this is FirRegularClass && superTypeRefs.any(FirTypeRef::isLoopedSupertypeRef) -> true + this is FirTypeAlias && expandedTypeRef.isLoopedSupertypeRef -> true + else -> outerClass(session)?.canHaveLoopInSupertypesHierarchy(session) == true } private fun FirClassLikeDeclaration.outerClass(session: FirSession): FirRegularClass? = symbol.classId.parentClassId?.let { parentClassId -> session.symbolProvider.getClassLikeSymbolByClassId(parentClassId)?.fir as? FirRegularClass } -/** - * The class must be already resolved - */ -private fun FirRegularClass.hasLoopInSupertypeRefs(session: FirSession): Boolean { - if (superTypeRefs.any(FirTypeRef::isLoopedSupertypeRef)) { - return true - } - - return outerClass(session)?.hasLoopInSupertypeRefs(session) == true -} - -/** - * The typealias must be already resolved - */ -private fun FirTypeAlias.hasLoopInSupertypeRefs(session: FirSession): Boolean { - if (expandedTypeRef.isLoopedSupertypeRef) { - return true - } - - return outerClass(session)?.hasLoopInSupertypeRefs(session) == true -} - private val FirTypeRef.isLoopedSupertypeRef: Boolean get() { if (this !is FirErrorTypeRef) return false