aboutsummaryrefslogtreecommitdiff
path: root/kotlin-analysis/src/main/kotlin/org
diff options
context:
space:
mode:
authorPaweł Marks <pmarks@virtuslab.com>2020-08-21 16:29:39 +0200
committerKamil Doległo <9080183+kamildoleglo@users.noreply.github.com>2020-08-21 17:51:18 +0200
commitf2635289b1923866843e1dd47423bd6ca74c2cb1 (patch)
treee669d400535b390c87fa121224d0ecb9fd40b048 /kotlin-analysis/src/main/kotlin/org
parent705cbd313838db9f0c64d8f2bc7947ccbb40ed19 (diff)
downloaddokka-f2635289b1923866843e1dd47423bd6ca74c2cb1.tar.gz
dokka-f2635289b1923866843e1dd47423bd6ca74c2cb1.tar.bz2
dokka-f2635289b1923866843e1dd47423bd6ca74c2cb1.zip
Replace SelfType with family of RecursiveTypes
Diffstat (limited to 'kotlin-analysis/src/main/kotlin/org')
-rw-r--r--kotlin-analysis/src/main/kotlin/org/jetbrains/dokka/analysis/TypeReferenceFactory.kt28
1 files changed, 16 insertions, 12 deletions
diff --git a/kotlin-analysis/src/main/kotlin/org/jetbrains/dokka/analysis/TypeReferenceFactory.kt b/kotlin-analysis/src/main/kotlin/org/jetbrains/dokka/analysis/TypeReferenceFactory.kt
index e07672d4..aae1f189 100644
--- a/kotlin-analysis/src/main/kotlin/org/jetbrains/dokka/analysis/TypeReferenceFactory.kt
+++ b/kotlin-analysis/src/main/kotlin/org/jetbrains/dokka/analysis/TypeReferenceFactory.kt
@@ -12,7 +12,7 @@ import org.jetbrains.kotlin.types.TypeProjection
fun TypeReference.Companion.from(d: ReceiverParameterDescriptor): TypeReference? =
when (d.value) {
- is ExtensionReceiver -> fromPossiblyNullable(d.type)
+ is ExtensionReceiver -> fromPossiblyNullable(d.type, emptyList())
else -> run {
println("Unknown value type for $d")
null
@@ -20,31 +20,35 @@ fun TypeReference.Companion.from(d: ReceiverParameterDescriptor): TypeReference?
}
fun TypeReference.Companion.from(d: ValueParameterDescriptor): TypeReference? =
- fromPossiblyNullable(d.type)
+ fromPossiblyNullable(d.type, emptyList())
fun TypeReference.Companion.from(p: PsiClass) = TypeReference
-private fun TypeReference.Companion.fromPossiblyNullable(t: KotlinType, self: KotlinType? = null): TypeReference =
- from(t, self).let { if (t.isMarkedNullable) Nullable(it) else it }
+private fun TypeReference.Companion.fromPossiblyNullable(t: KotlinType, paramTrace: List<KotlinType>): TypeReference =
+ fromPossiblyRecursive(t, paramTrace).let { if (t.isMarkedNullable) Nullable(it) else it }
-private fun TypeReference.Companion.from(t: KotlinType, self: KotlinType? = null): TypeReference =
- if (self is KotlinType && self.constructor == t.constructor && self.arguments == t.arguments)
- SelfType
- else when (val d = t.constructor.declarationDescriptor) {
+private fun TypeReference.Companion.fromPossiblyRecursive(t: KotlinType, paramTrace: List<KotlinType>): TypeReference =
+ paramTrace.indexOfFirst { it.constructor == t.constructor && it.arguments == t.arguments }
+ .takeIf { it >= 0 }
+ ?.let(::RecursiveType)
+ ?: from(t, paramTrace)
+
+private fun TypeReference.Companion.from(t: KotlinType, paramTrace: List<KotlinType>): TypeReference =
+ when (val d = t.constructor.declarationDescriptor) {
is TypeParameterDescriptor -> TypeParam(
- d.upperBounds.map { fromPossiblyNullable(it, self ?: t) }
+ d.upperBounds.map { fromPossiblyNullable(it, paramTrace + t) }
)
else -> TypeConstructor(
t.constructorName.orEmpty(),
- t.arguments.map { fromProjection(it, self) }
+ t.arguments.map { fromProjection(it, paramTrace) }
)
}
-private fun TypeReference.Companion.fromProjection(t: TypeProjection, r: KotlinType? = null): TypeReference =
+private fun TypeReference.Companion.fromProjection(t: TypeProjection, paramTrace: List<KotlinType>): TypeReference =
if (t.isStarProjection) {
StarProjection
} else {
- fromPossiblyNullable(t.type, r)
+ fromPossiblyNullable(t.type, paramTrace)
}
private val KotlinType.constructorName