Move OverridingUtil#getUpperBound to OverloadUtil, add tests on overloads
This commit is contained in:
@@ -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>
|
||||
|
||||
Reference in New Issue
Block a user