[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:
+7
-6
@@ -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
|
||||
}
|
||||
|
||||
+1
-1
@@ -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()
|
||||
|
||||
Reference in New Issue
Block a user