Skip to content

Commit cafdaa2

Browse files
authored
[K2] Fix sample resolving (#3361)
* [K2] Fix sample Fallback to default roots of the source set even if sample roots are assigned * [K2] Resolve java samples as well `sourcePsiSafe` does not support Java KT-53669
1 parent 99aa026 commit cafdaa2

File tree

2 files changed

+32
-12
lines changed

2 files changed

+32
-12
lines changed

dokka-subprojects/analysis-kotlin-api/src/test/kotlin/org/jetbrains/dokka/analysis/test/sample/SampleAnalysisTest.kt

Lines changed: 0 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,6 @@ import org.jetbrains.dokka.analysis.test.api.mixedJvmTestProject
1010
import org.jetbrains.dokka.analysis.test.api.useServices
1111
import org.jetbrains.dokka.analysis.test.api.util.CollectingDokkaConsoleLogger
1212
import org.jetbrains.dokka.analysis.test.api.util.singleSourceSet
13-
import org.junit.jupiter.api.Tag
1413
import kotlin.test.*
1514

1615
class SampleAnalysisTest {
@@ -75,7 +74,6 @@ class SampleAnalysisTest {
7574
}
7675

7776
@Test
78-
@Tag("onlyDescriptors") // TODO #3359
7977
fun `should resolve a valid sample if set via the additionalSourceRoots option`() {
8078
val testProject = kotlinJvmTestProject {
8179
dokkaConfiguration {
@@ -135,7 +133,6 @@ class SampleAnalysisTest {
135133
}
136134

137135
@Test
138-
@Tag("onlyDescriptors") // TODO #3359
139136
fun `should resolve a valid sample function that exists in the main source set`() {
140137
val testProject = kotlinJvmTestProject {
141138
ktFile("org/jetbrains/dokka/test/MyKotlinFile.kt") {
@@ -325,7 +322,6 @@ class SampleAnalysisTest {
325322
}
326323

327324
@Test
328-
@Tag("onlyDescriptors") // TODO #3359
329325
fun `should return null if trying to resolve a non-kotlin sample link`() {
330326
val testProject = mixedJvmTestProject {
331327
kotlinSourceDirectory {
@@ -366,7 +362,6 @@ class SampleAnalysisTest {
366362
}
367363

368364
@Test
369-
@Tag("onlyDescriptors") // TODO #3359
370365
fun `should filter out empty import statement lines`() {
371366
val testProject = kotlinJvmTestProject {
372367
ktFile("org/jetbrains/dokka/test/MyKotlinFile.kt") {
@@ -403,7 +398,6 @@ class SampleAnalysisTest {
403398
}
404399

405400
@Test
406-
@Tag("onlyDescriptors") // TODO #3359
407401
fun `should return an empty list of imports if sample file has none`() {
408402
val testProject = kotlinJvmTestProject {
409403
ktFile("org/jetbrains/dokka/test/MyKotlinFile.kt") {
@@ -430,7 +424,6 @@ class SampleAnalysisTest {
430424
}
431425

432426
@Test
433-
@Tag("onlyDescriptors") // TODO #3359
434427
fun `should filter out leading and trailing line breaks`() {
435428
val testProject = kotlinJvmTestProject {
436429
ktFile("org/jetbrains/dokka/test/MyKotlinFile.kt") {
@@ -459,7 +452,6 @@ class SampleAnalysisTest {
459452
}
460453

461454
@Test
462-
@Tag("onlyDescriptors") // TODO #3359
463455
fun `should filter out trailing whitespace`() {
464456
val testProject = kotlinJvmTestProject {
465457
ktFile("org/jetbrains/dokka/test/MyKotlinFile.kt") {

dokka-subprojects/analysis-kotlin-symbols/src/main/kotlin/org/jetbrains/dokka/analysis/kotlin/symbols/services/SymbolSampleAnalysisEnvironment.kt

Lines changed: 32 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,8 @@ import org.jetbrains.dokka.plugability.plugin
2020
import org.jetbrains.dokka.plugability.querySingle
2121
import org.jetbrains.dokka.utilities.DokkaLogger
2222
import org.jetbrains.kotlin.analysis.api.analyze
23-
import org.jetbrains.kotlin.analysis.api.symbols.sourcePsiSafe
23+
import org.jetbrains.kotlin.analysis.api.symbols.KtSymbol
24+
import org.jetbrains.kotlin.analysis.api.symbols.KtSymbolOrigin
2425
import org.jetbrains.kotlin.idea.KotlinLanguage
2526
import org.jetbrains.kotlin.psi.KtBlockExpression
2627
import org.jetbrains.kotlin.psi.KtDeclarationWithBody
@@ -78,13 +79,40 @@ private class SymbolSampleAnalysisEnvironment(
7879
return SampleSnippet(imports, body)
7980
}
8081

82+
// TODO: remove after KT-53669 and use [org.jetbrains.kotlin.analysis.api.symbols.sourcePsiSafe] from Analysis API
83+
private inline fun <reified PSI : PsiElement> KtSymbol.kotlinAndJavaSourcePsiSafe(): PSI? {
84+
// TODO: support Java sources after KT-53669
85+
val sourcePsi = when (origin) {
86+
KtSymbolOrigin.SOURCE -> this.psi
87+
KtSymbolOrigin.JAVA -> this.psi
88+
89+
KtSymbolOrigin.SOURCE_MEMBER_GENERATED -> null
90+
KtSymbolOrigin.LIBRARY -> null
91+
KtSymbolOrigin.SAM_CONSTRUCTOR -> null
92+
KtSymbolOrigin.INTERSECTION_OVERRIDE -> null
93+
KtSymbolOrigin.SUBSTITUTION_OVERRIDE -> null
94+
KtSymbolOrigin.DELEGATED -> null
95+
KtSymbolOrigin.JAVA_SYNTHETIC_PROPERTY -> null
96+
KtSymbolOrigin.PROPERTY_BACKING_FIELD -> null
97+
KtSymbolOrigin.PLUGIN -> null
98+
KtSymbolOrigin.JS_DYNAMIC -> null
99+
}
100+
101+
return sourcePsi as? PSI
102+
}
103+
81104
private fun findPsiElement(sourceSet: DokkaSourceSet, fqLink: String): PsiElement? {
82-
val ktSourceModule = samplesKotlinAnalysis.getModuleOrNull(sourceSet)
83-
?: projectKotlinAnalysis.getModule(sourceSet)
105+
// fallback to default roots of the source set even if sample roots are assigned,
106+
// because `@sample` tag can contain links to functions from project sources
107+
return samplesKotlinAnalysis.findPsiElement(sourceSet, fqLink)
108+
?: projectKotlinAnalysis.findPsiElement(sourceSet, fqLink)
109+
}
84110

111+
private fun KotlinAnalysis.findPsiElement(sourceSet: DokkaSourceSet, fqLink: String): PsiElement? {
112+
val ktSourceModule = this.getModuleOrNull(sourceSet) ?: return null
85113
return analyze(ktSourceModule) {
86114
resolveKDocTextLinkToSymbol(fqLink)
87-
?.sourcePsiSafe()
115+
?.kotlinAndJavaSourcePsiSafe()
88116
}
89117
}
90118

0 commit comments

Comments
 (0)