diff options
author | Vadim Mishenev <vad-mishenev@yandex.ru> | 2022-10-21 13:59:28 +0300 |
---|---|---|
committer | GitHub <noreply@github.com> | 2022-10-21 13:59:28 +0300 |
commit | 4c122a4d46f9f100e1508b602942c571067a1d88 (patch) | |
tree | f0f7a24cc0b383fd7c79fa2fc9d71514c476d8fb | |
parent | cacdcd9739bb4fefb5a92cefd30ec58a172db148 (diff) | |
download | dokka-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.kt | 10 | ||||
-rw-r--r-- | plugins/base/src/test/kotlin/model/InheritorsTest.kt | 59 |
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 + } + } + } } |