Disambiguate upper bounds in the mangling.
This commit is contained in:
committed by
alexander-gorshenev
parent
a69def4254
commit
f91bc457db
+22
-5
@@ -82,13 +82,27 @@ private val exportForCppRuntimeAnnotation = FqName("konan.internal.ExportForCppR
|
|||||||
|
|
||||||
private val exportForCompilerAnnotation = FqName("konan.internal.ExportForCompiler")
|
private val exportForCompilerAnnotation = FqName("konan.internal.ExportForCompiler")
|
||||||
|
|
||||||
private fun typeToHashString(type: KotlinType): String {
|
private fun acyclicTypeMangler(visited: MutableSet<TypeParameterDescriptor>, type: KotlinType): String {
|
||||||
if (TypeUtils.isTypeParameter(type)) return "GENERIC"
|
val descriptor = TypeUtils.getTypeParameterDescriptorOrNull(type)
|
||||||
|
if (descriptor != null) {
|
||||||
|
val upperBounds = if (visited.contains(descriptor)) "" else {
|
||||||
|
|
||||||
|
visited.add(descriptor)
|
||||||
|
|
||||||
|
descriptor.upperBounds.map {
|
||||||
|
val bound = acyclicTypeMangler(visited, it)
|
||||||
|
if (bound == "kotlin.Any?") "" else "_$bound"
|
||||||
|
}.joinToString("")
|
||||||
|
}
|
||||||
|
return "GENERIC" + upperBounds
|
||||||
|
}
|
||||||
|
|
||||||
var hashString = TypeUtils.getClassDescriptor(type)!!.fqNameSafe.asString()
|
var hashString = TypeUtils.getClassDescriptor(type)!!.fqNameSafe.asString()
|
||||||
if (!type.arguments.isEmpty()) {
|
if (!type.arguments.isEmpty()) {
|
||||||
hashString += "<${type.arguments.map {
|
hashString += "<${type.arguments.map {
|
||||||
typeToHashString(it.type)
|
val variance = it.projectionKind.label
|
||||||
|
val projection = if (variance == "") "" else "${variance}_"
|
||||||
|
projection + acyclicTypeMangler(visited, it.type)
|
||||||
}.joinToString(",")}>"
|
}.joinToString(",")}>"
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -96,9 +110,12 @@ private fun typeToHashString(type: KotlinType): String {
|
|||||||
return hashString
|
return hashString
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private fun typeToHashString(type: KotlinType)
|
||||||
|
= acyclicTypeMangler(mutableSetOf<TypeParameterDescriptor>(), type)
|
||||||
|
|
||||||
private val FunctionDescriptor.signature: String
|
private val FunctionDescriptor.signature: String
|
||||||
get() {
|
get() {
|
||||||
val extensionReceiverPart = this.extensionReceiverParameter?.let { "${it.type}." } ?: ""
|
val extensionReceiverPart = this.extensionReceiverParameter?.let { "@${typeToHashString(it.type)}." } ?: ""
|
||||||
|
|
||||||
val argsPart = this.valueParameters.map {
|
val argsPart = this.valueParameters.map {
|
||||||
typeToHashString(it.type)
|
typeToHashString(it.type)
|
||||||
@@ -180,4 +197,4 @@ internal val ClassDescriptor.objectInstanceFieldSymbolName: String
|
|||||||
assert (!this.isUnit())
|
assert (!this.isUnit())
|
||||||
|
|
||||||
return "kobjref:$fqNameSafe"
|
return "kobjref:$fqNameSafe"
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user