Move OverridingUtil#getUpperBound to OverloadUtil, add tests on overloads

This commit is contained in:
Alexander Udalov
2015-10-22 22:57:34 +03:00
parent 477823b093
commit 426bddb54e
7 changed files with 98 additions and 17 deletions
@@ -21,8 +21,9 @@ import org.jetbrains.kotlin.descriptors.*
import org.jetbrains.kotlin.incremental.components.NoLookupLocation
import org.jetbrains.kotlin.name.FqNameUnsafe
import org.jetbrains.kotlin.name.Name
import org.jetbrains.kotlin.resolve.OverridingUtil.OverrideCompatibilityInfo.Result.*
import org.jetbrains.kotlin.resolve.OverridingUtil.OverrideCompatibilityInfo.Result.INCOMPATIBLE
import org.jetbrains.kotlin.resolve.scopes.KtScope
import org.jetbrains.kotlin.types.KotlinType
import org.jetbrains.kotlin.types.checker.KotlinTypeChecker
import org.jetbrains.kotlin.types.oneMoreSpecificThanAnother
@@ -47,11 +48,12 @@ object OverloadUtil {
val aValueParameters = OverridingUtil.compiledValueParameters(a)
val bValueParameters = OverridingUtil.compiledValueParameters(b)
for (i in aValueParameters.indices) {
val superValueParameterType = OverridingUtil.getUpperBound(aValueParameters[i])
val subValueParameterType = OverridingUtil.getUpperBound(bValueParameters[i])
for ((aType, bType) in aValueParameters.zip(bValueParameters)) {
// TODO: check type parameters, create a substitution and compare parameter types according to it, like in OverridingUtil
val superValueParameterType = aType.upperBound
val subValueParameterType = bType.upperBound
if (!KotlinTypeChecker.DEFAULT.equalTypes(superValueParameterType, subValueParameterType) ||
oneMoreSpecificThanAnother(subValueParameterType, superValueParameterType)) {
oneMoreSpecificThanAnother(subValueParameterType, superValueParameterType)) {
return true
}
}
@@ -67,6 +69,16 @@ object OverloadUtil {
else -> throw IllegalStateException()
}
private val KotlinType.upperBound: KotlinType
get() {
val classifier = constructor.declarationDescriptor
return when (classifier) {
is ClassDescriptor -> this
is TypeParameterDescriptor -> classifier.upperBoundsAsType
else -> error("Unknown type constructor: $this")
}
}
public @JvmStatic fun groupModulePackageMembersByFqName(
c: BodiesResolveContext,
constructorsInPackages: MultiMap<FqNameUnsafe, ConstructorDescriptor>