K2: introduce even more readable renderer for types in messages

#KT-53343 Fixed
This commit is contained in:
Mikhail Glukhikh
2022-09-12 16:47:12 +02:00
committed by Space
parent 3848be596e
commit e36091b926
7 changed files with 148 additions and 79 deletions
@@ -184,7 +184,7 @@ internal class DescriptorRendererImpl(
}
override fun renderFlexibleType(lowerRendered: String, upperRendered: String, builtIns: KotlinBuiltIns): String {
if (differsOnlyInNullability(lowerRendered, upperRendered)) {
if (typeStringsDifferOnlyInNullability(lowerRendered, upperRendered)) {
if (upperRendered.startsWith("(")) {
// the case of complex type, e.g. (() -> Unit)?
return "($lowerRendered)!"
@@ -195,7 +195,7 @@ internal class DescriptorRendererImpl(
val kotlinCollectionsPrefix = classifierNamePolicy.renderClassifier(builtIns.collection, this).substringBefore("Collection")
val mutablePrefix = "Mutable"
// java.util.List<Foo> -> (Mutable)List<Foo!>!
val simpleCollection = replacePrefixes(
val simpleCollection = replacePrefixesInTypeRepresentations(
lowerRendered,
kotlinCollectionsPrefix + mutablePrefix,
upperRendered,
@@ -204,7 +204,7 @@ internal class DescriptorRendererImpl(
)
if (simpleCollection != null) return simpleCollection
// java.util.Map.Entry<Foo, Bar> -> (Mutable)Map.(Mutable)Entry<Foo!, Bar!>!
val mutableEntry = replacePrefixes(
val mutableEntry = replacePrefixesInTypeRepresentations(
lowerRendered,
kotlinCollectionsPrefix + "MutableMap.MutableEntry",
upperRendered,
@@ -215,7 +215,7 @@ internal class DescriptorRendererImpl(
val kotlinPrefix = classifierNamePolicy.renderClassifier(builtIns.array, this).substringBefore("Array")
// Foo[] -> Array<(out) Foo!>!
val array = replacePrefixes(
val array = replacePrefixesInTypeRepresentations(
lowerRendered,
kotlinPrefix + escape("Array<"),
upperRendered,
@@ -227,12 +227,13 @@ internal class DescriptorRendererImpl(
return "($lowerRendered..$upperRendered)"
}
override fun renderTypeArguments(typeArguments: List<TypeProjection>): String = if (typeArguments.isEmpty()) ""
else buildString {
append(lt())
this.appendTypeProjections(typeArguments)
append(gt())
}
override fun renderTypeArguments(typeArguments: List<TypeProjection>): String =
if (typeArguments.isEmpty()) ""
else buildString {
append(lt())
this.appendTypeProjections(typeArguments)
append(gt())
}
private fun StringBuilder.renderDefaultType(type: KotlinType) {
this.renderAnnotations(type)
@@ -1198,29 +1199,5 @@ internal class DescriptorRendererImpl(
}
}
private fun replacePrefixes(
lowerRendered: String,
lowerPrefix: String,
upperRendered: String,
upperPrefix: String,
foldedPrefix: String
): String? {
if (lowerRendered.startsWith(lowerPrefix) && upperRendered.startsWith(upperPrefix)) {
val lowerWithoutPrefix = lowerRendered.substring(lowerPrefix.length)
val upperWithoutPrefix = upperRendered.substring(upperPrefix.length)
val flexibleCollectionName = foldedPrefix + lowerWithoutPrefix
if (lowerWithoutPrefix == upperWithoutPrefix) return flexibleCollectionName
if (differsOnlyInNullability(lowerWithoutPrefix, upperWithoutPrefix)) {
return "$flexibleCollectionName!"
}
}
return null
}
private fun differsOnlyInNullability(lower: String, upper: String) =
lower == upper.replace("?", "") || upper.endsWith("?") && ("$lower?") == upper || "($lower)?" == upper
private fun overridesSomething(callable: CallableMemberDescriptor) = !callable.overriddenDescriptors.isEmpty()
}