diff --git a/dokka-integration-tests/cli/src/integrationTest/kotlin/org/jetbrains/dokka/it/cli/CliIntegrationTest.kt b/dokka-integration-tests/cli/src/integrationTest/kotlin/org/jetbrains/dokka/it/cli/CliIntegrationTest.kt index 8bab690bb34..b5387b1da92 100644 --- a/dokka-integration-tests/cli/src/integrationTest/kotlin/org/jetbrains/dokka/it/cli/CliIntegrationTest.kt +++ b/dokka-integration-tests/cli/src/integrationTest/kotlin/org/jetbrains/dokka/it/cli/CliIntegrationTest.kt @@ -374,4 +374,42 @@ class CliIntegrationTest : AbstractCliIntegrationTest() { assertTrue(dokkaOutputDir.isDirectory, "Missing dokka output directory") } + + @Test + fun `relative paths in configuraiton should work`() { + val resourcePath = + javaClass.getResource("/my-file.json")?.toURI() ?: throw IllegalStateException("No JSON found!") + val jsonPath = File(resourcePath) + + val dokkaOutputDir = File(projectDir, "output-relative") + assertTrue(dokkaOutputDir.mkdirs()) + jsonPath.writeText( + jsonBuilder( + outputPath = dokkaOutputDir.invariantSeparatorsPath, + pluginsClasspath = basePluginJarFile.absoluteFile.invariantSeparatorsPath, + projectPath = "src", // relative path + ) + ) + + ProcessBuilder( + "java", "-jar", cliJarFile.absolutePath, jsonPath.absolutePath + ).directory(projectDir).redirectErrorStream(true).start().also { process -> + val result = process.awaitProcessResult() + assertEquals(0, result.exitCode, "Expected exitCode 0 (Success)") + } + + assertTrue(dokkaOutputDir.isDirectory, "Missing dokka output directory") + + val htmlFiles = dokkaOutputDir.allHtmlFiles().map { it.relativeTo(dokkaOutputDir).path }.toList() + + // check that both Kotlin and Java sources are processed + + // kotlin: + assertContains(htmlFiles, "-dokka -example/it.basic/index.html") + assertContains(htmlFiles, "-dokka -example/it.basic/-public-class/public-documented-function.html") + + // java: + assertContains(htmlFiles, "-dokka -example/it.basic.java/index.html") + assertContains(htmlFiles, "-dokka -example/it.basic.java/-sample-java-class/public-documented-function.html") + } } diff --git a/dokka-subprojects/analysis-kotlin-descriptors-compiler/src/main/kotlin/org/jetbrains/dokka/analysis/kotlin/descriptors/compiler/translator/DefaultDescriptorToDocumentableTranslator.kt b/dokka-subprojects/analysis-kotlin-descriptors-compiler/src/main/kotlin/org/jetbrains/dokka/analysis/kotlin/descriptors/compiler/translator/DefaultDescriptorToDocumentableTranslator.kt index 4d5611891f9..73adc2714c7 100644 --- a/dokka-subprojects/analysis-kotlin-descriptors-compiler/src/main/kotlin/org/jetbrains/dokka/analysis/kotlin/descriptors/compiler/translator/DefaultDescriptorToDocumentableTranslator.kt +++ b/dokka-subprojects/analysis-kotlin-descriptors-compiler/src/main/kotlin/org/jetbrains/dokka/analysis/kotlin/descriptors/compiler/translator/DefaultDescriptorToDocumentableTranslator.kt @@ -159,9 +159,14 @@ private class DokkaDescriptorVisitor( private val syntheticDocProvider = SyntheticDescriptorDocumentationProvider(kDocFinder, sourceSet) private fun Collection.filterDescriptorsInSourceSet() = filter { - it.toSourceElement.containingFile.toString().let { path -> - path.isNotBlank() && sourceSet.sourceRoots.any { root -> - Paths.get(path).startsWith(root.toPath()) + val pathString = it.toSourceElement.containingFile.toString() + when { + pathString.isBlank() -> false + else -> { + val absolutePath = Paths.get(pathString).toAbsolutePath() + sourceSet.sourceRoots.any { root -> + absolutePath.startsWith(root.toPath().toAbsolutePath()) + } } } } 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 298d0182ca2..cbe5348f1bf 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 @@ -109,11 +109,16 @@ internal class DokkaSymbolVisitor( get() = (psi as? KtModifierListOwner)?.hasExpectModifier() == true private fun Collection.filterSymbolsInSourceSet() = filter { - it.psi?.containingFile?.virtualFile?.path?.let { path -> - path.isNotBlank() && sourceSet.sourceRoots.any { root -> - Paths.get(path).startsWith(root.toPath()) + val pathString = it.psi?.containingFile?.virtualFile?.path + when { + pathString.isNullOrBlank() -> false + else -> { + val absolutePath = Paths.get(pathString).toAbsolutePath() + sourceSet.sourceRoots.any { root -> + absolutePath.startsWith(root.toPath().toAbsolutePath()) + } } - } == true + } } fun visitModule(): DModule {