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:
committed by
Space Team
parent
85059ced93
commit
efdecc63cb
+10
-16
@@ -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,
|
||||
|
||||
Reference in New Issue
Block a user