Fix exception when Java class has different methods with same erasure

^KT-36856 Fixed
This commit is contained in:
Denis Zharkov
2020-02-20 13:06:41 +03:00
parent 7efb32628e
commit 071149e0fb
8 changed files with 80 additions and 23 deletions
@@ -126,7 +126,7 @@ abstract class LazyJavaScope(
val groups = groupBy { it.computeJvmDescriptor(withReturnType = false) }.values
for (group in groups) {
if (group.size == 1) continue
val mostSpecificMethods = group.selectMostSpecificFromOverridableGroup()
val mostSpecificMethods = group.selectMostSpecificInEachOverridableGroup { this }
removeAll(group)
addAll(mostSpecificMethods)
}
@@ -66,7 +66,12 @@ fun <H : Any> Collection<H>.selectMostSpecificInEachOverridableGroup(
continue
}
val mostSpecific = mostSpecific(overridableGroup, conflictedHandles, descriptorByHandle)
val mostSpecific = OverridingUtil.selectMostSpecificMember(overridableGroup, descriptorByHandle)
val mostSpecificDescriptor = mostSpecific.descriptorByHandle()
overridableGroup.filterNotTo(conflictedHandles) {
OverridingUtil.isMoreSpecific(mostSpecificDescriptor, it.descriptorByHandle())
}
if (conflictedHandles.isNotEmpty()) {
result.addAll(conflictedHandles)
@@ -76,24 +81,3 @@ fun <H : Any> Collection<H>.selectMostSpecificInEachOverridableGroup(
}
return result
}
private fun <H : Any> mostSpecific(
overridableGroup: Collection<H>,
conflictedHandles: MutableSet<H>,
descriptorByHandle: H.() -> CallableDescriptor
): H {
val mostSpecific = OverridingUtil.selectMostSpecificMember(overridableGroup, descriptorByHandle)
val mostSpecificDescriptor = mostSpecific.descriptorByHandle()
overridableGroup.filterNotTo(conflictedHandles) {
OverridingUtil.isMoreSpecific(mostSpecificDescriptor, it.descriptorByHandle())
}
return mostSpecific
}
// Return multiple elements in case of conflicts
fun <D : CallableDescriptor> Collection<D>.selectMostSpecificFromOverridableGroup(): Collection<D> {
val result = mutableSetOf<D>()
result.add(mostSpecific(this, conflictedHandles = result) { this })
return result
}