Added bridge for functions overriding return type with Unit

This commit is contained in:
Igor Chevdar
2017-05-16 14:48:59 +03:00
parent 3e35db5a51
commit bdb185ee93
@@ -212,7 +212,7 @@ fun ClassDescriptor.isAbstract() = this.modality == Modality.SEALED || this.moda
internal fun FunctionDescriptor.hasValueTypeAt(index: Int): Boolean {
when (index) {
0 -> return !isSuspend && returnType.let { it != null && it.isValueType() }
0 -> return !isSuspend && returnType.let { it != null && (it.isValueType() || it.isUnit()) }
1 -> return extensionReceiverParameter.let { it != null && it.type.isValueType() }
else -> return this.valueParameters[index - 2].type.isValueType()
}
@@ -220,7 +220,7 @@ internal fun FunctionDescriptor.hasValueTypeAt(index: Int): Boolean {
internal fun FunctionDescriptor.hasReferenceAt(index: Int): Boolean {
when (index) {
0 -> return isSuspend || returnType.let { it != null && !it.isValueType() }
0 -> return isSuspend || returnType.let { it != null && !it.isValueType() && !it.isUnit() }
1 -> return extensionReceiverParameter.let { it != null && !it.type.isValueType() }
else -> return !this.valueParameters[index - 2].type.isValueType()
}
@@ -241,13 +241,12 @@ internal enum class BridgeDirection {
TO_VALUE_TYPE
}
private fun FunctionDescriptor.bridgeDirectionToAt(target: FunctionDescriptor, index: Int): BridgeDirection {
when {
hasValueTypeAt(index) && target.hasReferenceAt(index) -> return BridgeDirection.FROM_VALUE_TYPE
hasReferenceAt(index) && target.hasValueTypeAt(index) -> return BridgeDirection.TO_VALUE_TYPE
else -> return BridgeDirection.NOT_NEEDED
}
}
private fun FunctionDescriptor.bridgeDirectionToAt(target: FunctionDescriptor, index: Int)
= when {
hasValueTypeAt(index) && target.hasReferenceAt(index) -> BridgeDirection.FROM_VALUE_TYPE
hasReferenceAt(index) && target.hasValueTypeAt(index) -> BridgeDirection.TO_VALUE_TYPE
else -> BridgeDirection.NOT_NEEDED
}
internal class BridgeDirections(val array: Array<BridgeDirection>) {
constructor(parametersCount: Int): this(Array<BridgeDirection>(parametersCount + 2, { BridgeDirection.NOT_NEEDED }))
@@ -259,8 +258,8 @@ internal class BridgeDirections(val array: Array<BridgeDirection>) {
array.forEach {
result.append(when (it) {
BridgeDirection.FROM_VALUE_TYPE -> 'U' // unbox
BridgeDirection.TO_VALUE_TYPE -> 'B' // box
BridgeDirection.NOT_NEEDED -> 'N' // none
BridgeDirection.TO_VALUE_TYPE -> 'B' // box
BridgeDirection.NOT_NEEDED -> 'N' // none
})
}
return result.toString()