Do not duplicate inherited bridge

This commit is contained in:
Igor Chevdar
2017-03-29 15:10:37 +03:00
parent db7b22bbb1
commit 9447cf8d9d
3 changed files with 8 additions and 3 deletions
@@ -26,6 +26,12 @@ internal class OverriddenFunctionDescriptor(val descriptor: FunctionDescriptor,
get() = overriddenDescriptor.isOverridable
|| DescriptorUtils.getAllOverriddenDeclarations(overriddenDescriptor).any { it.isOverridable }
val inheritsBridge: Boolean
get() {
return !descriptor.kind.isReal
&& OverridingUtil.overrides(descriptor.target, overriddenDescriptor)
&& descriptor.bridgeDirectionsTo(overriddenDescriptor).allNotNeeded()
}
override fun toString(): String {
return "(descriptor=$descriptor, overriddenDescriptor=$overriddenDescriptor)"
@@ -170,9 +170,7 @@ internal class RTTIGenerator(override val context: Context) : ContextUtils {
get() {
val target = descriptor.target
if (!needBridge) return target
val bridgeOwner = if (!descriptor.kind.isReal
&& OverridingUtil.overrides(target, overriddenDescriptor)
&& descriptor.bridgeDirectionsTo(overriddenDescriptor).allNotNeeded()) {
val bridgeOwner = if (inheritsBridge) {
target // Bridge is inherited from superclass.
} else {
descriptor
@@ -81,6 +81,7 @@ internal class BridgesBuilding(val context: Context) : ClassLoweringPass {
.map { OverriddenFunctionDescriptor(function, it) }
.filter { !it.bridgeDirections.allNotNeeded() }
.filter { it.canBeCalledVirtually }
.filter { !it.inheritsBridge }
.distinctBy { it.bridgeDirections }
.forEach {
buildBridge(it, irClass)