[FIR] Don't remove subsumed members from intersection overrides's overriddens

This fixes a bunch of missing overridden symbols in IR.
This is also required for fixing KT-59921 in the following commit
where we need to keep all overridden symbols of intersection overrides
so that we can enhance them properly.

#KT-57300 Fixed
#KT-57299 Fixed
#KT-59921
#KT-57300
#KT-62788
#KT-64271
#KT-64382
This commit is contained in:
Kirill Rakhman
2024-01-17 09:59:17 +01:00
committed by Space Team
parent d80dee6e1c
commit 3b841dcb98
58 changed files with 899 additions and 530 deletions
@@ -21,6 +21,7 @@ import org.jetbrains.kotlin.fir.declarations.FirClassLikeDeclaration
import org.jetbrains.kotlin.fir.declarations.FirDeclarationOrigin
import org.jetbrains.kotlin.fir.declarations.constructors
import org.jetbrains.kotlin.fir.declarations.utils.isExpect
import org.jetbrains.kotlin.fir.declarations.getNonSubsumedOverriddenSymbols
import org.jetbrains.kotlin.fir.declarations.utils.isFinal
import org.jetbrains.kotlin.fir.scopes.*
import org.jetbrains.kotlin.fir.symbols.FirBasedSymbol
@@ -31,6 +32,7 @@ import org.jetbrains.kotlin.fir.symbols.impl.FirPropertySymbol
import org.jetbrains.kotlin.fir.unwrapFakeOverridesOrDelegated
import org.jetbrains.kotlin.utils.addIfNotNull
import org.jetbrains.kotlin.utils.addToStdlib.popLast
import org.jetbrains.kotlin.fir.resolve.SessionHolder
sealed class FirJsNameClashClassMembersChecker(mppKind: MppCheckerKind) : FirClassChecker(mppKind) {
object Regular : FirJsNameClashClassMembersChecker(MppCheckerKind.Platform) {
@@ -113,13 +115,17 @@ sealed class FirJsNameClashClassMembersChecker(mppKind: MppCheckerKind) : FirCla
}
}
fun addAllSymbolsFrom(symbols: Collection<FirCallableSymbol<*>>) {
fun addAllSymbolsFrom(symbols: Collection<FirCallableSymbol<*>>, sessionHolder: SessionHolder) {
for (symbol in symbols) {
when (symbol) {
is FirIntersectionCallableSymbol -> {
addAllSymbolsFrom(symbol.intersections)
for (intersectedSymbol in symbol.intersections) {
overrideIntersections.getOrPut(intersectedSymbol) { hashSetOf() }.addAll(symbol.intersections)
val nonSubsumedOverriddenSymbols = symbol.getNonSubsumedOverriddenSymbols(
sessionHolder.session,
sessionHolder.scopeSession
)
addAllSymbolsFrom(nonSubsumedOverriddenSymbols, sessionHolder)
for (intersectedSymbol in nonSubsumedOverriddenSymbols) {
overrideIntersections.getOrPut(intersectedSymbol) { hashSetOf() }.addAll(nonSubsumedOverriddenSymbols)
}
}
else -> allSymbols.add(symbol)
@@ -137,8 +143,8 @@ sealed class FirJsNameClashClassMembersChecker(mppKind: MppCheckerKind) : FirCla
val scope = declaration.symbol.unsubstitutedScope(context)
scope.processDeclaredConstructors(allSymbols::add)
addAllSymbolsFrom(scope.collectAllFunctions())
addAllSymbolsFrom(scope.collectAllProperties())
addAllSymbolsFrom(scope.collectAllFunctions(), context.sessionHolder)
addAllSymbolsFrom(scope.collectAllProperties(), context.sessionHolder)
for (callableMemberSymbol in allSymbols) {
val overriddenLeaves = scope.collectOverriddenLeaves(callableMemberSymbol)