From 9e65b295b6a677c2a5add62aaed7bfa60cd93a99 Mon Sep 17 00:00:00 2001 From: vmishenev Date: Fri, 18 Aug 2023 23:08:43 +0300 Subject: [PATCH] Fix review comments --- .../KotlinArrayDocumentableReplacerTest.kt | 2 +- .../DescriptorSuperPropertiesTest.kt | 2 +- ...nheritedFunctionsDocumentableFilterTest.kt | 2 +- .../src/test/kotlin/utils/TagsAnnotations.kt | 2 + .../DefaultPsiToDocumentableTranslator.kt | 3 +- .../analysis-kotlin-symbols/ide/api/ide.api | 4 - .../ide/build.gradle.kts | 13 -- .../symbols/ide/IdeSymbolsAnalysisPlugin.kt | 11 -- ...rg.jetbrains.dokka.plugability.DokkaPlugin | 1 - .../plugin/api/plugin.api | 5 + .../kotlin/symbols/plugin/KotlinAnalysis.kt | 186 +++++++++--------- .../symbols/plugin/SymbolsAnalysisPlugin.kt | 5 + .../KotlinAnalysisSourceRootsExtractor.kt | 12 ++ 13 files changed, 122 insertions(+), 126 deletions(-) delete mode 100644 subprojects/analysis-kotlin-symbols/ide/api/ide.api delete mode 100644 subprojects/analysis-kotlin-symbols/ide/build.gradle.kts delete mode 100644 subprojects/analysis-kotlin-symbols/ide/src/main/kotlin/org/jetbrains/dokka/analysis/kotlin/symbols/ide/IdeSymbolsAnalysisPlugin.kt delete mode 100644 subprojects/analysis-kotlin-symbols/ide/src/main/resources/META-INF/services/org.jetbrains.dokka.plugability.DokkaPlugin create mode 100644 subprojects/analysis-kotlin-symbols/plugin/src/main/kotlin/org/jetbrains/dokka/analysis/kotlin/symbols/services/KotlinAnalysisSourceRootsExtractor.kt diff --git a/plugins/base/src/test/kotlin/filter/KotlinArrayDocumentableReplacerTest.kt b/plugins/base/src/test/kotlin/filter/KotlinArrayDocumentableReplacerTest.kt index b94f35e2ff..af77d61cd6 100644 --- a/plugins/base/src/test/kotlin/filter/KotlinArrayDocumentableReplacerTest.kt +++ b/plugins/base/src/test/kotlin/filter/KotlinArrayDocumentableReplacerTest.kt @@ -170,7 +170,7 @@ class KotlinArrayDocumentableReplacerTest : BaseAbstractTest() { } sourceSet { sourceRoots = listOf("src/main/kotlin/basic/TestJS.kt") - analysisPlatform = "jvm" + analysisPlatform = "js" } } } diff --git a/plugins/base/src/test/kotlin/superFields/DescriptorSuperPropertiesTest.kt b/plugins/base/src/test/kotlin/superFields/DescriptorSuperPropertiesTest.kt index 43a9a5ea45..14c2752a64 100644 --- a/plugins/base/src/test/kotlin/superFields/DescriptorSuperPropertiesTest.kt +++ b/plugins/base/src/test/kotlin/superFields/DescriptorSuperPropertiesTest.kt @@ -175,7 +175,7 @@ class DescriptorSuperPropertiesTest : BaseAbstractTest() { } } - // protected is publicAPI + // incorrect test https://github.com/Kotlin/dokka/issues/3128 @Test fun `kotlin inheriting java should not append anything since field is public api`() { val configuration = dokkaConfiguration { diff --git a/plugins/base/src/test/kotlin/transformers/ObviousAndInheritedFunctionsDocumentableFilterTest.kt b/plugins/base/src/test/kotlin/transformers/ObviousAndInheritedFunctionsDocumentableFilterTest.kt index 8e4553210d..ffb5c9c852 100644 --- a/plugins/base/src/test/kotlin/transformers/ObviousAndInheritedFunctionsDocumentableFilterTest.kt +++ b/plugins/base/src/test/kotlin/transformers/ObviousAndInheritedFunctionsDocumentableFilterTest.kt @@ -195,9 +195,9 @@ class ObviousAndInheritedFunctionsDocumentableFilterTest : BaseAbstractTest() { } } - @JavaCode @ParameterizedTest @MethodSource(value = ["nonSuppressingObviousConfiguration", "nonSuppressingInheritedConfiguration"]) + @JavaCode fun `should not suppress toString, equals and hashcode if custom config is provided in Java`(nonSuppressingConfiguration: DokkaConfigurationImpl) { testInline( """ diff --git a/plugins/base/src/test/kotlin/utils/TagsAnnotations.kt b/plugins/base/src/test/kotlin/utils/TagsAnnotations.kt index c083e0ace1..f28e66a975 100644 --- a/plugins/base/src/test/kotlin/utils/TagsAnnotations.kt +++ b/plugins/base/src/test/kotlin/utils/TagsAnnotations.kt @@ -40,6 +40,7 @@ annotation class OnlyDescriptorsMPP(val reason: String = "") /** * For test containing .java code + * These tests are disabled in K2 due to Standlone prototype. https://github.com/Kotlin/dokka/issues/3114 */ @Target( AnnotationTarget.CLASS, @@ -55,6 +56,7 @@ annotation class JavaCode /** * For test using JDK + * These tests are disabled in K2 due to Standlone prototype. https://github.com/Kotlin/dokka/issues/3114 */ @Target( AnnotationTarget.CLASS, diff --git a/subprojects/analysis-java-psi/src/main/kotlin/org/jetbrains/dokka/analysis/java/DefaultPsiToDocumentableTranslator.kt b/subprojects/analysis-java-psi/src/main/kotlin/org/jetbrains/dokka/analysis/java/DefaultPsiToDocumentableTranslator.kt index 61c1af98ee..72cf45d9f6 100644 --- a/subprojects/analysis-java-psi/src/main/kotlin/org/jetbrains/dokka/analysis/java/DefaultPsiToDocumentableTranslator.kt +++ b/subprojects/analysis-java-psi/src/main/kotlin/org/jetbrains/dokka/analysis/java/DefaultPsiToDocumentableTranslator.kt @@ -27,7 +27,8 @@ internal class DefaultPsiToDocumentableTranslator : AsyncSourceToDocumentableTra val projectProvider = context.plugin().querySingle { projectProvider } val project = projectProvider.getProject(sourceSet, context) - val sourceRoots = sourceSet.sourceRoots.filter { directory -> directory.isDirectory || directory.extension == "java" } + val sourceRootsExtractor = context.plugin().querySingle { sourceRootsExtractor } + val sourceRoots = sourceRootsExtractor.extract(sourceSet, context) val localFileSystem = VirtualFileManager.getInstance().getFileSystem("file") diff --git a/subprojects/analysis-kotlin-symbols/ide/api/ide.api b/subprojects/analysis-kotlin-symbols/ide/api/ide.api deleted file mode 100644 index 9be46c0b5f..0000000000 --- a/subprojects/analysis-kotlin-symbols/ide/api/ide.api +++ /dev/null @@ -1,4 +0,0 @@ -public final class org/jetbrains/dokka/analysis/kotlin/symbols/ide/IdeSymbolsAnalysisPlugin : org/jetbrains/dokka/plugability/DokkaPlugin { - public fun ()V -} - diff --git a/subprojects/analysis-kotlin-symbols/ide/build.gradle.kts b/subprojects/analysis-kotlin-symbols/ide/build.gradle.kts deleted file mode 100644 index 876d87ca7b..0000000000 --- a/subprojects/analysis-kotlin-symbols/ide/build.gradle.kts +++ /dev/null @@ -1,13 +0,0 @@ -plugins { - id("org.jetbrains.conventions.kotlin-jvm") -} - -dependencies { - compileOnly(projects.core) - compileOnly(projects.subprojects.analysisKotlinApi) - - // TODO - - // TODO [beresnev] get rid of it - compileOnly(libs.kotlinx.coroutines.core) -} diff --git a/subprojects/analysis-kotlin-symbols/ide/src/main/kotlin/org/jetbrains/dokka/analysis/kotlin/symbols/ide/IdeSymbolsAnalysisPlugin.kt b/subprojects/analysis-kotlin-symbols/ide/src/main/kotlin/org/jetbrains/dokka/analysis/kotlin/symbols/ide/IdeSymbolsAnalysisPlugin.kt deleted file mode 100644 index 33f555cb07..0000000000 --- a/subprojects/analysis-kotlin-symbols/ide/src/main/kotlin/org/jetbrains/dokka/analysis/kotlin/symbols/ide/IdeSymbolsAnalysisPlugin.kt +++ /dev/null @@ -1,11 +0,0 @@ -package org.jetbrains.dokka.analysis.kotlin.symbols.ide - -import org.jetbrains.dokka.plugability.DokkaPlugin -import org.jetbrains.dokka.plugability.DokkaPluginApiPreview -import org.jetbrains.dokka.plugability.PluginApiPreviewAcknowledgement - -class IdeSymbolsAnalysisPlugin : DokkaPlugin() { - - @OptIn(DokkaPluginApiPreview::class) - override fun pluginApiPreviewAcknowledgement(): PluginApiPreviewAcknowledgement = PluginApiPreviewAcknowledgement -} diff --git a/subprojects/analysis-kotlin-symbols/ide/src/main/resources/META-INF/services/org.jetbrains.dokka.plugability.DokkaPlugin b/subprojects/analysis-kotlin-symbols/ide/src/main/resources/META-INF/services/org.jetbrains.dokka.plugability.DokkaPlugin deleted file mode 100644 index 592455784a..0000000000 --- a/subprojects/analysis-kotlin-symbols/ide/src/main/resources/META-INF/services/org.jetbrains.dokka.plugability.DokkaPlugin +++ /dev/null @@ -1 +0,0 @@ -org.jetbrains.dokka.analysis.kotlin.symbols.ide.IdeSymbolsAnalysisPlugin diff --git a/subprojects/analysis-kotlin-symbols/plugin/api/plugin.api b/subprojects/analysis-kotlin-symbols/plugin/api/plugin.api index e4c265c684..4dcffe9ee4 100644 --- a/subprojects/analysis-kotlin-symbols/plugin/api/plugin.api +++ b/subprojects/analysis-kotlin-symbols/plugin/api/plugin.api @@ -16,6 +16,11 @@ public final class org/jetbrains/dokka/analysis/kotlin/symbols/plugin/SymbolsAna public final fun getSymbolToDocumentableTranslator ()Lorg/jetbrains/dokka/plugability/Extension; } +public final class org/jetbrains/dokka/analysis/kotlin/symbols/services/KotlinAnalysisSourceRootsExtractor : org/jetbrains/dokka/analysis/java/SourceRootsExtractor { + public fun ()V + public fun extract (Lorg/jetbrains/dokka/DokkaConfiguration$DokkaSourceSet;Lorg/jetbrains/dokka/plugability/DokkaContext;)Ljava/util/List; +} + public class org/jetbrains/dokka/analysis/kotlin/symbols/services/KotlinSampleProvider : org/jetbrains/dokka/analysis/kotlin/internal/SampleProvider { public fun (Lorg/jetbrains/dokka/plugability/DokkaContext;)V public fun close ()V diff --git a/subprojects/analysis-kotlin-symbols/plugin/src/main/kotlin/org/jetbrains/dokka/analysis/kotlin/symbols/plugin/KotlinAnalysis.kt b/subprojects/analysis-kotlin-symbols/plugin/src/main/kotlin/org/jetbrains/dokka/analysis/kotlin/symbols/plugin/KotlinAnalysis.kt index 8c1c5970fc..8b9e552d12 100644 --- a/subprojects/analysis-kotlin-symbols/plugin/src/main/kotlin/org/jetbrains/dokka/analysis/kotlin/symbols/plugin/KotlinAnalysis.kt +++ b/subprojects/analysis-kotlin-symbols/plugin/src/main/kotlin/org/jetbrains/dokka/analysis/kotlin/symbols/plugin/KotlinAnalysis.kt @@ -40,98 +40,6 @@ internal fun Platform.toTargetPlatform() = when (this) { Platform.jvm -> JvmPlatforms.defaultJvmPlatform } -/** - * Collect source file path from the given [root] store them in [result]. - * - * E.g., for `project/app/src` as a [root], this will walk the file tree and - * collect all `.kt` and `.java` files under that folder. - * - * Note that this util gracefully skips [IOException] during file tree traversal. - */ -internal fun collectSourceFilePaths( - root: Path, - result: MutableSet -) { - // NB: [Files#walk] throws an exception if there is an issue during IO. - // With [Files#walkFileTree] with a custom visitor, we can take control of exception handling. - Files.walkFileTree( - root, - object : SimpleFileVisitor() { - override fun preVisitDirectory(dir: Path, attrs: BasicFileAttributes): FileVisitResult { - return if (Files.isReadable(dir)) - FileVisitResult.CONTINUE - else - FileVisitResult.SKIP_SUBTREE - } - - override fun visitFile(file: Path, attrs: BasicFileAttributes): FileVisitResult { - if (!Files.isRegularFile(file) || !Files.isReadable(file)) - return FileVisitResult.CONTINUE - val ext = file.toFile().extension - if (ext == KotlinFileType.EXTENSION || ext == "java"/*JavaFileType.DEFAULT_EXTENSION*/) { - result.add(file.toString()) - } - return FileVisitResult.CONTINUE - } - - override fun visitFileFailed(file: Path, exc: IOException?): FileVisitResult { - // TODO: report or log [IOException]? - // NB: this intentionally swallows the exception, hence fail-safe. - // Skipping subtree doesn't make any sense, since this is not a directory. - // Skipping sibling may drop valid file paths afterward, so we just continue. - return FileVisitResult.CONTINUE - } - } - ) -} - -/** - * Collect source file path as [String] from the given source roots in [sourceRoot]. - * - * this util collects all `.kt` and `.java` files under source roots. - */ -internal fun getSourceFilePaths( - sourceRoot: Collection, - includeDirectoryRoot: Boolean = false, -): Set { - val result = mutableSetOf() - sourceRoot.forEach { srcRoot -> - val path = Paths.get(srcRoot) - if (Files.isDirectory(path)) { - // E.g., project/app/src - collectSourceFilePaths(path, result) - if (includeDirectoryRoot) { - result.add(srcRoot) - } - } else { - // E.g., project/app/src/some/pkg/main.kt - result.add(srcRoot) - } - } - - return result -} - -internal inline fun getPsiFilesFromPaths( - project: Project, - paths: Collection, -): List { - val fs = StandardFileSystems.local() - val psiManager = PsiManager.getInstance(project) - val result = mutableListOf() - for (path in paths) { - val vFile = fs.findFileByPath(path) ?: continue - val psiFileSystemItem = - if (vFile.isDirectory) - psiManager.findDirectory(vFile) as? T - else - psiManager.findFile(vFile) as? T - psiFileSystemItem?.let { result.add(it) } - } - return result -} - - private fun getJdkHomeFromSystemProperty(): File? { val javaHome = File(System.getProperty("java.home")) if (!javaHome.exists()) { @@ -158,7 +66,7 @@ internal fun getLanguageVersionSettings( ) } - +// it should be changed after https://github.com/Kotlin/dokka/issues/3114 internal fun createAnalysisSession( classpath: List, sourceRoots: Set, @@ -243,3 +151,95 @@ internal fun createAnalysisSession( ) return Pair(analysisSession, sourceModule ?: throw IllegalStateException()) } + +// ----------- copy-paste from Analysis API ---------------------------------------------------------------------------- +/** + * Collect source file path from the given [root] store them in [result]. + * + * E.g., for `project/app/src` as a [root], this will walk the file tree and + * collect all `.kt` and `.java` files under that folder. + * + * Note that this util gracefully skips [IOException] during file tree traversal. + */ +internal fun collectSourceFilePaths( + root: Path, + result: MutableSet +) { + // NB: [Files#walk] throws an exception if there is an issue during IO. + // With [Files#walkFileTree] with a custom visitor, we can take control of exception handling. + Files.walkFileTree( + root, + object : SimpleFileVisitor() { + override fun preVisitDirectory(dir: Path, attrs: BasicFileAttributes): FileVisitResult { + return if (Files.isReadable(dir)) + FileVisitResult.CONTINUE + else + FileVisitResult.SKIP_SUBTREE + } + + override fun visitFile(file: Path, attrs: BasicFileAttributes): FileVisitResult { + if (!Files.isRegularFile(file) || !Files.isReadable(file)) + return FileVisitResult.CONTINUE + val ext = file.toFile().extension + if (ext == KotlinFileType.EXTENSION || ext == "java"/*JavaFileType.DEFAULT_EXTENSION*/) { + result.add(file.toString()) + } + return FileVisitResult.CONTINUE + } + + override fun visitFileFailed(file: Path, exc: IOException?): FileVisitResult { + // TODO: report or log [IOException]? + // NB: this intentionally swallows the exception, hence fail-safe. + // Skipping subtree doesn't make any sense, since this is not a directory. + // Skipping sibling may drop valid file paths afterward, so we just continue. + return FileVisitResult.CONTINUE + } + } + ) +} + +/** + * Collect source file path as [String] from the given source roots in [sourceRoot]. + * + * this util collects all `.kt` and `.java` files under source roots. + */ +internal fun getSourceFilePaths( + sourceRoot: Collection, + includeDirectoryRoot: Boolean = false, +): Set { + val result = mutableSetOf() + sourceRoot.forEach { srcRoot -> + val path = Paths.get(srcRoot) + if (Files.isDirectory(path)) { + // E.g., project/app/src + collectSourceFilePaths(path, result) + if (includeDirectoryRoot) { + result.add(srcRoot) + } + } else { + // E.g., project/app/src/some/pkg/main.kt + result.add(srcRoot) + } + } + + return result +} + +internal inline fun getPsiFilesFromPaths( + project: Project, + paths: Collection, +): List { + val fs = StandardFileSystems.local() + val psiManager = PsiManager.getInstance(project) + val result = mutableListOf() + for (path in paths) { + val vFile = fs.findFileByPath(path) ?: continue + val psiFileSystemItem = + if (vFile.isDirectory) + psiManager.findDirectory(vFile) as? T + else + psiManager.findFile(vFile) as? T + psiFileSystemItem?.let { result.add(it) } + } + return result +} \ No newline at end of file diff --git a/subprojects/analysis-kotlin-symbols/plugin/src/main/kotlin/org/jetbrains/dokka/analysis/kotlin/symbols/plugin/SymbolsAnalysisPlugin.kt b/subprojects/analysis-kotlin-symbols/plugin/src/main/kotlin/org/jetbrains/dokka/analysis/kotlin/symbols/plugin/SymbolsAnalysisPlugin.kt index 37b8cf13cd..262e9f9e49 100644 --- a/subprojects/analysis-kotlin-symbols/plugin/src/main/kotlin/org/jetbrains/dokka/analysis/kotlin/symbols/plugin/SymbolsAnalysisPlugin.kt +++ b/subprojects/analysis-kotlin-symbols/plugin/src/main/kotlin/org/jetbrains/dokka/analysis/kotlin/symbols/plugin/SymbolsAnalysisPlugin.kt @@ -10,6 +10,7 @@ import org.jetbrains.dokka.analysis.kotlin.symbols.kdoc.java.KotlinInheritDocTag import org.jetbrains.dokka.analysis.kotlin.symbols.kdoc.java.DescriptorKotlinDocCommentCreator import org.jetbrains.dokka.analysis.kotlin.symbols.kdoc.java.KotlinDocCommentParser import org.jetbrains.dokka.analysis.kotlin.symbols.kdoc.moduledocs.ModuleAndPackageDocumentationReader +import org.jetbrains.dokka.analysis.kotlin.symbols.services.KotlinAnalysisSourceRootsExtractor import org.jetbrains.dokka.analysis.kotlin.symbols.services.* import org.jetbrains.dokka.analysis.kotlin.symbols.services.KotlinDocumentableSourceLanguageParser import org.jetbrains.dokka.analysis.kotlin.symbols.services.SymbolExternalDocumentablesProvider @@ -116,6 +117,10 @@ class SymbolsAnalysisPlugin : DokkaPlugin() { plugin().sampleProviderFactory providing ::KotlinSampleProviderFactory } + internal val sourceRootsExtractor by extending { + javaAnalysisPlugin.sourceRootsExtractor providing { KotlinAnalysisSourceRootsExtractor() } + } + @OptIn(DokkaPluginApiPreview::class) override fun pluginApiPreviewAcknowledgement(): PluginApiPreviewAcknowledgement = PluginApiPreviewAcknowledgement } diff --git a/subprojects/analysis-kotlin-symbols/plugin/src/main/kotlin/org/jetbrains/dokka/analysis/kotlin/symbols/services/KotlinAnalysisSourceRootsExtractor.kt b/subprojects/analysis-kotlin-symbols/plugin/src/main/kotlin/org/jetbrains/dokka/analysis/kotlin/symbols/services/KotlinAnalysisSourceRootsExtractor.kt new file mode 100644 index 0000000000..a568f754d9 --- /dev/null +++ b/subprojects/analysis-kotlin-symbols/plugin/src/main/kotlin/org/jetbrains/dokka/analysis/kotlin/symbols/services/KotlinAnalysisSourceRootsExtractor.kt @@ -0,0 +1,12 @@ +package org.jetbrains.dokka.analysis.kotlin.symbols.services + +import org.jetbrains.dokka.DokkaConfiguration +import org.jetbrains.dokka.analysis.java.SourceRootsExtractor +import org.jetbrains.dokka.plugability.DokkaContext +import java.io.File + +class KotlinAnalysisSourceRootsExtractor : SourceRootsExtractor { + override fun extract(sourceSet: DokkaConfiguration.DokkaSourceSet, context: DokkaContext): List { + return sourceSet.sourceRoots.filter { directory -> directory.isDirectory || directory.extension == "java" } + } +}