Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[K2] Fix DRI and KDoc for intersection overridden declarations #3718

Open
wants to merge 1 commit into
base: master
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
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
Loading