Prohibit @JvnName on functions mangled because of return type

This commit is contained in:
Dmitry Petrov
2020-05-15 16:46:55 +03:00
parent fcf8a91a38
commit de4ebe4395
7 changed files with 62 additions and 14 deletions
@@ -9,6 +9,7 @@ import org.jetbrains.kotlin.descriptors.*
import org.jetbrains.kotlin.resolve.DescriptorUtils
import org.jetbrains.kotlin.resolve.descriptorUtil.fqNameSafe
import org.jetbrains.kotlin.resolve.isInlineClass
import org.jetbrains.kotlin.resolve.isInlineClassType
import org.jetbrains.kotlin.types.KotlinType
import org.jetbrains.kotlin.types.typeUtil.representativeUpperBound
@@ -20,20 +21,24 @@ fun shouldHideConstructorDueToInlineClassTypeValueParameters(descriptor: Callabl
// TODO inner class in inline class
return constructorDescriptor.valueParameters.any { it.type.requiresFunctionNameMangling() }
return constructorDescriptor.valueParameters.any { it.type.requiresFunctionNameManglingInParameterTypes() }
}
fun requiresFunctionNameMangling(valueParameterTypes: List<KotlinType>): Boolean {
return valueParameterTypes.any { it.requiresFunctionNameMangling() }
fun requiresFunctionNameManglingForParameterTypes(valueParameterTypes: List<KotlinType>): Boolean {
return valueParameterTypes.any { it.requiresFunctionNameManglingInParameterTypes() }
}
// NB functions returning all inline classes (including our special 'kotlin.Result') should be mangled.
fun requiresFunctionNameManglingForReturnType(returnType: KotlinType?) =
returnType != null && returnType.isInlineClassType()
fun DeclarationDescriptor.isInlineClassThatRequiresMangling(): Boolean =
isInlineClass() && !isDontMangleClass(this as ClassDescriptor)
fun KotlinType.isInlineClassThatRequiresMangling() =
constructor.declarationDescriptor?.isInlineClassThatRequiresMangling() == true
private fun KotlinType.requiresFunctionNameMangling() =
private fun KotlinType.requiresFunctionNameManglingInParameterTypes() =
isInlineClassThatRequiresMangling() || isTypeParameterWithUpperBoundThatRequiresMangling()
private fun isDontMangleClass(classDescriptor: ClassDescriptor) =
@@ -41,5 +46,5 @@ private fun isDontMangleClass(classDescriptor: ClassDescriptor) =
private fun KotlinType.isTypeParameterWithUpperBoundThatRequiresMangling(): Boolean {
val descriptor = constructor.declarationDescriptor as? TypeParameterDescriptor ?: return false
return descriptor.representativeUpperBound.requiresFunctionNameMangling()
return descriptor.representativeUpperBound.requiresFunctionNameManglingInParameterTypes()
}