Abstract methods can also have bridges

This commit is contained in:
Igor Chevdar
2017-05-10 14:18:51 +03:00
parent 42b1414014
commit 97fe5c6b46
3 changed files with 8 additions and 15 deletions
@@ -29,10 +29,7 @@ internal class OverriddenFunctionDescriptor(val descriptor: FunctionDescriptor,
val overriddenDescriptor = overriddenDescriptor.original
val needBridge: Boolean
get() {
if (descriptor.modality == Modality.ABSTRACT) return false
return descriptor.target.needBridgeTo(overriddenDescriptor)
}
get() = descriptor.target.needBridgeTo(overriddenDescriptor)
val bridgeDirections: BridgeDirections
get() = descriptor.target.bridgeDirectionsTo(overriddenDescriptor)
@@ -43,11 +40,9 @@ internal class OverriddenFunctionDescriptor(val descriptor: FunctionDescriptor,
|| DescriptorUtils.getAllOverriddenDeclarations(overriddenDescriptor).any { it.isOverridable }
val inheritsBridge: Boolean
get() {
return !descriptor.kind.isReal
&& OverridingUtil.overrides(descriptor.target, overriddenDescriptor)
&& descriptor.bridgeDirectionsTo(overriddenDescriptor).allNotNeeded()
}
get() = !descriptor.kind.isReal
&& OverridingUtil.overrides(descriptor.target, overriddenDescriptor)
&& descriptor.bridgeDirectionsTo(overriddenDescriptor).allNotNeeded()
override fun toString(): String {
return "(descriptor=$descriptor, overriddenDescriptor=$overriddenDescriptor)"
@@ -283,13 +283,11 @@ internal class BridgeDirections(val array: Array<BridgeDirection>) {
internal fun FunctionDescriptor.bridgeDirectionsTo(overriddenDescriptor: FunctionDescriptor): BridgeDirections {
val ourDirections = BridgeDirections(this.valueParameters.size)
if (modality == Modality.ABSTRACT)
return ourDirections
for (index in ourDirections.array.indices)
ourDirections.array[index] = this.bridgeDirectionToAt(overriddenDescriptor, index)
val target = this.target
if (!kind.isReal
if (!kind.isReal && modality != Modality.ABSTRACT
&& OverridingUtil.overrides(target, overriddenDescriptor)
&& ourDirections == target.bridgeDirectionsTo(overriddenDescriptor)) {
// Bridge is inherited from superclass.
@@ -93,8 +93,9 @@ internal class BridgesBuilding(val context: Context) : ClassLoweringPass {
irClass.descriptor.contributedMethods.forEach { functions.add(it) }
functions.forEach {
it?.let { function ->
functions.filterNotNull()
.filterNot { it.modality == Modality.ABSTRACT }
.forEach { function ->
function.allOverriddenDescriptors
.map { OverriddenFunctionDescriptor(function, it) }
.filter { !it.bridgeDirections.allNotNeeded() }
@@ -104,7 +105,6 @@ internal class BridgesBuilding(val context: Context) : ClassLoweringPass {
.forEach {
buildBridge(it, irClass)
}
}
}
}