FIR: Avoid recursions while building Java enhancement scopes

This commit is contained in:
Denis Zharkov
2019-08-27 20:06:59 +03:00
parent 7f5c4d90fd
commit 6058f9d286
@@ -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<FirClassLikeSymbol<*>>
): 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<FirClassLikeSymbol<*>>
): 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<JavaClassEnhancementScope>()
private val JAVA_USE_SITE = scopeSessionKey<JavaClassUseSiteScope>()
private val JAVA_USE_SITE = scopeSessionKey<JavaClassUseSiteScope>()