Introduce PossiblyInnerType class
Use it when rendering inner types, similar logic will be used in different subsystems
This commit is contained in:
@@ -16,6 +16,9 @@
|
|||||||
|
|
||||||
package org.jetbrains.kotlin.descriptors
|
package org.jetbrains.kotlin.descriptors
|
||||||
|
|
||||||
|
import org.jetbrains.kotlin.types.KotlinType
|
||||||
|
import org.jetbrains.kotlin.types.TypeProjection
|
||||||
|
|
||||||
fun ClassDescriptor.computeConstructorTypeParameters(): List<TypeParameterDescriptor> {
|
fun ClassDescriptor.computeConstructorTypeParameters(): List<TypeParameterDescriptor> {
|
||||||
val declaredParameters = declaredTypeParameters
|
val declaredParameters = declaredTypeParameters
|
||||||
|
|
||||||
@@ -44,3 +47,30 @@ private class CapturedTypeParameterDescriptor(
|
|||||||
override fun getIndex() = declaredTypeParametersCount + originalDescriptor.index
|
override fun getIndex() = declaredTypeParametersCount + originalDescriptor.index
|
||||||
override fun toString() = originalDescriptor.toString() + "[inner-copy]"
|
override fun toString() = originalDescriptor.toString() + "[inner-copy]"
|
||||||
}
|
}
|
||||||
|
|
||||||
|
class PossiblyInnerType(
|
||||||
|
val classDescriptor: ClassDescriptor,
|
||||||
|
val arguments: List<TypeProjection>,
|
||||||
|
val outerType: PossiblyInnerType?) {
|
||||||
|
fun segments(): List<PossiblyInnerType> = outerType?.segments().orEmpty() + this
|
||||||
|
}
|
||||||
|
|
||||||
|
fun KotlinType.buildPossiblyInnerType(): PossiblyInnerType?
|
||||||
|
= buildPossiblyInnerType(constructor.declarationDescriptor as? ClassDescriptor, 0)
|
||||||
|
|
||||||
|
private fun KotlinType.buildPossiblyInnerType(classDescriptor: ClassDescriptor?, index: Int): PossiblyInnerType? {
|
||||||
|
if (classDescriptor == null) return null
|
||||||
|
|
||||||
|
val toIndex = classDescriptor.declaredTypeParameters.size + index
|
||||||
|
val argumentsSubList = arguments.subList(index, toIndex)
|
||||||
|
|
||||||
|
if (!classDescriptor.isInner) {
|
||||||
|
assert(toIndex == arguments.size) { "${arguments.size - toIndex} trailing arguments were found in $this type" }
|
||||||
|
|
||||||
|
return PossiblyInnerType(classDescriptor, argumentsSubList, null)
|
||||||
|
}
|
||||||
|
|
||||||
|
return PossiblyInnerType(
|
||||||
|
classDescriptor, argumentsSubList,
|
||||||
|
buildPossiblyInnerType(classDescriptor.containingDeclaration as? ClassDescriptor, toIndex))
|
||||||
|
}
|
||||||
|
|||||||
@@ -246,15 +246,6 @@ internal class DescriptorRendererImpl(
|
|||||||
}.toString()
|
}.toString()
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun renderTypeArgumentsForTypeConstructor(
|
|
||||||
type: KotlinType,
|
|
||||||
typeConstructor: TypeConstructor
|
|
||||||
): String {
|
|
||||||
return type.arguments.zip(type.constructor.parameters).filter {
|
|
||||||
(it.second.original.containingDeclaration as? ClassifierDescriptor)?.typeConstructor == typeConstructor
|
|
||||||
}.map { it.first }.let { renderTypeArguments(it) }
|
|
||||||
}
|
|
||||||
|
|
||||||
private fun renderDefaultType(type: KotlinType): String {
|
private fun renderDefaultType(type: KotlinType): String {
|
||||||
val sb = StringBuilder()
|
val sb = StringBuilder()
|
||||||
|
|
||||||
@@ -278,27 +269,31 @@ internal class DescriptorRendererImpl(
|
|||||||
type: KotlinType,
|
type: KotlinType,
|
||||||
typeConstructor: TypeConstructor = type.constructor
|
typeConstructor: TypeConstructor = type.constructor
|
||||||
): String =
|
): String =
|
||||||
StringBuilder().apply {
|
buildString {
|
||||||
val classDescriptor = typeConstructor.declarationDescriptor as? ClassDescriptor
|
|
||||||
|
|
||||||
if (classDescriptor is MissingDependencyErrorClass) {
|
val possiblyInnerType = type.buildPossiblyInnerType()
|
||||||
|
if (possiblyInnerType == null) {
|
||||||
append(renderTypeConstructor(typeConstructor))
|
append(renderTypeConstructor(typeConstructor))
|
||||||
append(renderTypeArguments(type.arguments))
|
append(renderTypeArguments(type.arguments))
|
||||||
return@apply
|
return@buildString
|
||||||
}
|
}
|
||||||
|
|
||||||
if (classDescriptor != null && classDescriptor.isInner) {
|
append(renderPossiblyInnerType(possiblyInnerType))
|
||||||
append(renderTypeConstructorAndArguments(type, (classDescriptor.containingDeclaration as ClassDescriptor).typeConstructor))
|
|
||||||
append('.')
|
|
||||||
append(renderName(classDescriptor.name))
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
append(renderTypeConstructor(typeConstructor))
|
|
||||||
}
|
|
||||||
|
|
||||||
append(renderTypeArgumentsForTypeConstructor(type, typeConstructor))
|
|
||||||
}.toString()
|
}.toString()
|
||||||
|
|
||||||
|
private fun renderPossiblyInnerType(possiblyInnerType: PossiblyInnerType): String =
|
||||||
|
buildString {
|
||||||
|
possiblyInnerType.outerType?.let {
|
||||||
|
append(renderPossiblyInnerType(it))
|
||||||
|
append('.')
|
||||||
|
append(renderName(possiblyInnerType.classDescriptor.name))
|
||||||
|
} ?: append(renderTypeConstructor(possiblyInnerType.classDescriptor.typeConstructor))
|
||||||
|
|
||||||
|
append(renderTypeArguments(possiblyInnerType.arguments))
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
override fun renderTypeConstructor(typeConstructor: TypeConstructor): String {
|
override fun renderTypeConstructor(typeConstructor: TypeConstructor): String {
|
||||||
val cd = typeConstructor.getDeclarationDescriptor()
|
val cd = typeConstructor.getDeclarationDescriptor()
|
||||||
return when (cd) {
|
return when (cd) {
|
||||||
|
|||||||
Reference in New Issue
Block a user