FIR: resolve conflicts on multiple inheritance of fun with same signature

This commit is contained in:
Simon Ogorodnik
2019-04-23 04:21:11 +03:00
committed by Mikhail Glukhikh
parent 84fbf4ec25
commit 6a0e3371ae
8 changed files with 155 additions and 78 deletions
@@ -21,7 +21,7 @@ import org.jetbrains.kotlin.fir.resolve.*
import org.jetbrains.kotlin.fir.resolve.transformers.firUnsafe
import org.jetbrains.kotlin.fir.scopes.FirScope
import org.jetbrains.kotlin.fir.scopes.impl.FirClassDeclaredMemberScope
import org.jetbrains.kotlin.fir.scopes.impl.FirCompositeScope
import org.jetbrains.kotlin.fir.scopes.impl.FirSuperTypeScope
import org.jetbrains.kotlin.fir.symbols.CallableId
import org.jetbrains.kotlin.fir.symbols.ConeCallableSymbol
import org.jetbrains.kotlin.fir.symbols.ConeClassLikeSymbol
@@ -86,20 +86,21 @@ class JavaSymbolProvider(
scopeSession: ScopeSession
): JavaClassUseSiteScope {
return scopeSession.getOrBuild(regularClass.symbol, JAVA_USE_SITE) {
val superTypeEnhancementScope = FirCompositeScope(mutableListOf())
val declaredScope = scopeSession.getOrBuild(regularClass.symbol, DECLARED) { FirClassDeclaredMemberScope(regularClass) }
lookupSuperTypes(regularClass, lookupInterfaces = true, deep = false, useSiteSession = useSiteSession)
.mapNotNullTo(superTypeEnhancementScope.scopes) { useSiteSuperType ->
if (useSiteSuperType is ConeClassErrorType) return@mapNotNullTo null
val symbol = useSiteSuperType.lookupTag.toSymbol(useSiteSession)
if (symbol is FirClassSymbol) {
// We need JavaClassEnhancementScope here to have already enhanced signatures from supertypes
buildJavaEnhancementScope(useSiteSession, symbol, scopeSession)
} else {
null
val superTypeEnhancementScopes =
lookupSuperTypes(regularClass, lookupInterfaces = true, deep = false, useSiteSession = useSiteSession)
.mapNotNull { useSiteSuperType ->
if (useSiteSuperType is ConeClassErrorType) return@mapNotNull null
val symbol = useSiteSuperType.lookupTag.toSymbol(useSiteSession)
if (symbol is FirClassSymbol) {
// We need JavaClassEnhancementScope here to have already enhanced signatures from supertypes
val scope = buildJavaEnhancementScope(useSiteSession, symbol, scopeSession)
useSiteSuperType.wrapSubstitutionScopeIfNeed(useSiteSession, scope, scopeSession)
} else {
null
}
}
}
JavaClassUseSiteScope(regularClass, useSiteSession, superTypeEnhancementScope, declaredScope)
JavaClassUseSiteScope(regularClass, useSiteSession, FirSuperTypeScope(session, superTypeEnhancementScopes), declaredScope)
}
}