aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorVadim Mishenev <vad-mishenev@yandex.ru>2022-10-21 13:59:28 +0300
committerGitHub <noreply@github.com>2022-10-21 13:59:28 +0300
commit4c122a4d46f9f100e1508b602942c571067a1d88 (patch)
treef0f7a24cc0b383fd7c79fa2fc9d71514c476d8fb
parentcacdcd9739bb4fefb5a92cefd30ec58a172db148 (diff)
downloaddokka-4c122a4d46f9f100e1508b602942c571067a1d88.tar.gz
dokka-4c122a4d46f9f100e1508b602942c571067a1d88.tar.bz2
dokka-4c122a4d46f9f100e1508b602942c571067a1d88.zip
Fix inheriting docs in case of diamond inheritance (#2686)
-rw-r--r--plugins/base/src/main/kotlin/translators/descriptors/DefaultDescriptorToDocumentableTranslator.kt10
-rw-r--r--plugins/base/src/test/kotlin/model/InheritorsTest.kt59
2 files changed, 59 insertions, 10 deletions
diff --git a/plugins/base/src/main/kotlin/translators/descriptors/DefaultDescriptorToDocumentableTranslator.kt b/plugins/base/src/main/kotlin/translators/descriptors/DefaultDescriptorToDocumentableTranslator.kt
index e3e1a33e..9de85eb0 100644
--- a/plugins/base/src/main/kotlin/translators/descriptors/DefaultDescriptorToDocumentableTranslator.kt
+++ b/plugins/base/src/main/kotlin/translators/descriptors/DefaultDescriptorToDocumentableTranslator.kt
@@ -1,5 +1,6 @@
package org.jetbrains.dokka.base.translators.descriptors
+import com.intellij.psi.PsiElement
import com.intellij.psi.PsiNamedElement
import com.intellij.psi.util.PsiLiteralUtil.*
import kotlinx.coroutines.Dispatchers
@@ -49,6 +50,7 @@ import org.jetbrains.kotlin.load.java.descriptors.JavaPropertyDescriptor
import org.jetbrains.kotlin.load.kotlin.toSourceElement
import org.jetbrains.kotlin.name.FqName
import org.jetbrains.kotlin.psi.*
+import org.jetbrains.kotlin.resolve.DescriptorToSourceUtils
import org.jetbrains.kotlin.resolve.DescriptorUtils
import org.jetbrains.kotlin.resolve.calls.components.isVararg
import org.jetbrains.kotlin.resolve.calls.util.getValueArgumentsInParentheses
@@ -1016,7 +1018,13 @@ private class DokkaDescriptorVisitor(
org.jetbrains.kotlin.types.Variance.OUT_VARIANCE -> Covariance(this)
}
- private fun DeclarationDescriptor.getDocumentation() = (findKDoc()?.let {
+ private fun descriptorToAnyDeclaration(descriptor: DeclarationDescriptor): PsiElement? {
+ val effectiveReferencedDescriptors = DescriptorToSourceUtils.getEffectiveReferencedDescriptors(descriptor)
+ //take any
+ return effectiveReferencedDescriptors.firstOrNull()?.let { DescriptorToSourceUtils.getSourceFromDescriptor(it) }
+ }
+
+ private fun DeclarationDescriptor.getDocumentation() = (findKDoc(::descriptorToAnyDeclaration)?.let {
MarkdownParser.parseFromKDocTag(
kDocTag = it,
externalDri = { link: String ->
diff --git a/plugins/base/src/test/kotlin/model/InheritorsTest.kt b/plugins/base/src/test/kotlin/model/InheritorsTest.kt
index 151783a9..49d02e4c 100644
--- a/plugins/base/src/test/kotlin/model/InheritorsTest.kt
+++ b/plugins/base/src/test/kotlin/model/InheritorsTest.kt
@@ -106,15 +106,6 @@ class InheritorsTest : AbstractModelTest("/src/main/kotlin/inheritors/Test.kt",
}
}
}
- interface A<E> {
- val a: E
- }
-
- open class C
- class B<E>() : C(), A<E> {
- override val a: E
- get() = TODO("Not yet implemented")
- }
@Test
fun `should inherit docs`() {
@@ -370,4 +361,54 @@ class InheritorsTest : AbstractModelTest("/src/main/kotlin/inheritors/Test.kt",
}
}
}
+
+ @Test
+ fun `should inherit docs in case of diamond inheritance`() {
+ inlineModelTest(
+ """
+ public interface Collection2<out E> {
+ /**
+ * Returns `true` if the collection is empty (contains no elements), `false` otherwise.
+ */
+ public fun isEmpty(): Boolean
+
+ /**
+ * Checks if the specified element is contained in this collection.
+ */
+ public operator fun contains(element: @UnsafeVariance E): Boolean
+ }
+
+ public interface MutableCollection2<E> : Collection2<E>, MutableIterable2<E>
+
+
+ public interface List2<out E> : Collection2<E> {
+ override fun isEmpty(): Boolean
+ override fun contains(element: @UnsafeVariance E): Boolean
+ }
+
+ public interface MutableList2<E> : List2<E>, MutableCollection2<E>
+
+ public class AbstractMutableList2<E> : MutableList2<E> {
+ protected constructor()
+
+ // From List
+
+ override fun isEmpty(): Boolean = size == 0
+ public override fun contains(element: E): Boolean = indexOf(element) != -1
+ }
+ public class ArrayDeque2<E> : AbstractMutableList2<E> {
+ override fun isEmpty(): Boolean = size == 0
+ public override fun contains(element: E): Boolean = indexOf(element) != -1
+
+ }
+ """.trimMargin()
+ ) {
+ with((this / "inheritors" / "ArrayDeque2" / "isEmpty").cast<DFunction>()) {
+ documentation.size equals 1
+ }
+ with((this / "inheritors" / "ArrayDeque2" / "contains").cast<DFunction>()) {
+ documentation.size equals 1
+ }
+ }
+ }
}