Skip to content

Commit

Permalink
[K2] Fix sample resolving (#3361)
Browse files Browse the repository at this point in the history
* [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
  • Loading branch information
vmishenev committed Nov 23, 2023
1 parent 99aa026 commit cafdaa2
Show file tree
Hide file tree
Showing 2 changed files with 32 additions and 12 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,6 @@ import org.jetbrains.dokka.analysis.test.api.mixedJvmTestProject
import org.jetbrains.dokka.analysis.test.api.useServices
import org.jetbrains.dokka.analysis.test.api.util.CollectingDokkaConsoleLogger
import org.jetbrains.dokka.analysis.test.api.util.singleSourceSet
import org.junit.jupiter.api.Tag
import kotlin.test.*

class SampleAnalysisTest {
Expand Down Expand Up @@ -75,7 +74,6 @@ class SampleAnalysisTest {
}

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

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

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

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

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

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

@Test
@Tag("onlyDescriptors") // TODO #3359
fun `should filter out trailing whitespace`() {
val testProject = kotlinJvmTestProject {
ktFile("org/jetbrains/dokka/test/MyKotlinFile.kt") {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,8 @@ import org.jetbrains.dokka.plugability.plugin
import org.jetbrains.dokka.plugability.querySingle
import org.jetbrains.dokka.utilities.DokkaLogger
import org.jetbrains.kotlin.analysis.api.analyze
import org.jetbrains.kotlin.analysis.api.symbols.sourcePsiSafe
import org.jetbrains.kotlin.analysis.api.symbols.KtSymbol
import org.jetbrains.kotlin.analysis.api.symbols.KtSymbolOrigin
import org.jetbrains.kotlin.idea.KotlinLanguage
import org.jetbrains.kotlin.psi.KtBlockExpression
import org.jetbrains.kotlin.psi.KtDeclarationWithBody
Expand Down Expand Up @@ -78,13 +79,40 @@ private class SymbolSampleAnalysisEnvironment(
return SampleSnippet(imports, body)
}

// TODO: remove after KT-53669 and use [org.jetbrains.kotlin.analysis.api.symbols.sourcePsiSafe] from Analysis API
private inline fun <reified PSI : PsiElement> KtSymbol.kotlinAndJavaSourcePsiSafe(): PSI? {
// TODO: support Java sources after KT-53669
val sourcePsi = when (origin) {
KtSymbolOrigin.SOURCE -> this.psi
KtSymbolOrigin.JAVA -> this.psi

KtSymbolOrigin.SOURCE_MEMBER_GENERATED -> null
KtSymbolOrigin.LIBRARY -> null
KtSymbolOrigin.SAM_CONSTRUCTOR -> null
KtSymbolOrigin.INTERSECTION_OVERRIDE -> null
KtSymbolOrigin.SUBSTITUTION_OVERRIDE -> null
KtSymbolOrigin.DELEGATED -> null
KtSymbolOrigin.JAVA_SYNTHETIC_PROPERTY -> null
KtSymbolOrigin.PROPERTY_BACKING_FIELD -> null
KtSymbolOrigin.PLUGIN -> null
KtSymbolOrigin.JS_DYNAMIC -> null
}

return sourcePsi as? PSI
}

private fun findPsiElement(sourceSet: DokkaSourceSet, fqLink: String): PsiElement? {
val ktSourceModule = samplesKotlinAnalysis.getModuleOrNull(sourceSet)
?: projectKotlinAnalysis.getModule(sourceSet)
// fallback to default roots of the source set even if sample roots are assigned,
// because `@sample` tag can contain links to functions from project sources
return samplesKotlinAnalysis.findPsiElement(sourceSet, fqLink)
?: projectKotlinAnalysis.findPsiElement(sourceSet, fqLink)
}

private fun KotlinAnalysis.findPsiElement(sourceSet: DokkaSourceSet, fqLink: String): PsiElement? {
val ktSourceModule = this.getModuleOrNull(sourceSet) ?: return null
return analyze(ktSourceModule) {
resolveKDocTextLinkToSymbol(fqLink)
?.sourcePsiSafe()
?.kotlinAndJavaSourcePsiSafe()
}
}

Expand Down

0 comments on commit cafdaa2

Please sign in to comment.