From 6058f9d286434a592e62f613f6e111d662854f0f Mon Sep 17 00:00:00 2001 From: Denis Zharkov Date: Tue, 27 Aug 2019 20:06:59 +0300 Subject: [PATCH] FIR: Avoid recursions while building Java enhancement scopes --- .../kotlin/fir/java/JavaSymbolProvider.kt | 16 +++++++++------- 1 file changed, 9 insertions(+), 7 deletions(-) diff --git a/compiler/fir/java/src/org/jetbrains/kotlin/fir/java/JavaSymbolProvider.kt b/compiler/fir/java/src/org/jetbrains/kotlin/fir/java/JavaSymbolProvider.kt index dbc7baab939..0bffda30e83 100644 --- a/compiler/fir/java/src/org/jetbrains/kotlin/fir/java/JavaSymbolProvider.kt +++ b/compiler/fir/java/src/org/jetbrains/kotlin/fir/java/JavaSymbolProvider.kt @@ -69,23 +69,25 @@ class JavaSymbolProvider( scopeSession: ScopeSession ): FirScope? { val symbol = this.getClassLikeSymbolByFqName(classId) as? FirClassSymbol ?: return null - return buildJavaEnhancementScope(useSiteSession, symbol, scopeSession) + return buildJavaEnhancementScope(useSiteSession, symbol, scopeSession, mutableSetOf()) } private fun buildJavaEnhancementScope( useSiteSession: FirSession, symbol: FirClassSymbol, - scopeSession: ScopeSession + scopeSession: ScopeSession, + visitedSymbols: MutableSet> ): JavaClassEnhancementScope { return scopeSession.getOrBuild(symbol, JAVA_ENHANCEMENT) { - JavaClassEnhancementScope(useSiteSession, buildJavaUseSiteScope(symbol.fir, useSiteSession, scopeSession)) + JavaClassEnhancementScope(useSiteSession, buildJavaUseSiteScope(symbol.fir, useSiteSession, scopeSession, visitedSymbols)) } } private fun buildJavaUseSiteScope( regularClass: FirRegularClass, useSiteSession: FirSession, - scopeSession: ScopeSession + scopeSession: ScopeSession, + visitedSymbols: MutableSet> ): JavaClassUseSiteScope { return scopeSession.getOrBuild(regularClass.symbol, JAVA_USE_SITE) { val declaredScope = scopeSession.getOrBuild(regularClass.symbol, DECLARED) { declaredMemberScope(regularClass) } @@ -94,9 +96,9 @@ class JavaSymbolProvider( .mapNotNull { useSiteSuperType -> if (useSiteSuperType is ConeClassErrorType) return@mapNotNull null val symbol = useSiteSuperType.lookupTag.toSymbol(useSiteSession) - if (symbol is FirClassSymbol) { + if (symbol is FirClassSymbol && visitedSymbols.add(symbol)) { // We need JavaClassEnhancementScope here to have already enhanced signatures from supertypes - val scope = buildJavaEnhancementScope(useSiteSession, symbol, scopeSession) + val scope = buildJavaEnhancementScope(useSiteSession, symbol, scopeSession, visitedSymbols) useSiteSuperType.wrapSubstitutionScopeIfNeed(useSiteSession, scope, scopeSession) } else { null @@ -292,4 +294,4 @@ fun FqName.topLevelName() = private val JAVA_ENHANCEMENT = scopeSessionKey() -private val JAVA_USE_SITE = scopeSessionKey() \ No newline at end of file +private val JAVA_USE_SITE = scopeSessionKey()