K2: Make filterOutOverridden helper satisfying its contracts

It's obviously expected that all overridden, not only direct ones
are considered

While it likely changes the behavior and some tests are expected to be
changed, original intention was to fix the behavior for other usages
(see later commits) and the part with tests are postponed with KT-58636

^KT-58636 Related
This commit is contained in:
Denis.Zharkov
2023-05-11 12:23:28 +02:00
committed by Space Team
parent 85059ced93
commit efdecc63cb
2 changed files with 18 additions and 16 deletions
@@ -5,11 +5,7 @@
package org.jetbrains.kotlin.fir.scopes.impl
import org.jetbrains.kotlin.fir.PrivateForInline
import org.jetbrains.kotlin.fir.scopes.FirTypeScope
import org.jetbrains.kotlin.fir.scopes.MemberWithBaseScope
import org.jetbrains.kotlin.fir.scopes.ProcessOverriddenWithBaseScope
import org.jetbrains.kotlin.fir.scopes.ProcessorAction
import org.jetbrains.kotlin.fir.scopes.*
import org.jetbrains.kotlin.fir.symbols.impl.FirCallableSymbol
import org.jetbrains.kotlin.fir.symbols.impl.FirNamedFunctionSymbol
import org.jetbrains.kotlin.fir.symbols.impl.FirPropertySymbol
@@ -22,8 +18,7 @@ fun filterOutOverriddenProperties(extractedOverridden: Collection<MemberWithBase
return filterOutOverridden(extractedOverridden, FirTypeScope::processDirectOverriddenPropertiesWithBaseScope)
}
@OptIn(PrivateForInline::class)
inline fun <D : FirCallableSymbol<*>> filterOutOverridden(
fun <D : FirCallableSymbol<*>> filterOutOverridden(
extractedOverridden: Collection<MemberWithBaseScope<D>>,
processAllOverridden: ProcessOverriddenWithBaseScope<D>,
): Collection<MemberWithBaseScope<D>> {
@@ -31,26 +26,25 @@ inline fun <D : FirCallableSymbol<*>> filterOutOverridden(
extractedOverridden.none { overridden2 ->
overridden1 !== overridden2 && overrides(
overridden2,
overridden1,
processAllOverridden
)
overridden1.member,
) { symbol: D, processor: (D) -> ProcessorAction ->
processAllOverriddenCallables(symbol, processor, processAllOverridden)
}
}
}
}
// Whether f overrides g
@PrivateForInline
inline fun <D : FirCallableSymbol<*>> overrides(
private fun <D : FirCallableSymbol<*>> overrides(
f: MemberWithBaseScope<D>,
g: MemberWithBaseScope<D>,
processAllOverridden: ProcessOverriddenWithBaseScope<D>,
gMember: D,
processAllOverridden: ProcessAllOverridden<D>,
): Boolean {
val (fMember, fScope) = f
val (gMember) = g
var result = false
fScope.processAllOverridden(fMember) { overridden, _ ->
fScope.processAllOverridden(fMember) { overridden ->
if (overridden == gMember) {
result = true
ProcessorAction.STOP
@@ -78,6 +78,7 @@ class MemberWithBaseScope<out D : FirCallableSymbol<*>>(val member: D, val baseS
}
typealias ProcessOverriddenWithBaseScope<D> = FirTypeScope.(D, (D, FirTypeScope) -> ProcessorAction) -> ProcessorAction
typealias ProcessAllOverridden<D> = FirTypeScope.(D, (D) -> ProcessorAction) -> ProcessorAction
fun FirTypeScope.processOverriddenFunctions(
functionSymbol: FirNamedFunctionSymbol,
@@ -159,6 +160,13 @@ private fun <S : FirCallableSymbol<*>> FirTypeScope.doProcessAllOverriddenCallab
}
}
fun <S : FirCallableSymbol<*>> FirTypeScope.processAllOverriddenCallables(
callableSymbol: S,
processor: (S) -> ProcessorAction,
processDirectOverriddenCallablesWithBaseScope: ProcessOverriddenWithBaseScope<S>,
): ProcessorAction =
doProcessAllOverriddenCallables(callableSymbol, processor, processDirectOverriddenCallablesWithBaseScope, mutableSetOf())
private fun <S : FirCallableSymbol<*>> FirTypeScope.doProcessAllOverriddenCallables(
callableSymbol: S,
processor: (S) -> ProcessorAction,