[FIR, IR] Cleanups around allRecursivelyOverriddenDeclarationsIncludingSelf

- Pass containingClass (helps to avoid calculations of the
  containingClass in allRecursivelyOverriddenDeclarationsIncludingSelf
  implementation)
- Reuse allRecursivelyOverriddenDeclarationsIncludingSelf by
  DefaultArgumentsInExpectActualizedByFakeOverride &
  ActualFunctionWithDefaultParameters

Review: https://jetbrains.team/p/kt/reviews/13244
This commit is contained in:
Nikita Bobko
2023-11-17 18:34:55 +01:00
committed by Space Team
parent 8c0cf7d0bc
commit 48fdeeb42d
4 changed files with 15 additions and 15 deletions
@@ -373,13 +373,16 @@ object AbstractExpectActualChecker {
// "parameters" checks are required only for functions, because only functions can have parameters
actualDeclaration is FunctionSymbolMarker && expectDeclaration is FunctionSymbolMarker
) {
val expectOverriddenDeclarations =
expectDeclaration.allRecursivelyOverriddenDeclarationsIncludingSelf(expectContainingClass).toSet()
val actualOverriddenDeclarations =
actualDeclaration.allRecursivelyOverriddenDeclarationsIncludingSelf(actualContainingClass).toSet()
if (languageVersionSettings.supportsFeature(LanguageFeature.ProhibitDefaultArgumentsInExpectActualizedByFakeOverride) &&
(actualDeclaration.isFakeOverride(actualContainingClass) || actualDeclaration.isDelegatedMember) &&
// If default params came from common supertypes of actual class and expect class then it's a valid code.
// Here we filter out such default params.
(expectDeclaration.allRecursivelyOverriddenDeclarationsIncludingSelf() -
actualDeclaration.allRecursivelyOverriddenDeclarationsIncludingSelf().toSet())
.flatMap { it.valueParameters }.any { it.hasDefaultValueNonRecursive }
(expectOverriddenDeclarations - actualOverriddenDeclarations).flatMap { it.valueParameters }
.any { it.hasDefaultValueNonRecursive }
) {
return ExpectActualCheckingCompatibility.DefaultArgumentsInExpectActualizedByFakeOverride
}
@@ -389,9 +392,7 @@ object AbstractExpectActualChecker {
if (!actualDeclaration.isAnnotationConstructor() &&
// If default params came from common supertypes of actual class and expect class then it's a valid code.
// Here we filter out such default params.
(actualDeclaration.allRecursivelyOverriddenDeclarationsIncludingSelf() -
expectDeclaration.allRecursivelyOverriddenDeclarationsIncludingSelf().toSet())
.flatMap { it.valueParameters }.any { it.hasDefaultValue }
(actualOverriddenDeclarations - expectOverriddenDeclarations).flatMap { it.valueParameters }.any { it.hasDefaultValue }
) {
return ExpectActualCheckingCompatibility.ActualFunctionWithDefaultParameters
}
@@ -125,7 +125,7 @@ interface ExpectActualMatchingContext<T : DeclarationSymbolMarker> : TypeSystemC
/**
* Returns all symbols that are overridden by [this] symbol, including self
*/
fun FunctionSymbolMarker.allRecursivelyOverriddenDeclarationsIncludingSelf(): Sequence<CallableSymbolMarker>
fun FunctionSymbolMarker.allRecursivelyOverriddenDeclarationsIncludingSelf(containingClass: RegularClassSymbolMarker?): List<CallableSymbolMarker>
val CallableSymbolMarker.valueParameters: List<ValueParameterSymbolMarker>
get() = (this as? FunctionSymbolMarker)?.valueParameters ?: emptyList()