Skip to content

Commit

Permalink
[K2] Fix DRI and KDoc for intersection overridden declarations (#3718)
Browse files Browse the repository at this point in the history
  • Loading branch information
vmishenev authored Aug 6, 2024
1 parent c378a63 commit dde362e
Show file tree
Hide file tree
Showing 4 changed files with 60 additions and 3 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -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)
Expand Down Expand Up @@ -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
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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 {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,13 +7,15 @@ 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
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
Expand Down Expand Up @@ -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<DFunction>()) {
comments() equals "Some doc\n"
dri equals DRI("inheritors", "FirstParent", org.jetbrains.dokka.links.Callable("toString", null, emptyList()) )
}
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down Expand Up @@ -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"),
Expand All @@ -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("""
Expand Down

0 comments on commit dde362e

Please sign in to comment.