Generate common bridges for final builtin declaration

#KT-9596 Fixed
This commit is contained in:
Denis Zharkov
2015-10-16 19:32:41 +03:00
parent cc94acdabc
commit fafca76ac5
4 changed files with 45 additions and 22 deletions
@@ -69,7 +69,11 @@ object BuiltinSpecialBridgesUtil {
val bridgesToGenerate = reachableDeclarations.mapTo(LinkedHashSet<Signature>(), signatureByDescriptor)
bridgesToGenerate.remove(overriddenBuiltinSignature)
bridgesToGenerate.remove(methodItself)
val superImplementationDescriptor = findSuperImplementationForStubDelegation(function, fake)
if (superImplementationDescriptor != null || !fake) {
bridgesToGenerate.remove(methodItself)
}
if (fake) {
for (overridden in function.overriddenDescriptors.map { it.original }) {
@@ -80,19 +84,25 @@ object BuiltinSpecialBridgesUtil {
}
val bridges: MutableSet<BridgeForBuiltinSpecial<Signature>> =
(bridgesToGenerate.map { BridgeForBuiltinSpecial(it, methodItself) } + specialBridge.singletonOrEmptyList()).toMutableSet()
(bridgesToGenerate.map { BridgeForBuiltinSpecial(it, overriddenBuiltinSignature) } + specialBridge.singletonOrEmptyList()).toMutableSet()
if (function.modality == Modality.OPEN && fake) {
val implementation = findConcreteSuperDeclaration(DescriptorBasedFunctionHandle(function)).descriptor
if (!DescriptorUtils.isInterface(implementation.containingDeclaration)) {
bridges.add(BridgeForBuiltinSpecial(methodItself, signatureByDescriptor(implementation), isDelegateToSuper = true))
}
if (superImplementationDescriptor != null) {
bridges.add(BridgeForBuiltinSpecial(methodItself, signatureByDescriptor(superImplementationDescriptor), isDelegateToSuper = true))
}
return bridges
}
}
private fun findSuperImplementationForStubDelegation(function: FunctionDescriptor, fake: Boolean): FunctionDescriptor? {
if (function.modality != Modality.OPEN || !fake) return null
val implementation = findConcreteSuperDeclaration(DescriptorBasedFunctionHandle(function)).descriptor
if (DescriptorUtils.isInterface(implementation.containingDeclaration)) return null
return implementation
}
private fun findAllReachableDeclarations(functionDescriptor: FunctionDescriptor): MutableSet<FunctionDescriptor> =
findAllReachableDeclarations(DescriptorBasedFunctionHandle(functionDescriptor)).map { it.descriptor }.toMutableSet()