From 7f5c4d90fd7d4799b9ca38efba67b9a992ef810f Mon Sep 17 00:00:00 2001 From: Denis Zharkov Date: Tue, 27 Aug 2019 19:13:16 +0300 Subject: [PATCH] FIR: make "collectSuperTypes" recursion-resistant --- .../jetbrains/kotlin/fir/resolve/SupertypeUtils.kt | 14 +++++++++++--- 1 file changed, 11 insertions(+), 3 deletions(-) diff --git a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/SupertypeUtils.kt b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/SupertypeUtils.kt index 5169ea4ef1c..e71580b9b05 100644 --- a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/SupertypeUtils.kt +++ b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/SupertypeUtils.kt @@ -27,7 +27,7 @@ fun lookupSuperTypes( useSiteSession: FirSession ): List { return mutableListOf().also { - klass.symbol.collectSuperTypes(it, deep, lookupInterfaces, useSiteSession) + klass.symbol.collectSuperTypes(it, mutableSetOf(), deep, lookupInterfaces, useSiteSession) } } @@ -110,10 +110,12 @@ private tailrec fun ConeClassLikeType.computePartialExpansion(useSiteSession: Fi private fun ConeClassifierSymbol.collectSuperTypes( list: MutableList, + visitedSymbols: MutableSet, deep: Boolean, lookupInterfaces: Boolean, useSiteSession: FirSession ) { + if (!visitedSymbols.add(this)) return when (this) { is FirClassSymbol -> { val superClassTypes = @@ -125,13 +127,19 @@ private fun ConeClassifierSymbol.collectSuperTypes( if (deep) superClassTypes.forEach { if (it !is ConeClassErrorType) { - it.lookupTag.toSymbol(useSiteSession)?.collectSuperTypes(list, deep, lookupInterfaces, useSiteSession) + it.lookupTag.toSymbol(useSiteSession)?.collectSuperTypes( + list, + visitedSymbols, + deep, + lookupInterfaces, + useSiteSession + ) } } } is FirTypeAliasSymbol -> { val expansion = fir.expandedConeType?.computePartialExpansion(useSiteSession) ?: return - expansion.lookupTag.toSymbol(useSiteSession)?.collectSuperTypes(list, deep, lookupInterfaces, useSiteSession) + expansion.lookupTag.toSymbol(useSiteSession)?.collectSuperTypes(list, visitedSymbols, deep, lookupInterfaces, useSiteSession) } else -> error("?!id:1") }