Support 'expect final' -> 'actual open' for callables

#KT-17944
This commit is contained in:
Alexander Udalov
2017-10-12 12:05:59 +02:00
parent ee9a6ca53e
commit 2682837fd7
6 changed files with 88 additions and 5 deletions
@@ -397,7 +397,7 @@ object ExpectedActualDeclarationChecker : DeclarationChecker {
if (b.hasStableParameterNames() && !equalsBy(aParams, bParams, ValueParameterDescriptor::getName)) return Incompatible.ParameterNames
if (!equalsBy(aTypeParams, bTypeParams, TypeParameterDescriptor::getName)) return Incompatible.TypeParameterNames
if (a.modality != b.modality) return Incompatible.Modality
if (!areCompatibleModalities(a.modality, b.modality)) return Incompatible.Modality
if (a.visibility != b.visibility) return Incompatible.Visibility
areCompatibleTypeParameters(aTypeParams, bTypeParams, platformModule, substitutor).let { if (it != Compatible) return it }
@@ -535,7 +535,7 @@ object ExpectedActualDeclarationChecker : DeclarationChecker {
val bTypeParams = b.declaredTypeParameters
if (aTypeParams.size != bTypeParams.size) return Incompatible.TypeParameterCount
if (a.modality != b.modality && !(a.modality == Modality.FINAL && b.modality == Modality.OPEN)) return Incompatible.Modality
if (!areCompatibleModalities(a.modality, b.modality)) return Incompatible.Modality
if (a.visibility != b.visibility) return Incompatible.Visibility
@@ -556,6 +556,11 @@ object ExpectedActualDeclarationChecker : DeclarationChecker {
return Compatible
}
private fun areCompatibleModalities(a: Modality, b: Modality): Boolean {
return a == Modality.FINAL && b == Modality.OPEN ||
a == b
}
private fun areCompatibleClassScopes(
a: ClassDescriptor,