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 overriddenDescriptor = overriddenDescriptor.original
val needBridge: Boolean val needBridge: Boolean
get() { get() = descriptor.target.needBridgeTo(overriddenDescriptor)
if (descriptor.modality == Modality.ABSTRACT) return false
return descriptor.target.needBridgeTo(overriddenDescriptor)
}
val bridgeDirections: BridgeDirections val bridgeDirections: BridgeDirections
get() = descriptor.target.bridgeDirectionsTo(overriddenDescriptor) get() = descriptor.target.bridgeDirectionsTo(overriddenDescriptor)
@@ -43,11 +40,9 @@ internal class OverriddenFunctionDescriptor(val descriptor: FunctionDescriptor,
|| DescriptorUtils.getAllOverriddenDeclarations(overriddenDescriptor).any { it.isOverridable } || DescriptorUtils.getAllOverriddenDeclarations(overriddenDescriptor).any { it.isOverridable }
val inheritsBridge: Boolean val inheritsBridge: Boolean
get() { get() = !descriptor.kind.isReal
return !descriptor.kind.isReal && OverridingUtil.overrides(descriptor.target, overriddenDescriptor)
&& OverridingUtil.overrides(descriptor.target, overriddenDescriptor) && descriptor.bridgeDirectionsTo(overriddenDescriptor).allNotNeeded()
&& descriptor.bridgeDirectionsTo(overriddenDescriptor).allNotNeeded()
}
override fun toString(): String { override fun toString(): String {
return "(descriptor=$descriptor, overriddenDescriptor=$overriddenDescriptor)" return "(descriptor=$descriptor, overriddenDescriptor=$overriddenDescriptor)"
@@ -283,13 +283,11 @@ internal class BridgeDirections(val array: Array<BridgeDirection>) {
internal fun FunctionDescriptor.bridgeDirectionsTo(overriddenDescriptor: FunctionDescriptor): BridgeDirections { internal fun FunctionDescriptor.bridgeDirectionsTo(overriddenDescriptor: FunctionDescriptor): BridgeDirections {
val ourDirections = BridgeDirections(this.valueParameters.size) val ourDirections = BridgeDirections(this.valueParameters.size)
if (modality == Modality.ABSTRACT)
return ourDirections
for (index in ourDirections.array.indices) for (index in ourDirections.array.indices)
ourDirections.array[index] = this.bridgeDirectionToAt(overriddenDescriptor, index) ourDirections.array[index] = this.bridgeDirectionToAt(overriddenDescriptor, index)
val target = this.target val target = this.target
if (!kind.isReal if (!kind.isReal && modality != Modality.ABSTRACT
&& OverridingUtil.overrides(target, overriddenDescriptor) && OverridingUtil.overrides(target, overriddenDescriptor)
&& ourDirections == target.bridgeDirectionsTo(overriddenDescriptor)) { && ourDirections == target.bridgeDirectionsTo(overriddenDescriptor)) {
// Bridge is inherited from superclass. // Bridge is inherited from superclass.
@@ -93,8 +93,9 @@ internal class BridgesBuilding(val context: Context) : ClassLoweringPass {
irClass.descriptor.contributedMethods.forEach { functions.add(it) } irClass.descriptor.contributedMethods.forEach { functions.add(it) }
functions.forEach { functions.filterNotNull()
it?.let { function -> .filterNot { it.modality == Modality.ABSTRACT }
.forEach { function ->
function.allOverriddenDescriptors function.allOverriddenDescriptors
.map { OverriddenFunctionDescriptor(function, it) } .map { OverriddenFunctionDescriptor(function, it) }
.filter { !it.bridgeDirections.allNotNeeded() } .filter { !it.bridgeDirections.allNotNeeded() }
@@ -104,7 +105,6 @@ internal class BridgesBuilding(val context: Context) : ClassLoweringPass {
.forEach { .forEach {
buildBridge(it, irClass) buildBridge(it, irClass)
} }
}
} }
} }