FIR: Avoid recursions while building Java enhancement scopes
This commit is contained in:
@@ -69,23 +69,25 @@ class JavaSymbolProvider(
|
|||||||
scopeSession: ScopeSession
|
scopeSession: ScopeSession
|
||||||
): FirScope? {
|
): FirScope? {
|
||||||
val symbol = this.getClassLikeSymbolByFqName(classId) as? FirClassSymbol ?: return null
|
val symbol = this.getClassLikeSymbolByFqName(classId) as? FirClassSymbol ?: return null
|
||||||
return buildJavaEnhancementScope(useSiteSession, symbol, scopeSession)
|
return buildJavaEnhancementScope(useSiteSession, symbol, scopeSession, mutableSetOf())
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun buildJavaEnhancementScope(
|
private fun buildJavaEnhancementScope(
|
||||||
useSiteSession: FirSession,
|
useSiteSession: FirSession,
|
||||||
symbol: FirClassSymbol,
|
symbol: FirClassSymbol,
|
||||||
scopeSession: ScopeSession
|
scopeSession: ScopeSession,
|
||||||
|
visitedSymbols: MutableSet<FirClassLikeSymbol<*>>
|
||||||
): JavaClassEnhancementScope {
|
): JavaClassEnhancementScope {
|
||||||
return scopeSession.getOrBuild(symbol, JAVA_ENHANCEMENT) {
|
return scopeSession.getOrBuild(symbol, JAVA_ENHANCEMENT) {
|
||||||
JavaClassEnhancementScope(useSiteSession, buildJavaUseSiteScope(symbol.fir, useSiteSession, scopeSession))
|
JavaClassEnhancementScope(useSiteSession, buildJavaUseSiteScope(symbol.fir, useSiteSession, scopeSession, visitedSymbols))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun buildJavaUseSiteScope(
|
private fun buildJavaUseSiteScope(
|
||||||
regularClass: FirRegularClass,
|
regularClass: FirRegularClass,
|
||||||
useSiteSession: FirSession,
|
useSiteSession: FirSession,
|
||||||
scopeSession: ScopeSession
|
scopeSession: ScopeSession,
|
||||||
|
visitedSymbols: MutableSet<FirClassLikeSymbol<*>>
|
||||||
): JavaClassUseSiteScope {
|
): JavaClassUseSiteScope {
|
||||||
return scopeSession.getOrBuild(regularClass.symbol, JAVA_USE_SITE) {
|
return scopeSession.getOrBuild(regularClass.symbol, JAVA_USE_SITE) {
|
||||||
val declaredScope = scopeSession.getOrBuild(regularClass.symbol, DECLARED) { declaredMemberScope(regularClass) }
|
val declaredScope = scopeSession.getOrBuild(regularClass.symbol, DECLARED) { declaredMemberScope(regularClass) }
|
||||||
@@ -94,9 +96,9 @@ class JavaSymbolProvider(
|
|||||||
.mapNotNull { useSiteSuperType ->
|
.mapNotNull { useSiteSuperType ->
|
||||||
if (useSiteSuperType is ConeClassErrorType) return@mapNotNull null
|
if (useSiteSuperType is ConeClassErrorType) return@mapNotNull null
|
||||||
val symbol = useSiteSuperType.lookupTag.toSymbol(useSiteSession)
|
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
|
// 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)
|
useSiteSuperType.wrapSubstitutionScopeIfNeed(useSiteSession, scope, scopeSession)
|
||||||
} else {
|
} else {
|
||||||
null
|
null
|
||||||
@@ -292,4 +294,4 @@ fun FqName.topLevelName() =
|
|||||||
|
|
||||||
|
|
||||||
private val JAVA_ENHANCEMENT = scopeSessionKey<JavaClassEnhancementScope>()
|
private val JAVA_ENHANCEMENT = scopeSessionKey<JavaClassEnhancementScope>()
|
||||||
private val JAVA_USE_SITE = scopeSessionKey<JavaClassUseSiteScope>()
|
private val JAVA_USE_SITE = scopeSessionKey<JavaClassUseSiteScope>()
|
||||||
|
|||||||
Reference in New Issue
Block a user