Simplify method contract and add assertion

We don't generate stubs for final built-ins anyway
(as well as special bridges)
This commit is contained in:
Denis Zharkov
2016-06-30 20:10:59 +03:00
parent 84eb009c29
commit bb537aa834
@@ -89,8 +89,8 @@ object BuiltinSpecialBridgesUtil {
val bridges: MutableSet<BridgeForBuiltinSpecial<Signature>> = mutableSetOf() val bridges: MutableSet<BridgeForBuiltinSpecial<Signature>> = mutableSetOf()
val superImplementationDescriptor = val superImplementationDescriptor =
if (specialBridge != null) if (specialBridge != null && fake && !functionHandle.isAbstract)
findSuperImplementationForStubDelegation(function, fake, isBodyOwner, signatureByDescriptor) findSuperImplementationForStubDelegation(function, isBodyOwner, signatureByDescriptor)
else else
null null
@@ -140,17 +140,21 @@ object BuiltinSpecialBridgesUtil {
*/ */
private fun <Signature> findSuperImplementationForStubDelegation( private fun <Signature> findSuperImplementationForStubDelegation(
function: FunctionDescriptor, function: FunctionDescriptor,
fake: Boolean,
isBodyOwner: (DeclarationDescriptor) -> Boolean, isBodyOwner: (DeclarationDescriptor) -> Boolean,
signatureByDescriptor: (FunctionDescriptor) -> Signature signatureByDescriptor: (FunctionDescriptor) -> Signature
): FunctionDescriptor? { ): FunctionDescriptor? {
if (function.modality != Modality.OPEN || !fake) return null
val implementation = findConcreteSuperDeclaration(DescriptorBasedFunctionHandle(function, isBodyOwner)).descriptor val implementation = findConcreteSuperDeclaration(DescriptorBasedFunctionHandle(function, isBodyOwner)).descriptor
// Implementation from interface will be generated by common mechanism
if (DescriptorUtils.isInterface(implementation.containingDeclaration)) return null if (DescriptorUtils.isInterface(implementation.containingDeclaration)) return null
// Implementation in super-class already has proper signature // Implementation in super-class already has proper signature
if (signatureByDescriptor(function) == signatureByDescriptor(implementation)) return null if (signatureByDescriptor(function) == signatureByDescriptor(implementation)) return null
assert(function.modality == Modality.OPEN) {
"Should generate stubs only for non-abstract built-ins, but ${function.name} is ${function.modality}"
}
return implementation return implementation
} }