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 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)"
|
||||||
|
|||||||
+1
-3
@@ -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.
|
||||||
|
|||||||
+3
-3
@@ -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)
|
||||||
}
|
}
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user