KT-2752: add hash-based suffix to private members of open/abstract public classes

This commit is contained in:
Alexey Andreev
2016-09-12 15:47:55 +03:00
parent ba9c908875
commit a4bf058be6
@@ -23,6 +23,7 @@ import org.jetbrains.kotlin.resolve.DescriptorUtils
import org.jetbrains.kotlin.resolve.DescriptorUtils.isCompanionObject
import org.jetbrains.kotlin.resolve.calls.tasks.isDynamic
import org.jetbrains.kotlin.resolve.calls.util.FakeCallableDescriptorForObject
import org.jetbrains.kotlin.resolve.descriptorUtil.fqNameUnsafe
import org.jetbrains.kotlin.resolve.descriptorUtil.isEnumValueOfMethod
import java.util.*
@@ -184,12 +185,17 @@ class NameSuggestion {
if (nativeName != null) return Pair(nativeName, true)
val stable = shouldBeStable(descriptor)
val finalName = if (overriddenDescriptor is CallableDescriptor && stable) {
getStableMangledName(baseName, getArgumentTypesAsString(overriddenDescriptor))
}
else {
baseName
val finalName = when {
overriddenDescriptor is CallableDescriptor && stable -> {
getStableMangledName(baseName, getArgumentTypesAsString(overriddenDescriptor))
}
shouldMangleUnstable(overriddenDescriptor) -> {
val ownerName = descriptor.containingDeclaration!!.fqNameUnsafe.asString()
getStableMangledName(baseName, ownerName + ":" + getArgumentTypesAsString(overriddenDescriptor as CallableDescriptor))
}
else -> baseName
}
return Pair(finalName, stable)
}
@@ -206,6 +212,20 @@ class NameSuggestion {
return argTypes.toString()
}
// Sometimes private members of a class can clash with public members of subclasses, therefore we must
// mangle them
private fun shouldMangleUnstable(descriptor: DeclarationDescriptor): Boolean {
if (descriptor is ClassDescriptor) return false
if (DescriptorUtils.isDescriptorWithLocalVisibility(descriptor)) return false
val containingClass = DescriptorUtils.getContainingClass(descriptor)
if (containingClass != null && descriptor is CallableMemberDescriptor && !descriptor.isOverridable) {
return containingClass.visibility.isPublicAPI
}
return false
}
fun getStableMangledName(suggestedName: String, forCalculateId: String): String {
val suffix = if (forCalculateId.isEmpty()) "" else "_${mangledId(forCalculateId)}\$"
return suggestedName + suffix