Abstract methods can also have bridges
This commit is contained in:
+4
-9
@@ -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)"
|
||||
|
||||
+1
-3
@@ -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.
|
||||
|
||||
+3
-3
@@ -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)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user