diff --git a/dokka-subprojects/analysis-kotlin-symbols/src/main/kotlin/org/jetbrains/dokka/analysis/kotlin/symbols/kdoc/KDocProvider.kt b/dokka-subprojects/analysis-kotlin-symbols/src/main/kotlin/org/jetbrains/dokka/analysis/kotlin/symbols/kdoc/KDocProvider.kt index aa05308e53..0211e1ab17 100644 --- a/dokka-subprojects/analysis-kotlin-symbols/src/main/kotlin/org/jetbrains/dokka/analysis/kotlin/symbols/kdoc/KDocProvider.kt +++ b/dokka-subprojects/analysis-kotlin-symbols/src/main/kotlin/org/jetbrains/dokka/analysis/kotlin/symbols/kdoc/KDocProvider.kt @@ -32,8 +32,11 @@ internal fun KaSession.getJavaDocDocumentationFrom( javadocParser.parseDocumentation(it) } } else if (symbol.origin == KaSymbolOrigin.SOURCE && symbol is KaCallableSymbol) { + // TODO https://youtrack.jetbrains.com/issue/KT-70326/Analysis-API-Inconsistent-allOverriddenSymbols-and-directlyOverriddenSymbols-for-an-intersection-symbol + val allOverriddenSymbolsWithIntersection = symbol.intersectionOverriddenSymbols.asSequence() + symbol.allOverriddenSymbols + // Note: javadocParser searches in overridden JAVA declarations for JAVA method, not Kotlin - symbol.allOverriddenSymbols.forEach { overrider -> + allOverriddenSymbolsWithIntersection.forEach { overrider -> if (overrider.origin == KaSymbolOrigin.JAVA_SOURCE) return@getJavaDocDocumentationFrom (overrider.psi as? PsiNamedElement)?.let { javadocParser.parseDocumentation(it) @@ -103,7 +106,10 @@ internal fun KaSession.findKDoc(symbol: KaSymbol): KDocContent? { } if (symbol is KaCallableSymbol) { - symbol.allOverriddenSymbols.forEach { overrider -> + // TODO https://youtrack.jetbrains.com/issue/KT-70326/Analysis-API-Inconsistent-allOverriddenSymbols-and-directlyOverriddenSymbols-for-an-intersection-symbol + val allOverriddenSymbolsWithIntersection = symbol.intersectionOverriddenSymbols.filterNot { it == symbol }.asSequence() + symbol.allOverriddenSymbols + + allOverriddenSymbolsWithIntersection.forEach { overrider -> findKDoc(overrider)?.let { return it } diff --git a/dokka-subprojects/analysis-kotlin-symbols/src/main/kotlin/org/jetbrains/dokka/analysis/kotlin/symbols/translators/DefaultSymbolToDocumentableTranslator.kt b/dokka-subprojects/analysis-kotlin-symbols/src/main/kotlin/org/jetbrains/dokka/analysis/kotlin/symbols/translators/DefaultSymbolToDocumentableTranslator.kt index 1a6c9b2cfb..f1d57c9d82 100644 --- a/dokka-subprojects/analysis-kotlin-symbols/src/main/kotlin/org/jetbrains/dokka/analysis/kotlin/symbols/translators/DefaultSymbolToDocumentableTranslator.kt +++ b/dokka-subprojects/analysis-kotlin-symbols/src/main/kotlin/org/jetbrains/dokka/analysis/kotlin/symbols/translators/DefaultSymbolToDocumentableTranslator.kt @@ -838,7 +838,7 @@ internal class DokkaSymbolVisitor( return DRIWithOverridden(getDRIFromSymbol(callableSymbol), wasOverriddenBy) } else { // fake, synthetic, delegating - val firstOverriddenSymbolOrNull = callableSymbol.allOverriddenSymbols.firstOrNull() + val firstOverriddenSymbolOrNull = callableSymbol.directlyOverriddenSymbols.firstOrNull() return if (firstOverriddenSymbolOrNull == null) { DRIWithOverridden(getDRIFromSymbol(callableSymbol), wasOverriddenBy) } else { diff --git a/dokka-subprojects/plugin-base/src/test/kotlin/model/InheritorsTest.kt b/dokka-subprojects/plugin-base/src/test/kotlin/model/InheritorsTest.kt index 6a218094c0..59f7c15c37 100644 --- a/dokka-subprojects/plugin-base/src/test/kotlin/model/InheritorsTest.kt +++ b/dokka-subprojects/plugin-base/src/test/kotlin/model/InheritorsTest.kt @@ -7,6 +7,7 @@ package model import org.jetbrains.dokka.Platform import org.jetbrains.dokka.analysis.kotlin.markdown.MARKDOWN_ELEMENT_FILE_NAME import org.jetbrains.dokka.base.transformers.documentables.InheritorsInfo +import org.jetbrains.dokka.links.DRI import org.jetbrains.dokka.model.* import org.jetbrains.dokka.model.doc.CustomDocTag import org.jetbrains.dokka.model.doc.Description @@ -14,6 +15,7 @@ import org.jetbrains.dokka.model.doc.P import org.jetbrains.dokka.model.doc.Text import utils.AbstractModelTest import utils.assertNotNull +import utils.comments import kotlin.test.Test import kotlin.test.assertEquals import kotlin.test.assertTrue @@ -683,4 +685,30 @@ class InheritorsTest : AbstractModelTest("/src/main/kotlin/inheritors/Test.kt", } } + @Test + fun `intersection overridden should have KDoc and correct DRI`() { + inlineModelTest( + """ + |open class FirstParent { + | fun basicMethod() = "OK" + | /** + | * Some doc + | */ + | override fun toString(): String { + | return super.toString() + | } + |} + | + |interface ISecondParent {} + | + |class ChildWithOneParent : FirstParent() + |class ChildWithTwoParent : FirstParent(), ISecondParent + """ + ) { + with((this / "inheritors" / "ChildWithTwoParent" / "toString").cast()) { + comments() equals "Some doc\n" + dri equals DRI("inheritors", "FirstParent", org.jetbrains.dokka.links.Callable("toString", null, emptyList()) ) + } + } + } } diff --git a/dokka-subprojects/plugin-base/src/test/kotlin/signatures/FunctionalTypeConstructorsSignatureTest.kt b/dokka-subprojects/plugin-base/src/test/kotlin/signatures/FunctionalTypeConstructorsSignatureTest.kt index 31f0a241b9..de666bea98 100644 --- a/dokka-subprojects/plugin-base/src/test/kotlin/signatures/FunctionalTypeConstructorsSignatureTest.kt +++ b/dokka-subprojects/plugin-base/src/test/kotlin/signatures/FunctionalTypeConstructorsSignatureTest.kt @@ -10,6 +10,7 @@ import org.jetbrains.dokka.jdk import utils.A import utils.Span import utils.TestOutputWriterPlugin +import utils.Wbr import utils.match import kotlin.test.Ignore import kotlin.test.Test @@ -116,6 +117,9 @@ class FunctionalTypeConstructorsSignatureTest : BaseAbstractTest() { configuration, pluginOverrides = listOf(writerPlugin) ) { + documentablesMergingStage = { + println(it) + } renderingStage = { _, _ -> writerPlugin.writer.renderedContent("root/example/index.html").firstSignature().match( "val ", A("nF"), ": (param: ", A("Int"), ") -> ", A("String"), @@ -125,6 +129,25 @@ class FunctionalTypeConstructorsSignatureTest : BaseAbstractTest() { } } + @Test + fun `kotlin syntactic sugar function with explicit the @ParameterName annotation`() { + val source = source("val nF: (@ParameterName(name=\"param\") Int) -> String = { _ -> \"\" }\n") + val writerPlugin = TestOutputWriterPlugin() + + testInline( + source, + configuration, + pluginOverrides = listOf(writerPlugin) + ) { + renderingStage = { _, _ -> + writerPlugin.writer.renderedContent("root/example/index.html").firstSignature().match( + "val ", A("nF"), ": (param: ", Span(Wbr, ") "), A("Int"), ") -> ", A("String"), + ignoreSpanWithTokenStyle = true + ) + } + } + } + @Test fun `kotlin syntactic sugar function with param name of generic and functional type`() { val source = source("""