From 1e1f4d447252cb780737867f9c042c68ed9a8ebc Mon Sep 17 00:00:00 2001 From: Mikhail Glukhikh Date: Mon, 24 Jun 2019 11:06:04 +0300 Subject: [PATCH] ConeTypeContext: handle "recursive type alias" situation --- .../kotlin/fir/types/ConeTypeContext.kt | 21 ++++++++++++++++++- 1 file changed, 20 insertions(+), 1 deletion(-) diff --git a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/types/ConeTypeContext.kt b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/types/ConeTypeContext.kt index 1067179f0dc..03a075c6e44 100644 --- a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/types/ConeTypeContext.kt +++ b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/types/ConeTypeContext.kt @@ -383,9 +383,28 @@ interface ConeTypeContext : TypeSystemContext, TypeSystemOptimizationContext { return types.first() // TODO: proper implementation } + private fun prepareClassLikeType( + type: ConeClassLikeType, + visited: MutableSet + ): KotlinTypeMarker { + return when (type) { + is ConeAbbreviatedType -> prepareAbbreviatedType(type, visited) + else -> type + } + } + + private fun prepareAbbreviatedType( + type: ConeAbbreviatedType, + visited: MutableSet = mutableSetOf() + ): KotlinTypeMarker { + if (type in visited) return ConeClassErrorType("Recursive type alias") + visited += type + return prepareClassLikeType(type.directExpansionType(session) ?: ConeClassErrorType("unresolved"), visited) + } + override fun prepareType(type: KotlinTypeMarker): KotlinTypeMarker { return when (type) { - is ConeAbbreviatedType -> prepareType(type.directExpansionType(session) ?: ConeClassErrorType("unresolved")) + is ConeAbbreviatedType -> prepareAbbreviatedType(type) else -> type } }