diff options
35 files changed, 319 insertions, 534 deletions
diff --git a/.idea/compiler.xml b/.idea/compiler.xml index dd174dd7..a6b0adf4 100644 --- a/.idea/compiler.xml +++ b/.idea/compiler.xml @@ -12,148 +12,12 @@ <entry name="!?*.clj" /> </wildcardResourcePatterns> <bytecodeTargetLevel target="1.8"> - <module name="android-gradle-plugin_main" target="1.8" /> - <module name="android-gradle-plugin_test" target="1.8" /> - <module name="ant_main" target="1.8" /> - <module name="ant_test" target="1.8" /> - <module name="base.dokka.plugins.base.main" target="1.8" /> - <module name="base.dokka.plugins.base.test" target="1.8" /> - <module name="blazejkardys.Workspace.dokka.buildSrc.main" target="1.8" /> - <module name="blazejkardys.Workspace.dokka.buildSrc.test" target="1.8" /> - <module name="buildSrc_main" target="1.8" /> - <module name="buildSrc_test" target="1.8" /> - <module name="cli.dokka.runners.cli.main" target="1.8" /> - <module name="cli.dokka.runners.cli.test" target="1.8" /> - <module name="cli_main" target="1.8" /> - <module name="cli_test" target="1.8" /> - <module name="core_main" target="1.8" /> - <module name="core_test" target="1.8" /> - <module name="dokka.core.search-component.main" target="1.8" /> - <module name="dokka.core.search-component.test" target="1.8" /> - <module name="dokka.core.testApi.main" target="1.8" /> - <module name="dokka.core.testApi.test" target="1.8" /> - <module name="dokka.integration.main" target="1.8" /> - <module name="dokka.integration.test" target="1.8" /> - <module name="dokka.plugins.base.search-component.main" target="1.8" /> - <module name="dokka.plugins.base.search-component.test" target="1.8" /> - <module name="dokka.plugins.javadoc8.main" target="1.8" /> - <module name="dokka.plugins.javadoc8.test" target="1.8" /> - <module name="dokka.plugins.ma.main" target="1.8" /> - <module name="dokka.plugins.ma.test" target="1.8" /> - <module name="dokka.plugins.xml.main" target="1.8" /> - <module name="dokka.plugins.xml.test" target="1.8" /> - <module name="dokka.runners.android-gradle-plugin.main" target="1.8" /> - <module name="dokka.runners.android-gradle-plugin.test" target="1.8" /> - <module name="dokka.runners.ant.main" target="1.8" /> - <module name="dokka.runners.ant.test" target="1.8" /> - <module name="dokka.runners.fatjar.main" target="1.8" /> - <module name="dokka.runners.fatjar.test" target="1.8" /> - <module name="dokka.runners.gradle-integration-tests.main" target="1.8" /> - <module name="dokka.runners.gradle-integration-tests.test" target="1.8" /> - <module name="fatjar_main" target="1.8" /> - <module name="fatjar_test" target="1.8" /> - <module name="gradle-integration-tests.dokka.integration-tests.gradle-integration-tests.main" target="1.8" /> - <module name="gradle-integration-tests.dokka.integration-tests.gradle-integration-tests.test" target="1.8" /> - <module name="gradle-integration-tests.org.jetbrains.dokka.gradle-integration-tests.main" target="1.8" /> - <module name="gradle-integration-tests.org.jetbrains.dokka.gradle-integration-tests.test" target="1.8" /> - <module name="gradle-integration-tests_main" target="1.8" /> - <module name="gradle-integration-tests_test" target="1.8" /> - <module name="gradle-plugin.dokka.runners.gradle-plugin.main" target="1.8" /> - <module name="gradle-plugin.dokka.runners.gradle-plugin.test" target="1.8" /> - <module name="gradle-plugin_main" target="1.8" /> - <module name="gradle-plugin_test" target="1.8" /> - <module name="integration_main" target="1.8" /> - <module name="integration_test" target="1.8" /> - <module name="kotlin-as-java.dokka.plugins.kotlin-as-java.main" target="1.8" /> - <module name="kotlin-as-java.dokka.plugins.kotlin-as-java.test" target="1.8" /> - <module name="mathjax.dokka.plugins.mathjax.main" target="1.8" /> - <module name="mathjax.dokka.plugins.mathjax.test" target="1.8" /> - <module name="maven-plugin.dokka.runners.maven-plugin.main" target="1.8" /> - <module name="maven-plugin.dokka.runners.maven-plugin.test" target="1.8" /> - <module name="maven-plugin_main" target="1.8" /> - <module name="maven-plugin_test" target="1.8" /> - <module name="org.jetbrains.dokka.android-gradle-plugin.main" target="1.8" /> - <module name="org.jetbrains.dokka.android-gradle-plugin.test" target="1.8" /> - <module name="org.jetbrains.dokka.ant.main" target="1.8" /> - <module name="org.jetbrains.dokka.ant.test" target="1.8" /> - <module name="org.jetbrains.dokka.buildSrc.main" target="1.8" /> - <module name="org.jetbrains.dokka.buildSrc.test" target="1.8" /> - <module name="org.jetbrains.dokka.cli.main" target="1.8" /> - <module name="org.jetbrains.dokka.cli.test" target="1.8" /> - <module name="org.jetbrains.dokka.core.main" target="1.8" /> - <module name="org.jetbrains.dokka.core.test" target="1.8" /> - <module name="org.jetbrains.dokka.coreDependencies.main" target="1.8" /> - <module name="org.jetbrains.dokka.coreDependencies.test" target="1.8" /> - <module name="org.jetbrains.dokka.dokka.core.main" target="1.8" /> - <module name="org.jetbrains.dokka.dokka.core.search-component.main" target="1.8" /> - <module name="org.jetbrains.dokka.dokka.core.search-component.test" target="1.8" /> - <module name="org.jetbrains.dokka.dokka.core.test" target="1.8" /> - <module name="org.jetbrains.dokka.dokka.coreDependencies.main" target="1.8" /> - <module name="org.jetbrains.dokka.dokka.coreDependencies.test" target="1.8" /> - <module name="org.jetbrains.dokka.dokka.integration-tests.gradle-integration-tests.main" target="1.8" /> - <module name="org.jetbrains.dokka.dokka.integration-tests.gradle-integration-tests.test" target="1.8" /> - <module name="org.jetbrains.dokka.dokka.integration-tests.main" target="1.8" /> - <module name="org.jetbrains.dokka.dokka.integration-tests.test" target="1.8" /> - <module name="org.jetbrains.dokka.dokka.plugins.base.main" target="1.8" /> - <module name="org.jetbrains.dokka.dokka.plugins.base.test" target="1.8" /> - <module name="org.jetbrains.dokka.dokka.plugins.gfm.main" target="1.8" /> - <module name="org.jetbrains.dokka.dokka.plugins.gfm.test" target="1.8" /> - <module name="org.jetbrains.dokka.dokka.plugins.jekyll.main" target="1.8" /> - <module name="org.jetbrains.dokka.dokka.plugins.jekyll.test" target="1.8" /> - <module name="org.jetbrains.dokka.dokka.plugins.kotlin-as-java.main" target="1.8" /> - <module name="org.jetbrains.dokka.dokka.plugins.kotlin-as-java.test" target="1.8" /> - <module name="org.jetbrains.dokka.dokka.plugins.main" target="1.8" /> - <module name="org.jetbrains.dokka.dokka.plugins.mathjax.main" target="1.8" /> - <module name="org.jetbrains.dokka.dokka.plugins.mathjax.test" target="1.8" /> - <module name="org.jetbrains.dokka.dokka.plugins.test" target="1.8" /> - <module name="org.jetbrains.dokka.dokka.runners.cli.main" target="1.8" /> - <module name="org.jetbrains.dokka.dokka.runners.cli.test" target="1.8" /> - <module name="org.jetbrains.dokka.dokka.runners.gradle-plugin.main" target="1.8" /> - <module name="org.jetbrains.dokka.dokka.runners.gradle-plugin.test" target="1.8" /> - <module name="org.jetbrains.dokka.dokka.runners.main" target="1.8" /> - <module name="org.jetbrains.dokka.dokka.runners.maven-plugin.main" target="1.8" /> - <module name="org.jetbrains.dokka.dokka.runners.maven-plugin.test" target="1.8" /> - <module name="org.jetbrains.dokka.dokka.runners.test" target="1.8" /> - <module name="org.jetbrains.dokka.dokka.search-component.main" target="1.8" /> - <module name="org.jetbrains.dokka.dokka.search-component.test" target="1.8" /> - <module name="org.jetbrains.dokka.dokka.test-tools.main" target="1.8" /> - <module name="org.jetbrains.dokka.dokka.test-tools.test" target="1.8" /> - <module name="org.jetbrains.dokka.dokka.testApi.main" target="1.8" /> - <module name="org.jetbrains.dokka.dokka.testApi.test" target="1.8" /> - <module name="org.jetbrains.dokka.fatjar.main" target="1.8" /> - <module name="org.jetbrains.dokka.fatjar.test" target="1.8" /> - <module name="org.jetbrains.dokka.gradle-integration-tests.main" target="1.8" /> - <module name="org.jetbrains.dokka.gradle-integration-tests.test" target="1.8" /> - <module name="org.jetbrains.dokka.gradle-plugin.main" target="1.8" /> - <module name="org.jetbrains.dokka.gradle-plugin.test" target="1.8" /> - <module name="org.jetbrains.dokka.integration.main" target="1.8" /> - <module name="org.jetbrains.dokka.integration.test" target="1.8" /> - <module name="org.jetbrains.dokka.javadoc8.main" target="1.8" /> - <module name="org.jetbrains.dokka.javadoc8.test" target="1.8" /> - <module name="org.jetbrains.dokka.mathjax.main" target="1.8" /> - <module name="org.jetbrains.dokka.mathjax.test" target="1.8" /> - <module name="org.jetbrains.dokka.maven-plugin.main" target="1.8" /> - <module name="org.jetbrains.dokka.maven-plugin.test" target="1.8" /> - <module name="org.jetbrains.dokka.plugins.main" target="1.8" /> - <module name="org.jetbrains.dokka.plugins.test" target="1.8" /> - <module name="org.jetbrains.dokka.testApi.main" target="1.8" /> - <module name="org.jetbrains.dokka.testApi.test" target="1.8" /> - <module name="org.jetbrains.dokka.xml.main" target="1.8" /> - <module name="org.jetbrains.dokka.xml.test" target="1.8" /> - <module name="Workspace.dokka.buildSrc.main" target="1.8" /> - <module name="Workspace.dokka.buildSrc.test" target="1.8" /> - <module name="Workspace.dokka.core.main" target="1.8" /> - <module name="Workspace.dokka.core.test" target="1.8" /> - <module name="Workspace.dokka.coreDependencies.main" target="1.8" /> - <module name="Workspace.dokka.coreDependencies.test" target="1.8" /> - <module name="Workspace.dokka.integration-tests.main" target="1.8" /> - <module name="Workspace.dokka.integration-tests.test" target="1.8" /> - <module name="Workspace.dokka.plugins.main" target="1.8" /> - <module name="Workspace.dokka.plugins.test" target="1.8" /> - <module name="Workspace.dokka.runners.main" target="1.8" /> - <module name="Workspace.dokka.runners.test" target="1.8" /> - <module name="Workspace.dokka.testApi.main" target="1.8" /> - <module name="Workspace.dokka.testApi.test" target="1.8" /> + <module name="dokka" target="12" /> + <module name="dokka.buildSrc" target="12" /> + <module name="dokka.buildSrc.main" target="12" /> + <module name="dokka.buildSrc.test" target="12" /> + <module name="dokka.main" target="12" /> + <module name="dokka.test" target="12" /> </bytecodeTargetLevel> </component> </project>
\ No newline at end of file diff --git a/build.gradle.kts b/build.gradle.kts index 0b3c0da8..c94faa77 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -5,6 +5,7 @@ import org.jetbrains.kotlin.gradle.tasks.KotlinCompile plugins { kotlin("jvm") apply false id("com.jfrog.bintray") apply false + id("java") } val dokka_version: String by project @@ -39,6 +40,12 @@ allprojects { subprojects { apply { plugin("org.jetbrains.kotlin.jvm") + plugin("java") + } + + // Gradle metadata + java { + targetCompatibility = JavaVersion.VERSION_1_8 } } diff --git a/core/src/main/kotlin/DokkaGenerator.kt b/core/src/main/kotlin/DokkaGenerator.kt index 61fb7324..c8a892d7 100644 --- a/core/src/main/kotlin/DokkaGenerator.kt +++ b/core/src/main/kotlin/DokkaGenerator.kt @@ -5,7 +5,6 @@ import org.jetbrains.dokka.analysis.DokkaResolutionFacade import org.jetbrains.dokka.model.DModule import org.jetbrains.dokka.model.SourceSetCache import org.jetbrains.dokka.model.SourceSetData -import org.jetbrains.dokka.model.sourceSet import org.jetbrains.dokka.pages.RootPageNode import org.jetbrains.dokka.plugability.DokkaContext import org.jetbrains.dokka.plugability.DokkaPlugin @@ -81,7 +80,7 @@ class DokkaGenerator( sourceSetsCache: SourceSetCache ): Map<SourceSetData, EnvironmentAndFacade> = configuration.passesConfigurations.map { - sourceSetsCache.getSourceSet(it) to createEnvironmentAndFacade(it) + sourceSetsCache.getSourceSet(it) to createEnvironmentAndFacade(configuration, it) }.toMap() fun initializePlugins( @@ -139,14 +138,21 @@ class DokkaGenerator( renderer.render(transformedPages) } - private fun createEnvironmentAndFacade(pass: DokkaConfiguration.PassConfiguration): EnvironmentAndFacade = + private fun createEnvironmentAndFacade( + configuration: DokkaConfiguration, + pass: DokkaConfiguration.PassConfiguration + ): EnvironmentAndFacade = AnalysisEnvironment(DokkaMessageCollector(logger), pass.analysisPlatform).run { if (analysisPlatform == Platform.jvm) { addClasspath(PathUtil.getJdkClassesRootsFromCurrentJre()) } pass.classpath.forEach { addClasspath(File(it)) } - addSources((pass.sourceRoots + pass.dependentSourceRoots).map { it.path }) + addSources( + (pass.sourceRoots + configuration.passesConfigurations.filter { it.sourceSetID in pass.dependentSourceSets } + .flatMap { it.sourceRoots }) + .map { it.path } + ) loadLanguageVersionSettings(pass.languageVersion, pass.apiVersion) diff --git a/core/src/main/kotlin/configuration.kt b/core/src/main/kotlin/configuration.kt index 0b59f301..fab7af37 100644 --- a/core/src/main/kotlin/configuration.kt +++ b/core/src/main/kotlin/configuration.kt @@ -27,20 +27,19 @@ enum class Platform(val key: String) { interface DokkaConfiguration { val outputDir: String val format: String - val generateIndexPages: Boolean val cacheRoot: String? + val offlineMode: Boolean val passesConfigurations: List<PassConfiguration> val modules: List<DokkaModuleDescription> - val impliedPlatforms: List<String> val pluginsClasspath: List<File> val pluginsConfiguration: Map<String, String> interface PassConfiguration { val moduleName: String - val sourceSetName: String + val displayName: String + val sourceSetID: String val classpath: List<String> val sourceRoots: List<SourceRoot> - val dependentSourceRoots: List<SourceRoot> val dependentSourceSets: List<String> val samples: List<String> val includes: List<String> @@ -58,10 +57,7 @@ interface DokkaConfiguration { val noStdlibLink: Boolean val noJdkLink: Boolean val suppressedFiles: List<String> - val collectInheritedExtensionsFromLibraries: Boolean val analysisPlatform: Platform - val targets: List<String> - val sinceKotlin: String? } interface SourceRoot { diff --git a/core/src/main/kotlin/defaultConfiguration.kt b/core/src/main/kotlin/defaultConfiguration.kt index 7aaa1c89..23cf7e2d 100644 --- a/core/src/main/kotlin/defaultConfiguration.kt +++ b/core/src/main/kotlin/defaultConfiguration.kt @@ -6,21 +6,20 @@ import java.net.URL data class DokkaConfigurationImpl( override val outputDir: String, override val format: String, - override val generateIndexPages: Boolean, override val cacheRoot: String?, - override val impliedPlatforms: List<String>, + override val offlineMode: Boolean, override val passesConfigurations: List<PassConfigurationImpl>, override val pluginsClasspath: List<File>, override val pluginsConfiguration: Map<String, String>, override val modules: List<DokkaModuleDescriptionImpl> ) : DokkaConfiguration -data class PassConfigurationImpl ( +data class PassConfigurationImpl( override val moduleName: String, - override val sourceSetName: String, + override val displayName: String, + override val sourceSetID: String, override val classpath: List<String>, override val sourceRoots: List<SourceRootImpl>, - override val dependentSourceRoots: List<SourceRootImpl>, override val dependentSourceSets: List<String>, override val samples: List<String>, override val includes: List<String>, @@ -38,10 +37,7 @@ data class PassConfigurationImpl ( override val noStdlibLink: Boolean, override val noJdkLink: Boolean, override val suppressedFiles: List<String>, - override val collectInheritedExtensionsFromLibraries: Boolean, - override val analysisPlatform: Platform, - override val targets: List<String>, - override val sinceKotlin: String? + override val analysisPlatform: Platform ) : DokkaConfiguration.PassConfiguration data class DokkaModuleDescriptionImpl( diff --git a/core/src/main/kotlin/model/SourceSetData.kt b/core/src/main/kotlin/model/SourceSetData.kt index 964d5ca9..7d118470 100644 --- a/core/src/main/kotlin/model/SourceSetData.kt +++ b/core/src/main/kotlin/model/SourceSetData.kt @@ -6,22 +6,33 @@ import org.jetbrains.dokka.plugability.DokkaContext data class SourceSetData( val moduleName: String, - val sourceSetName: String, + val sourceSetID: String, + val displayName: String, val platform: Platform, val sourceRoots: List<DokkaConfiguration.SourceRoot> = emptyList(), - val dependentSourceSets: List<String> = emptyList() + val dependentSourceSets: List<String> = emptyList() ) class SourceSetCache { private val sourceSets = HashMap<String, SourceSetData>() val allSourceSets: List<SourceSetData> - get() = sourceSets.values.toList() + get() = sourceSets.values.toList() fun getSourceSet(pass: DokkaConfiguration.PassConfiguration) = - sourceSets.getOrPut("${pass.moduleName}/${pass.sourceSetName}", - { SourceSetData(pass.moduleName, pass.sourceSetName, pass.analysisPlatform, pass.sourceRoots, pass.dependentSourceSets) } + sourceSets.getOrPut("${pass.moduleName}/${pass.sourceSetID}", + { + SourceSetData( + pass.moduleName, + pass.sourceSetID, + pass.displayName, + pass.analysisPlatform, + pass.sourceRoots, + pass.dependentSourceSets + ) + } ) } -fun DokkaContext.sourceSet(pass: DokkaConfiguration.PassConfiguration) : SourceSetData = sourceSetCache.getSourceSet(pass)
\ No newline at end of file +fun DokkaContext.sourceSet(pass: DokkaConfiguration.PassConfiguration): SourceSetData = + sourceSetCache.getSourceSet(pass)
\ No newline at end of file diff --git a/plugins/base/src/main/kotlin/renderers/html/HtmlRenderer.kt b/plugins/base/src/main/kotlin/renderers/html/HtmlRenderer.kt index 42273d20..528b7d16 100644 --- a/plugins/base/src/main/kotlin/renderers/html/HtmlRenderer.kt +++ b/plugins/base/src/main/kotlin/renderers/html/HtmlRenderer.kt @@ -22,7 +22,7 @@ open class HtmlRenderer( private val sourceSetDependencyMap = with(context.sourceSetCache) { allSourceSets.map { sourceSet -> - sourceSet to allSourceSets.filter { sourceSet.dependentSourceSets.contains(it.sourceSetName) } + sourceSet to allSourceSets.filter { sourceSet.dependentSourceSets.contains(it.sourceSetID ) } }.toMap() } @@ -93,14 +93,14 @@ open class HtmlRenderer( group.sourceSets.forEach { button(classes = "platform-tag platform-selector") { attributes["data-active"] = "" - attributes["data-filter"] = it.sourceSetName - when (it.platform.key) { + attributes["data-filter"] = it.sourceSetID + when(it.platform.key) { "common" -> classes = classes + "common-like" "native" -> classes = classes + "native-like" "jvm" -> classes = classes + "jvm-like" "js" -> classes = classes + "js-like" } - text(it.sourceSetName) + text(it.displayName) } } } @@ -161,10 +161,10 @@ open class HtmlRenderer( attributes["data-toggle-list"] = "data-toggle-list" contents.forEachIndexed { index, pair -> button(classes = "platform-bookmark") { - attributes["data-filterable-current"] = pair.first.sourceSetName - attributes["data-filterable-set"] = pair.first.sourceSetName + attributes["data-filterable-current"] = pair.first.sourceSetID + attributes["data-filterable-set"] = pair.first.sourceSetID if (index == 0) attributes["data-active"] = "" - attributes["data-toggle"] = pair.first.sourceSetName + attributes["data-toggle"] = pair.first.sourceSetID when ( pair.first.platform.key ) { @@ -173,8 +173,8 @@ open class HtmlRenderer( "jvm" -> classes = classes + "jvm-like" "js" -> classes = classes + "js-like" } - attributes["data-toggle"] = pair.first.sourceSetName - text(pair.first.sourceSetName) + attributes["data-toggle"] = pair.first.sourceSetID + text(pair.first.displayName) } } } @@ -242,10 +242,10 @@ open class HtmlRenderer( consumer.onTagContentUnsafe { +createHTML().div("divergent-group") { attributes["data-filterable-current"] = groupedDivergent.keys.joinToString(" ") { - it.sourceSetName + it.sourceSetID } attributes["data-filterable-set"] = groupedDivergent.keys.joinToString(" ") { - it.sourceSetName + it.sourceSetID } val divergentForPlatformDependent = groupedDivergent.map { (sourceSet, elements) -> @@ -346,12 +346,13 @@ open class HtmlRenderer( div(classes = "table-row") { if (!style.contains(MultimoduleTable)) { attributes["data-filterable-current"] = node.sourceSets.joinToString(" ") { - it.sourceSetName + it.sourceSetID } attributes["data-filterable-set"] = node.sourceSets.joinToString(" ") { - it.sourceSetName + it.sourceSetID } } + it.filterIsInstance<ContentLink>().takeIf { it.isNotEmpty() }?.let { div("main-subrow " + node.style.joinToString(" ")) { it.filter { sourceSetRestriction == null || it.sourceSets.any { s -> s in sourceSetRestriction } } @@ -396,7 +397,7 @@ open class HtmlRenderer( "jvm" -> classes = classes + "jvm-like" "js" -> classes = classes + "js-like" } - text(it.sourceSetName) + text(it.displayName) } } } diff --git a/plugins/base/src/main/kotlin/renderers/html/htmlPreprocessors.kt b/plugins/base/src/main/kotlin/renderers/html/htmlPreprocessors.kt index f10c85d5..cdb30555 100644 --- a/plugins/base/src/main/kotlin/renderers/html/htmlPreprocessors.kt +++ b/plugins/base/src/main/kotlin/renderers/html/htmlPreprocessors.kt @@ -87,7 +87,7 @@ object StyleAndScriptsAppender : PageTransformer { class SourcesetDependencyAppender(val context: DokkaContext) : PageTransformer{ override fun invoke(input: RootPageNode): RootPageNode { val dependenciesMap = context.configuration.passesConfigurations.map { - it.sourceSetName to it.dependentSourceSets + it.sourceSetID to it.dependentSourceSets }.toMap() fun createDependenciesJson() : String = "sourceset_dependencies = '{${ dependenciesMap.entries.joinToString(", ") { diff --git a/plugins/base/src/main/kotlin/resolvers/local/DefaultLocationProvider.kt b/plugins/base/src/main/kotlin/resolvers/local/DefaultLocationProvider.kt index 322f4927..a9e58f17 100644 --- a/plugins/base/src/main/kotlin/resolvers/local/DefaultLocationProvider.kt +++ b/plugins/base/src/main/kotlin/resolvers/local/DefaultLocationProvider.kt @@ -98,26 +98,19 @@ open class DefaultLocationProvider( if (info == null) { toResolve.getOrPut(jdk) { mutableListOf() }.add(link) } else if (info.packages.contains(dri.packageName)) { - return link.url.toExternalForm() + getLink( - dri, - info - ) + return link.url.toExternalForm() + getLink(dri, info) } } } // Not in cache, resolve packageLists for ((jdk, links) in toResolve) { for (link in links) { + if(dokkaContext.configuration.offlineMode && link.packageListUrl.protocol.toLowerCase() != "file") + continue val locationInfo = - loadPackageList( - jdk, - link.packageListUrl - ) + loadPackageList(jdk, link.packageListUrl) if (locationInfo.packages.contains(dri.packageName)) { - return link.url.toExternalForm() + getLink( - dri, - locationInfo - ) + return link.url.toExternalForm() + getLink(dri, locationInfo) } } toResolve.remove(jdk) diff --git a/plugins/base/src/main/kotlin/transformers/documentables/ModuleAndPackageDocumentationTransformer.kt b/plugins/base/src/main/kotlin/transformers/documentables/ModuleAndPackageDocumentationTransformer.kt index 04b2636c..2aab6018 100644 --- a/plugins/base/src/main/kotlin/transformers/documentables/ModuleAndPackageDocumentationTransformer.kt +++ b/plugins/base/src/main/kotlin/transformers/documentables/ModuleAndPackageDocumentationTransformer.kt @@ -53,7 +53,7 @@ internal class ModuleAndPackageDocumentationTransformer(val context: DokkaContex module.sourceSets.mapNotNull { pd -> val doc = modulesAndPackagesDocumentation[Pair(module.name, pd)] val facade = context.platforms[pd]?.facade - ?: return@mapNotNull null.also { context.logger.warn("Could not find platform data for ${pd.moduleName}/${pd.sourceSetName}") } + ?: return@mapNotNull null.also { context.logger.warn("Could not find platform data for ${pd.moduleName}/${pd.sourceSetID}") } try { doc?.get("Module")?.get(module.name)?.run { pd to MarkdownParser( @@ -72,7 +72,7 @@ internal class ModuleAndPackageDocumentationTransformer(val context: DokkaContex it.name to it.sourceSets.mapNotNull { pd -> val doc = modulesAndPackagesDocumentation[Pair(module.name, pd)] val facade = context.platforms[pd]?.facade - ?: return@mapNotNull null.also { context.logger.warn("Could not find platform data for ${pd.moduleName}/${pd.sourceSetName}") } + ?: return@mapNotNull null.also { context.logger.warn("Could not find platform data for ${pd.moduleName}/${pd.sourceSetID}") } val descriptor = facade.moduleDescriptor.getPackage(FqName(it.name.let { if(it == "[JS root]") "" else it })) doc?.get("Package")?.get(it.name)?.run { pd to MarkdownParser( diff --git a/plugins/base/src/main/kotlin/translators/descriptors/DefaultDescriptorToDocumentableTranslator.kt b/plugins/base/src/main/kotlin/translators/descriptors/DefaultDescriptorToDocumentableTranslator.kt index bf92c849..33cad4f5 100644 --- a/plugins/base/src/main/kotlin/translators/descriptors/DefaultDescriptorToDocumentableTranslator.kt +++ b/plugins/base/src/main/kotlin/translators/descriptors/DefaultDescriptorToDocumentableTranslator.kt @@ -739,7 +739,7 @@ private class DokkaDescriptorVisitor( private fun ConstantsEnumValue.fullEnumEntryName() = "${this.enumClassId.relativeClassName.asString()}.${this.enumEntryName.identifier}" - private fun fallbackPackageName(): String = "[${sourceSet.sourceSetName} root]"// TODO: error-prone, find a better way to do it + private fun fallbackPackageName(): String = "[${sourceSet.displayName} root]"// TODO: error-prone, find a better way to do it } private fun DRI.withPackageFallbackTo(fallbackPackage: String): DRI { diff --git a/plugins/base/src/test/kotlin/content/annotations/ContentForAnnotationsTest.kt b/plugins/base/src/test/kotlin/content/annotations/ContentForAnnotationsTest.kt index d10bd151..f91b82d5 100644 --- a/plugins/base/src/test/kotlin/content/annotations/ContentForAnnotationsTest.kt +++ b/plugins/base/src/test/kotlin/content/annotations/ContentForAnnotationsTest.kt @@ -19,7 +19,6 @@ class ContentForAnnotationsTest : AbstractCoreTest() { pass { sourceRoots = listOf("src/") analysisPlatform = "jvm" - targets = listOf("jvm") } } } diff --git a/plugins/base/src/test/kotlin/content/params/ContentForParamsTest.kt b/plugins/base/src/test/kotlin/content/params/ContentForParamsTest.kt index e25567e0..335d834e 100644 --- a/plugins/base/src/test/kotlin/content/params/ContentForParamsTest.kt +++ b/plugins/base/src/test/kotlin/content/params/ContentForParamsTest.kt @@ -12,7 +12,6 @@ class ContentForParamsTest : AbstractCoreTest() { pass { sourceRoots = listOf("src/") analysisPlatform = "jvm" - targets = listOf("jvm") } } } diff --git a/plugins/base/src/test/kotlin/content/seealso/ContentForSeeAlsoTest.kt b/plugins/base/src/test/kotlin/content/seealso/ContentForSeeAlsoTest.kt index c9adc0bf..696c3032 100644 --- a/plugins/base/src/test/kotlin/content/seealso/ContentForSeeAlsoTest.kt +++ b/plugins/base/src/test/kotlin/content/seealso/ContentForSeeAlsoTest.kt @@ -4,9 +4,9 @@ import matchers.content.* import org.jetbrains.dokka.pages.ContentPage import org.jetbrains.dokka.testApi.testRunner.AbstractCoreTest import org.junit.jupiter.api.Test +import utils.ParamAttributes import utils.bareSignature import utils.pWrapped -import utils.ParamAttributes import utils.unnamedTag class ContentForSeeAlsoTest : AbstractCoreTest() { @@ -15,7 +15,6 @@ class ContentForSeeAlsoTest : AbstractCoreTest() { pass { sourceRoots = listOf("src/") analysisPlatform = "jvm" - targets = listOf("jvm") } } } diff --git a/plugins/base/src/test/kotlin/content/signatures/ContentForSignaturesTest.kt b/plugins/base/src/test/kotlin/content/signatures/ContentForSignaturesTest.kt index bdefe45a..dc0488c8 100644 --- a/plugins/base/src/test/kotlin/content/signatures/ContentForSignaturesTest.kt +++ b/plugins/base/src/test/kotlin/content/signatures/ContentForSignaturesTest.kt @@ -16,7 +16,6 @@ class ContentForSignaturesTest : AbstractCoreTest() { pass { sourceRoots = listOf("src/") analysisPlatform = "jvm" - targets = listOf("jvm") } } } diff --git a/plugins/base/src/test/kotlin/linkableContent/LinkableContentTest.kt b/plugins/base/src/test/kotlin/linkableContent/LinkableContentTest.kt index 7cdb0de3..d49ec8a5 100644 --- a/plugins/base/src/test/kotlin/linkableContent/LinkableContentTest.kt +++ b/plugins/base/src/test/kotlin/linkableContent/LinkableContentTest.kt @@ -27,7 +27,6 @@ class LinkableContentTest : AbstractCoreTest() { pass { moduleName = "example" analysisPlatform = "js" - targets = listOf("js") sourceRoots = listOf("jsMain", "commonMain", "jvmAndJsSecondCommonMain").map { Paths.get("$testDataDir/$it/kotlin").toString() } @@ -37,7 +36,6 @@ class LinkableContentTest : AbstractCoreTest() { pass { moduleName = "example" analysisPlatform = "jvm" - targets = listOf("jvm") sourceRoots = listOf("jvmMain", "commonMain", "jvmAndJsSecondCommonMain").map { Paths.get("$testDataDir/$it/kotlin").toString() } @@ -68,7 +66,6 @@ class LinkableContentTest : AbstractCoreTest() { pass { moduleName = "example" analysisPlatform = "js" - targets = listOf("js") sourceRoots = listOf("$testDataDir/jsMain/kotlin") sourceLinks = listOf( SourceLinkDefinitionImpl( @@ -82,7 +79,6 @@ class LinkableContentTest : AbstractCoreTest() { pass { moduleName = "example" analysisPlatform = "jvm" - targets = listOf("jvm") sourceRoots = listOf("$testDataDir/jvmMain/kotlin") sourceLinks = listOf( SourceLinkDefinitionImpl( @@ -133,7 +129,6 @@ class LinkableContentTest : AbstractCoreTest() { pass { moduleName = "example" analysisPlatform = "js" - targets = listOf("js") sourceRoots = listOf("$testDataDir/jsMain/kotlin") sourceSetName = "js" samples = listOf("$testDataDir/jsMain/resources/Samples.kt") @@ -141,7 +136,6 @@ class LinkableContentTest : AbstractCoreTest() { pass { moduleName = "example" analysisPlatform = "jvm" - targets = listOf("jvm") sourceRoots = listOf("$testDataDir/jvmMain/kotlin") sourceSetName = "jvm" samples = listOf("$testDataDir/jvmMain/resources/Samples.kt") @@ -199,7 +193,7 @@ class LinkableContentTest : AbstractCoreTest() { pass { sourceRoots = listOf("src/") analysisPlatform = "jvm" - targets = listOf("jvm") + sourceSetName = "js" } } } diff --git a/plugins/base/src/test/kotlin/markdown/LinkTest.kt b/plugins/base/src/test/kotlin/markdown/LinkTest.kt index 20bd24ee..ddcef5db 100644 --- a/plugins/base/src/test/kotlin/markdown/LinkTest.kt +++ b/plugins/base/src/test/kotlin/markdown/LinkTest.kt @@ -70,7 +70,7 @@ class LinkTest : AbstractCoreTest() { val innerClass = root.children.first { it is ClasslikePageNode } val foo = innerClass.children.first { it.name == "foo" } as MemberPageNode - assertEquals(root.dri.first().toString(), "[main root]/Outer///PointingToDeclaration/") + assertEquals(root.dri.first().toString(), "[JVM root]/Outer///PointingToDeclaration/") assertNotNull(foo.content.dfs { it is ContentDRILink && it.address.toString() == root.dri.first().toString() } ) } } diff --git a/plugins/base/src/test/kotlin/model/InheritorsTest.kt b/plugins/base/src/test/kotlin/model/InheritorsTest.kt index ce8a87ca..5daebb73 100644 --- a/plugins/base/src/test/kotlin/model/InheritorsTest.kt +++ b/plugins/base/src/test/kotlin/model/InheritorsTest.kt @@ -48,12 +48,10 @@ class InheritorsTest : AbstractModelTest("/src/main/kotlin/inheritors/Test.kt", pass { sourceRoots = listOf("common/src/", "jvm/src/") analysisPlatform = "jvm" - targets = listOf("jvm") } pass { sourceRoots = listOf("common/src/", "js/src/") analysisPlatform = "js" - targets = listOf("js") } } } diff --git a/plugins/base/src/test/kotlin/model/PackagesTest.kt b/plugins/base/src/test/kotlin/model/PackagesTest.kt index 676f034a..c777ad05 100644 --- a/plugins/base/src/test/kotlin/model/PackagesTest.kt +++ b/plugins/base/src/test/kotlin/model/PackagesTest.kt @@ -14,8 +14,8 @@ class PackagesTest : AbstractModelTest("/src/main/kotlin/packages/Test.kt", "pac """.trimIndent(), prependPackage = false ) { - with((this / "[main root]").cast<DPackage>()) { - name equals "[main root]" + with((this / "[JVM root]").cast<DPackage>()) { + name equals "[JVM root]" children counts 0 } } diff --git a/plugins/base/src/test/kotlin/renderers/RenderingOnlyTestBase.kt b/plugins/base/src/test/kotlin/renderers/RenderingOnlyTestBase.kt index a3bf9188..a4d7bd04 100644 --- a/plugins/base/src/test/kotlin/renderers/RenderingOnlyTestBase.kt +++ b/plugins/base/src/test/kotlin/renderers/RenderingOnlyTestBase.kt @@ -33,10 +33,10 @@ abstract class RenderingOnlyTestBase { DokkaBase().outputWriter to { _ -> files }, DokkaBase().locationProviderFactory to ::DefaultLocationProviderFactory, DokkaBase().htmlPreprocessors to { _ -> RootCreator }, - DokkaBase().externalLocationProviderFactory to { _ -> ::JavadocExternalLocationProviderFactory }, - DokkaBase().externalLocationProviderFactory to { _ -> ::DokkaExternalLocationProviderFactory }, + DokkaBase().externalLocationProviderFactory to { ::JavadocExternalLocationProviderFactory }, + DokkaBase().externalLocationProviderFactory to { ::DokkaExternalLocationProviderFactory }, sourceSetCache = SourceSetCache(), - testConfiguration = DokkaConfigurationImpl("", "", false, null, emptyList(), emptyList(), emptyList(), emptyMap(), emptyList()) + testConfiguration = DokkaConfigurationImpl("", "", null, false, emptyList(), emptyList(), emptyMap(), emptyList()) ) protected val renderedContent: Element by lazy { diff --git a/plugins/base/src/test/kotlin/renderers/html/DivergentTest.kt b/plugins/base/src/test/kotlin/renderers/html/DivergentTest.kt index fa129760..b10202bb 100644 --- a/plugins/base/src/test/kotlin/renderers/html/DivergentTest.kt +++ b/plugins/base/src/test/kotlin/renderers/html/DivergentTest.kt @@ -10,9 +10,9 @@ import org.junit.jupiter.api.Test import renderers.* class DivergentTest : RenderingOnlyTestBase() { - private val js = SourceSetData("root", "JS", Platform.js, listOf(SourceRootImpl("pl1"))) - private val jvm = SourceSetData("root", "JVM", Platform.jvm, listOf(SourceRootImpl("pl1"))) - private val native = SourceSetData("root", "NATIVE", Platform.native, listOf(SourceRootImpl("pl1"))) + private val js = SourceSetData("root", "js", "JS", Platform.js, listOf(SourceRootImpl("pl1"))) + private val jvm = SourceSetData("root", "jvm", "JVM", Platform.jvm, listOf(SourceRootImpl("pl1"))) + private val native = SourceSetData("root", "native", "NATIVE", Platform.native, listOf(SourceRootImpl("pl1"))) @Test fun simpleWrappingCase() { diff --git a/plugins/base/src/test/kotlin/renderers/html/SourceSetDependentHintTest.kt b/plugins/base/src/test/kotlin/renderers/html/SourceSetDependentHintTest.kt index c1dc40a7..878f442b 100644 --- a/plugins/base/src/test/kotlin/renderers/html/SourceSetDependentHintTest.kt +++ b/plugins/base/src/test/kotlin/renderers/html/SourceSetDependentHintTest.kt @@ -12,9 +12,9 @@ import renderers.TestPage import renderers.match class SourceSetDependentHintTest : RenderingOnlyTestBase() { - private val pl1 = SourceSetData("root", "pl1", Platform.js, listOf(SourceRootImpl("pl1"))) - private val pl2 = SourceSetData("root","pl2", Platform.jvm, listOf(SourceRootImpl("pl1"))) - private val pl3 = SourceSetData("root","pl3", Platform.native, listOf(SourceRootImpl("pl1"))) + private val pl1 = SourceSetData("root", "pl1", "pl3",Platform.js, listOf(SourceRootImpl("pl1"))) + private val pl2 = SourceSetData("root","pl2", "pl3", Platform.jvm, listOf(SourceRootImpl("pl1"))) + private val pl3 = SourceSetData("root","pl3", "pl3", Platform.native, listOf(SourceRootImpl("pl1"))) @Test fun platformIndependentCase() { diff --git a/plugins/base/src/test/kotlin/utils/ModelUtils.kt b/plugins/base/src/test/kotlin/utils/ModelUtils.kt index f65258b1..9697a843 100644 --- a/plugins/base/src/test/kotlin/utils/ModelUtils.kt +++ b/plugins/base/src/test/kotlin/utils/ModelUtils.kt @@ -9,7 +9,6 @@ abstract class AbstractModelTest(val path: String? = null, val pkg: String) : Mo fun inlineModelTest( query: String, platform: String = "jvm", - targetList: List<String> = listOf("jvm"), prependPackage: Boolean = true, cleanupOutput: Boolean = true, pluginsOverrides: List<DokkaPlugin> = emptyList(), @@ -21,7 +20,6 @@ abstract class AbstractModelTest(val path: String? = null, val pkg: String) : Mo pass { sourceRoots = listOf("src/") analysisPlatform = platform - targets = targetList } } } diff --git a/plugins/gfm/src/main/kotlin/GfmPlugin.kt b/plugins/gfm/src/main/kotlin/GfmPlugin.kt index cc79291c..b10a45b8 100644 --- a/plugins/gfm/src/main/kotlin/GfmPlugin.kt +++ b/plugins/gfm/src/main/kotlin/GfmPlugin.kt @@ -120,7 +120,7 @@ open class CommonmarkRenderer( append(distinct.keys.single()) else distinct.forEach { text, platforms -> - append(platforms.joinToString(prefix = " [", postfix = "] $text") { "${it.moduleName}/${it.sourceSetName}" }) + append(platforms.joinToString(prefix = " [", postfix = "] $text") { "${it.moduleName}/${it.sourceSetID}" }) } } diff --git a/runners/cli/src/main/kotlin/cli/main.kt b/runners/cli/src/main/kotlin/cli/main.kt index be42bc79..d217f83e 100644 --- a/runners/cli/src/main/kotlin/cli/main.kt +++ b/runners/cli/src/main/kotlin/cli/main.kt @@ -35,24 +35,22 @@ open class GlobalArguments(parser: DokkaArgumentsParser) : DokkaConfiguration { } } - override val generateIndexPages: Boolean by parser.singleFlag( - listOf("-generateIndexPages"), - "Generate index page" - ) - override val cacheRoot: String? by parser.stringOption( listOf("-cacheRoot"), "Path to cache folder, or 'default' to use ~/.cache/dokka, if not provided caching is disabled", null ) - override val impliedPlatforms: List<String> = emptyList() + override val offlineMode: Boolean by parser.singleFlag( + listOf("-offlineMode"), + "Offline mode (do not download package lists from the Internet)" + ) override val passesConfigurations: List<Arguments> by parser.repeatableFlag( listOf("-pass"), "Single dokka pass" ) { - Arguments(parser).also { if(it.moduleName.isEmpty()) DokkaConsoleLogger.warn("Not specified module name. It can result in unexpected behaviour while including documentation for module") } + Arguments(parser).also { if (it.moduleName.isEmpty()) DokkaConsoleLogger.warn("Not specified module name. It can result in unexpected behaviour while including documentation for module") } } override val modules: List<DokkaConfiguration.DokkaModuleDescription> = emptyList() @@ -67,12 +65,17 @@ class Arguments(val parser: DokkaArgumentsParser) : DokkaConfiguration.PassConfi "" ) - override val sourceSetName: String by parser.stringOption( - listOf("-sourceSetName"), - "Name of the source set", - "main" + override val displayName: String by parser.stringOption( + listOf("-displayName"), + "Name displayed in the generated documentation", + "" ) + override val sourceSetID: String by parser.stringOption( + listOf("-sourceSetID"), + "Source set ID used for declaring dependent source sets", + "main" + ) override val classpath: List<String> by parser.repeatableOption<String>( listOf("-classpath"), @@ -84,11 +87,6 @@ class Arguments(val parser: DokkaArgumentsParser) : DokkaConfiguration.PassConfi "Source file or directory (allows many paths separated by the system path separator)" ) { SourceRootImpl(it) } - override val dependentSourceRoots: List<DokkaConfiguration.SourceRoot> by parser.repeatableOption( - listOf("-dependentRoots"), - "Source roots of dependent source sets" - ) { SourceRootImpl(it) } - override val dependentSourceSets: List<String> by parser.repeatableOption<String>( listOf("-dependentSets"), "Names of dependent source sets" @@ -163,16 +161,6 @@ class Arguments(val parser: DokkaArgumentsParser) : DokkaConfiguration.PassConfi "" ) - override val sinceKotlin: String? by parser.stringOption( - listOf("-sinceKotlin"), - "Kotlin Api version to use as base version, if none specified", - null - ) - - override val collectInheritedExtensionsFromLibraries: Boolean by parser.singleFlag( - listOf("-collectInheritedExtensionsFromLibraries"), - "Search for applicable extensions in libraries" - ) override val analysisPlatform: Platform by parser.singleOption( listOf("-analysisPlatform"), @@ -181,10 +169,6 @@ class Arguments(val parser: DokkaArgumentsParser) : DokkaConfiguration.PassConfi { Platform.DEFAULT } ) - override val targets: List<String> by parser.repeatableOption<String>( - listOf("-target"), - "Generation targets" - ) override val perPackageOptions: MutableList<DokkaConfiguration.PackageOptions> by parser.singleOption( listOf("-packageOptions"), @@ -215,16 +199,16 @@ class Arguments(val parser: DokkaArgumentsParser) : DokkaConfiguration.PassConfi object MainKt { fun defaultLinks(config: DokkaConfiguration.PassConfiguration): MutableList<ExternalDocumentationLink> = mutableListOf<ExternalDocumentationLink>().apply { - if (!config.noJdkLink) - this += DokkaConfiguration.ExternalDocumentationLink - .Builder("https://docs.oracle.com/javase/${config.jdkVersion}/docs/api/") - .build() - - if (!config.noStdlibLink) - this += DokkaConfiguration.ExternalDocumentationLink - .Builder("https://kotlinlang.org/api/latest/jvm/stdlib/") - .build() - } + if (!config.noJdkLink) + this += DokkaConfiguration.ExternalDocumentationLink + .Builder("https://docs.oracle.com/javase/${config.jdkVersion}/docs/api/") + .build() + + if (!config.noStdlibLink) + this += DokkaConfiguration.ExternalDocumentationLink + .Builder("https://kotlinlang.org/api/latest/jvm/stdlib/") + .build() + } fun parseLinks(links: String): List<ExternalDocumentationLink> { val (parsedLinks, parsedOfflineLinks) = links.split("^^") diff --git a/runners/gradle-plugin/src/main/kotlin/org/jetbrains/dokka/gradle/ConfigurationExtractor.kt b/runners/gradle-plugin/src/main/kotlin/org/jetbrains/dokka/gradle/ConfigurationExtractor.kt index c69c6f67..44a0635f 100644 --- a/runners/gradle-plugin/src/main/kotlin/org/jetbrains/dokka/gradle/ConfigurationExtractor.kt +++ b/runners/gradle-plugin/src/main/kotlin/org/jetbrains/dokka/gradle/ConfigurationExtractor.kt @@ -1,9 +1,5 @@ package org.jetbrains.dokka.gradle -import com.android.build.gradle.* -import com.android.build.gradle.api.BaseVariant -import com.android.builder.core.BuilderConstants -import org.gradle.api.NamedDomainObjectCollection import org.gradle.api.Project import org.gradle.api.Task import org.gradle.api.UnknownDomainObjectException @@ -13,57 +9,60 @@ import org.gradle.api.plugins.JavaPluginConvention import org.gradle.api.tasks.SourceSet import org.gradle.api.tasks.compile.AbstractCompile import org.jetbrains.dokka.ReflectDsl -import org.jetbrains.kotlin.gradle.dsl.KotlinCommonOptions import org.jetbrains.kotlin.gradle.dsl.KotlinMultiplatformExtension import org.jetbrains.kotlin.gradle.dsl.KotlinProjectExtension import org.jetbrains.kotlin.gradle.dsl.KotlinSingleTargetExtension -import org.jetbrains.kotlin.gradle.plugin.* +import org.jetbrains.kotlin.gradle.plugin.KotlinCompilation +import org.jetbrains.kotlin.gradle.plugin.KotlinSourceSet import org.jetbrains.kotlin.gradle.tasks.KotlinCompile import java.io.File import java.io.Serializable class ConfigurationExtractor(private val project: Project) { - fun extractConfiguration(targetName: String, variantName: String?) = - extractFromKotlinProject(targetName, variantName) - - fun extractFromKotlinProject(sourceSetName: String, variantName: String?): PlatformData? { + fun extractConfiguration(sourceSetName: String): PlatformData? { val projectExtension = project.extensions.getByType(KotlinProjectExtension::class.java) val sourceSet = projectExtension.sourceSets.findByName(sourceSetName) ?: run { project.logger.error("No source set with name '$sourceSetName' found"); return null } val compilation = when (projectExtension) { - is KotlinMultiplatformExtension -> projectExtension.targets.flatMap { it.compilations } - .find { it.kotlinSourceSets.contains(sourceSet) } + is KotlinMultiplatformExtension -> { + val targets = projectExtension.targets.flatMap { it.compilations } + targets.find { it.name == sourceSetName } ?: targets.find { it.kotlinSourceSets.contains(sourceSet) } + } is KotlinSingleTargetExtension -> projectExtension.target.compilations.find { it.kotlinSourceSets.contains(sourceSet) } else -> null - } ?: run { project.logger.error("No compilation found for set with name '$sourceSetName'"); return null } + } + + val sourceRoots = sourceSet.sourceFiles + val classpath = compilation?.classpath + ?: sourceRoots + sourceSet.allParentSourceFiles() - val classpath = compilation.compileDependencyFiles.files.filter { it.exists() } - val dependencies = (compilation.allKotlinSourceSets - sourceSet).flatMap { it.kotlin.sourceDirectories } return PlatformData( sourceSetName, - classpath, - sourceSet.kotlin.sourceDirectories.filter { it.exists() }.toList(), - dependencies, - sourceSet.dependsOn.map { it.name }, - compilation.target.targetName + classpath.filter { it.exists() }, + sourceRoots, + sourceSet.dependsOn.map { it.name }, + compilation?.target?.platformType?.name ?: "common" ) } + private fun KotlinSourceSet.allParentSourceFiles(): List<File> = + sourceFiles + dependsOn.flatMap { it.allParentSourceFiles() } + fun extractFromJavaPlugin(): PlatformData? = project.convention.findPlugin(JavaPluginConvention::class.java) ?.run { sourceSets.findByName(SourceSet.MAIN_SOURCE_SET_NAME)?.allSource?.srcDirs } - ?.let { PlatformData(null, emptyList(), it.toList(), emptyList(), emptyList(), "") } + ?.let { PlatformData(null, emptyList(), it.toList(), emptyList(), "") } - fun extractFromKotlinTasks(passName: String, kotlinTasks: List<Task>): PlatformData? = + fun extractFromKotlinTasks(kotlinTasks: List<Task>): List<PlatformData> = try { - kotlinTasks.find { it.toString() == passName }?.let { extractFromKotlinTask(it) } + kotlinTasks.map { extractFromKotlinTask(it) } } catch (e: Throwable) { when (e) { is UnknownDomainObjectException, is NoClassDefFoundError, is ClassNotFoundException -> - extractFromKotlinTasksTheHardWay(passName, kotlinTasks) + listOfNotNull(extractFromKotlinTasksTheHardWay(kotlinTasks)) else -> throw e } } @@ -80,18 +79,17 @@ class ConfigurationExtractor(private val project: Project) { .flatMap { it.compilations }.firstOrNull { it.compileKotlinTask == task } else -> throw e } - }.let { + }.let { compilation -> PlatformData( task.name, - getClasspath(it), - getSourceSet(it), - getDependentSourceSetRoots(it), - getDependentSourceSet(it).map { it.name }, - it?.platformType?.toString() ?: "" + compilation?.classpath.orEmpty(), + compilation?.sourceFiles.orEmpty(), + compilation?.dependentSourceSets?.map { it.name }.orEmpty(), + compilation?.platformType?.toString() ?: "" ) } - private fun extractFromKotlinTasksTheHardWay(passName: String, kotlinTasks: List<Task>): PlatformData? { + private fun extractFromKotlinTasksTheHardWay(kotlinTasks: List<Task>): PlatformData? { val allClasspath = mutableSetOf<File>() var allClasspathFileCollection: FileCollection = project.files() val allSourceRoots = mutableSetOf<File>() @@ -128,93 +126,41 @@ class ConfigurationExtractor(private val project: Project) { } classpath.addAll(project.files(allClasspath).toList()) - return PlatformData(null, classpath, allSourceRoots.toList(), emptyList(), emptyList(),"") + return PlatformData(null, classpath, allSourceRoots.toList(), emptyList(), "") } - private fun getSourceSet(target: KotlinTarget, variantName: String? = null): List<File> = - if (variantName != null) - getSourceSet(getCompilation(target, variantName)) - else - getSourceSet(getMainCompilation(target)) - - private fun getClasspath(target: KotlinTarget, variantName: String? = null): List<File> = - if (target.isAndroidTarget()) { - if (variantName != null) - getClasspathFromAndroidTask(getCompilation(target, variantName)) - else - getClasspathFromAndroidTask(getMainCompilation(target)) - } else { - getClasspath(getMainCompilation(target)) - } - - private fun getSourceSet(compilation: KotlinCompilation<*>?): List<File> = compilation - ?.kotlinSourceSets - ?.flatMap { it.kotlin.sourceDirectories } - ?.filter { it.exists() } - .orEmpty() + private val KotlinCompilation<*>.sourceFiles: List<File> + get() = kotlinSourceSets.flatMap { it.sourceFiles } - private fun getDependentSourceSet(compilation: KotlinCompilation<*>?) = compilation - ?.let { it.allKotlinSourceSets - it.kotlinSourceSets }.orEmpty() + private val KotlinSourceSet.sourceFiles: List<File> + get() = kotlin.sourceDirectories.filter { it.exists() }.toList() - private fun getDependentSourceSetRoots(compilation: KotlinCompilation<*>?): List<File> = - getDependentSourceSet(compilation)?.flatMap { it.kotlin.sourceDirectories } - .filter { it.exists() } + private val KotlinCompilation<*>.dependentSourceSets: Set<KotlinSourceSet> + get() = (allKotlinSourceSets - kotlinSourceSets) - private fun getClasspath(compilation: KotlinCompilation<*>?): List<File> = compilation - ?.compileDependencyFiles - ?.files - ?.toList() - ?.filter { it.exists() } - .orEmpty() + private val KotlinCompilation<*>.classpath: List<File> + get() = if (target.isAndroidTarget()) { + getClasspathFromAndroidTask(this) + } else { + getClasspathFromRegularTask(this) + } // This is a workaround for KT-33893 private fun getClasspathFromAndroidTask(compilation: KotlinCompilation<*>): List<File> = (compilation .compileKotlinTask as? KotlinCompile) - ?.classpath?.files?.toList() ?: getClasspath(compilation) - - private fun getMainCompilation(target: KotlinTarget) = - getCompilation(target, getMainCompilationName(target)) - - private fun getCompilation(target: KotlinTarget, name: String) = - target.compilations.getByName(name) - - private fun getMainCompilationName(target: KotlinTarget) = if (target.isAndroidTarget()) - getVariants(project).filter { it.buildType.name == BuilderConstants.RELEASE }.map { it.name }.first() - else - KotlinCompilation.MAIN_COMPILATION_NAME - - private fun getVariants(project: Project): Set<BaseVariant> { - val androidExtension = project.extensions.getByName("android") - val baseVariants = when (androidExtension) { - is AppExtension -> androidExtension.applicationVariants.toSet() - is LibraryExtension -> { - androidExtension.libraryVariants.toSet() + - if (androidExtension is FeatureExtension) { - androidExtension.featureVariants.toSet() - } else { - emptySet<BaseVariant>() - } - } - is TestExtension -> androidExtension.applicationVariants.toSet() - else -> emptySet() - } - val testVariants = if (androidExtension is TestedExtension) { - androidExtension.testVariants.toSet() + androidExtension.unitTestVariants.toSet() - } else { - emptySet<BaseVariant>() - } - - return baseVariants + testVariants - } + ?.classpath?.files?.toList() ?: getClasspathFromRegularTask(compilation) - private fun getPlatformName(platform: KotlinPlatformType): String = - if (platform == KotlinPlatformType.androidJvm) KotlinPlatformType.jvm.toString() else platform.toString() + private fun getClasspathFromRegularTask(compilation: KotlinCompilation<*>): List<File> = + compilation + .compileDependencyFiles + .files + .toList() + .filter { it.exists() } data class PlatformData( val name: String?, val classpath: List<File>, val sourceRoots: List<File>, - val dependentSourceRoots: List<File>, val dependentSourceSets: List<String>, val platform: String ) : Serializable diff --git a/runners/gradle-plugin/src/main/kotlin/org/jetbrains/dokka/gradle/DokkaCollectorTask.kt b/runners/gradle-plugin/src/main/kotlin/org/jetbrains/dokka/gradle/DokkaCollectorTask.kt index f4fa7aaa..8c4e0c4c 100644 --- a/runners/gradle-plugin/src/main/kotlin/org/jetbrains/dokka/gradle/DokkaCollectorTask.kt +++ b/runners/gradle-plugin/src/main/kotlin/org/jetbrains/dokka/gradle/DokkaCollectorTask.kt @@ -20,7 +20,7 @@ open class DokkaCollectorTask : DefaultTask() { @TaskAction fun collect() { - val passesConfigurations = getProjects(project).filter { it.name in modules }.map { + val passesConfigurations = getProjects(project).filter { it.name in modules }.mapNotNull { val task = try { it.tasks.getByName(DOKKA_TASK_NAME, DokkaTask::class) } catch (e: UnknownTaskException) { @@ -33,12 +33,11 @@ open class DokkaCollectorTask : DefaultTask() { outputDir = outputDirectory cacheRoot = passesConfigurations.first().cacheRoot format = passesConfigurations.first().format - generateIndexPages = passesConfigurations.first().generateIndexPages } configuration = passesConfigurations.fold(initial) { acc, it: GradleDokkaConfigurationImpl -> - if(acc.format != it.format || acc.generateIndexPages != it.generateIndexPages || acc.cacheRoot != it.cacheRoot) - throw IllegalStateException("Dokka task configurations differ on core arguments (format, generateIndexPages, cacheRoot)") + if(acc.format != it.format || acc.cacheRoot != it.cacheRoot) + throw IllegalStateException("Dokka task configurations differ on core arguments (format, cacheRoot)") acc.passesConfigurations = acc.passesConfigurations + it.passesConfigurations acc.pluginsClasspath = (acc.pluginsClasspath + it.pluginsClasspath).distinct() acc diff --git a/runners/gradle-plugin/src/main/kotlin/org/jetbrains/dokka/gradle/DokkaMultimoduleTask.kt b/runners/gradle-plugin/src/main/kotlin/org/jetbrains/dokka/gradle/DokkaMultimoduleTask.kt index a1bfdb96..2ef85de2 100644 --- a/runners/gradle-plugin/src/main/kotlin/org/jetbrains/dokka/gradle/DokkaMultimoduleTask.kt +++ b/runners/gradle-plugin/src/main/kotlin/org/jetbrains/dokka/gradle/DokkaMultimoduleTask.kt @@ -35,9 +35,9 @@ open class DokkaMultimoduleTask : DefaultTask(), Configurable { System.setProperty(DokkaTask.COLORS_ENABLED_PROPERTY, "false") try { - loadFatJar() + loadCore() val bootstrapClass = - ClassloaderContainer.fatJarClassLoader!!.loadClass("org.jetbrains.dokka.DokkaMultimoduleBootstrapImpl") + ClassloaderContainer.coreClassLoader!!.loadClass("org.jetbrains.dokka.DokkaMultimoduleBootstrapImpl") val bootstrapInstance = bootstrapClass.constructors.first().newInstance() val bootstrapProxy: DokkaBootstrap = automagicTypedProxy( javaClass.classLoader, @@ -85,10 +85,10 @@ open class DokkaMultimoduleTask : DefaultTask(), Configurable { } } - private fun loadFatJar() { - if (ClassloaderContainer.fatJarClassLoader == null) { + private fun loadCore() { + if (ClassloaderContainer.coreClassLoader == null) { val jars = dokkaRuntime!!.resolve() - ClassloaderContainer.fatJarClassLoader = URLClassLoader( + ClassloaderContainer.coreClassLoader = URLClassLoader( jars.map { it.toURI().toURL() }.toTypedArray(), ClassLoader.getSystemClassLoader().parent ) diff --git a/runners/gradle-plugin/src/main/kotlin/org/jetbrains/dokka/gradle/DokkaTask.kt b/runners/gradle-plugin/src/main/kotlin/org/jetbrains/dokka/gradle/DokkaTask.kt index 2de95493..5a420d4d 100644 --- a/runners/gradle-plugin/src/main/kotlin/org/jetbrains/dokka/gradle/DokkaTask.kt +++ b/runners/gradle-plugin/src/main/kotlin/org/jetbrains/dokka/gradle/DokkaTask.kt @@ -15,15 +15,16 @@ import org.jetbrains.dokka.ReflectDsl import org.jetbrains.dokka.ReflectDsl.isNotInstance import org.jetbrains.dokka.gradle.ConfigurationExtractor.PlatformData import org.jetbrains.dokka.plugability.Configurable -import org.jetbrains.kotlin.gradle.plugin.KotlinPlatformType import java.io.File import java.net.URLClassLoader import java.util.concurrent.Callable import java.util.function.BiConsumer +import kotlin.system.exitProcess open class DokkaTask : DefaultTask(), Configurable { private val ANDROID_REFERENCE_URL = Builder("https://developer.android.com/reference/").build() private val GLOBAL_CONFIGURATION_NAME = "global" // Used for copying perPackageOptions to other platforms + private val configExtractor = ConfigurationExtractor(project) @Suppress("MemberVisibilityCanBePrivate") fun defaultKotlinTasks(): List<Task> = with(ReflectDsl) { @@ -57,8 +58,6 @@ open class DokkaTask : DefaultTask(), Configurable { var subProjects: List<String> = emptyList() @Input - var impliedPlatforms: MutableList<String> = arrayListOf() - override val pluginsConfiguration: Map<String, String> = mutableMapOf() @Optional @@ -66,54 +65,47 @@ open class DokkaTask : DefaultTask(), Configurable { var cacheRoot: String? = null @Classpath - lateinit var pluginsConfig: Configuration + lateinit var pluginsClasspathConfiguration: Configuration var dokkaSourceSets: NamedDomainObjectContainer<GradlePassConfigurationImpl> @Suppress("UNCHECKED_CAST") @Nested get() = (DslObject(this).extensions.getByName(SOURCE_SETS_EXTENSION_NAME) as NamedDomainObjectContainer<GradlePassConfigurationImpl>) internal set(value) = DslObject(this).extensions.add(SOURCE_SETS_EXTENSION_NAME, value) - var configuration: GradlePassConfigurationImpl - @Suppress("UNCHECKED_CAST") - @Nested get() = DslObject(this).extensions.getByType(GradlePassConfigurationImpl::class.java) - internal set(value) = DslObject(this).extensions.add(CONFIGURATION_EXTENSION_NAME, value) - - var config: GradleDokkaConfigurationImpl? = null - - // Configure Dokka with closure in Gradle Kotlin DSL - fun configuration(action: Action<in GradlePassConfigurationImpl>) = action.execute(configuration) - private val kotlinTasks: List<Task> by lazy { - extractKotlinCompileTasks( - configuration.collectKotlinTasks ?: { defaultKotlinTasks() }) + extractKotlinCompileTasks({ + dokkaSourceSets.map { + it.collectKotlinTasks?.invoke() + } + }.takeIf { it().isNotEmpty() } ?: { defaultKotlinTasks() } + ) } - private val configExtractor = ConfigurationExtractor(project) - @Input var disableAutoconfiguration: Boolean = false + @Input + var offlineMode: Boolean = false + private var outputDiagnosticInfo: Boolean = false // Workaround for Gradle, which fires some methods (like collectConfigurations()) multiple times in its lifecycle - private fun loadFatJar() { - if (ClassloaderContainer.fatJarClassLoader == null) { + private fun loadCore() { + if (ClassloaderContainer.coreClassLoader == null) { val jars = dokkaRuntime!!.resolve() - ClassloaderContainer.fatJarClassLoader = URLClassLoader( + ClassloaderContainer.coreClassLoader = URLClassLoader( jars.map { it.toURI().toURL() }.toTypedArray(), ClassLoader.getSystemClassLoader().parent ) } } - private fun extractKotlinCompileTasks(collectTasks: () -> List<Any?>?): List<Task> { + protected fun extractKotlinCompileTasks(collectTasks: () -> List<Any?>?): List<Task> { val inputList = (collectTasks.invoke() ?: emptyList()).filterNotNull() val (paths, other) = inputList.partition { it is String } - val taskContainer = project.tasks - val tasksByPath = paths.map { - taskContainer.findByPath(it as String) ?: throw IllegalArgumentException("Task with path '$it' not found") + project.tasks.findByPath(it as String) ?: throw IllegalArgumentException("Task with path '$it' not found") } other @@ -134,7 +126,7 @@ open class DokkaTask : DefaultTask(), Configurable { private fun Iterable<String>.toProjects(): List<Project> = project.subprojects.toList().filter { this.contains(it.name) } - private fun collectSuppressedFiles(sourceRoots: List<SourceRoot>) = + protected open fun collectSuppressedFiles(sourceRoots: List<SourceRoot>) = if (project.isAndroidProject()) { val generatedRoot = project.buildDir.resolve("generated").absoluteFile sourceRoots @@ -147,25 +139,21 @@ open class DokkaTask : DefaultTask(), Configurable { } @TaskAction - fun generate() { - generateForConfig(config ?: getConfiguration()) - } + fun generate() = getConfiguration()?.let { generate(it) } ?: exitProcess(0) - internal fun generateForConfig(configuration: GradleDokkaConfigurationImpl) { + protected open fun generate(configuration: GradleDokkaConfigurationImpl) { outputDiagnosticInfo = true val kotlinColorsEnabledBefore = System.getProperty(COLORS_ENABLED_PROPERTY) ?: "false" System.setProperty(COLORS_ENABLED_PROPERTY, "false") try { - loadFatJar() + loadCore() val bootstrapClass = - ClassloaderContainer.fatJarClassLoader!!.loadClass("org.jetbrains.dokka.DokkaBootstrapImpl") + ClassloaderContainer.coreClassLoader!!.loadClass("org.jetbrains.dokka.DokkaBootstrapImpl") val bootstrapInstance = bootstrapClass.constructors.first().newInstance() val bootstrapProxy: DokkaBootstrap = automagicTypedProxy(javaClass.classLoader, bootstrapInstance) - val gson = GsonBuilder().setPrettyPrinting().create() - bootstrapProxy.configure( BiConsumer { level, message -> when (level) { @@ -176,7 +164,7 @@ open class DokkaTask : DefaultTask(), Configurable { "error" -> logger.error(message) } }, - gson.toJson(configuration) + GsonBuilder().setPrettyPrinting().create().toJson(configuration) ) bootstrapProxy.generate() @@ -186,68 +174,78 @@ open class DokkaTask : DefaultTask(), Configurable { } } - internal fun getConfiguration(): GradleDokkaConfigurationImpl { + internal open fun getConfiguration(): GradleDokkaConfigurationImpl? { val globalConfig = dokkaSourceSets.toList().find { it.name.toLowerCase() == GLOBAL_CONFIGURATION_NAME } - val defaultModulesConfiguration = collectConfigurations() - .map { defaultPassConfiguration(it, globalConfig) } + val defaultModulesConfiguration = passConfigurations + .map { defaultPassConfiguration(it, globalConfig) }.takeIf { it.isNotEmpty() } + ?: listOf( + defaultPassConfiguration( + collectSinglePassConfiguration(GradlePassConfigurationImpl("main")), + null + ) + ).takeIf { project.isNotMultiplatformProject() } ?: emptyList() + + if (defaultModulesConfiguration.isEmpty()) { + logger.error("No source sets to document found, exiting") + return null + } + return GradleDokkaConfigurationImpl().apply { outputDir = project.file(outputDirectory).absolutePath format = outputFormat - generateIndexPages = true - cacheRoot = cacheRoot - impliedPlatforms = impliedPlatforms + cacheRoot = this@DokkaTask.cacheRoot + offlineMode = this@DokkaTask.offlineMode passesConfigurations = defaultModulesConfiguration - pluginsClasspath = pluginsConfig.resolve().toList() + pluginsClasspath = pluginsClasspathConfiguration.resolve().toList() pluginsConfiguration = this@DokkaTask.pluginsConfiguration } } - private fun collectConfigurations() = - if (this.dokkaSourceSets.isNotEmpty()) collectMultipassConfiguration() else listOf(collectSinglePassConfiguration(configuration)) - private fun collectMultipassConfiguration() = dokkaSourceSets - .filterNot { it.name.toLowerCase() == GLOBAL_CONFIGURATION_NAME } - .map { collectSinglePassConfiguration(it) } + protected val passConfigurations: List<GradlePassConfigurationImpl> + get() = dokkaSourceSets + .filterNot { it.name.toLowerCase() == GLOBAL_CONFIGURATION_NAME } + .map { collectSinglePassConfiguration(it) } - private fun collectSinglePassConfiguration(config: GradlePassConfigurationImpl): GradlePassConfigurationImpl { + protected fun collectSinglePassConfiguration(config: GradlePassConfigurationImpl): GradlePassConfigurationImpl { val userConfig = config - /*.let { - if (it.collectKotlinTasks != null) { - configExtractor.extractFromKotlinTasks(extractKotlinCompileTasks(it.collectKotlinTasks!!)) - ?.let { platformData -> mergeUserConfigurationAndPlatformData(it, platformData) } ?: it - } else { - it + .apply { + collectKotlinTasks?.let { + configExtractor.extractFromKotlinTasks(extractKotlinCompileTasks(it)) + .fold(this) { config, platformData -> + mergeUserConfigurationAndPlatformData(config, platformData) + } + } } - }*/ if (disableAutoconfiguration) return userConfig - val baseConfig = configExtractor.extractConfiguration(userConfig.name, userConfig.androidVariant) + val baseConfig = configExtractor.extractConfiguration(userConfig.name) ?.let { mergeUserConfigurationAndPlatformData(userConfig, it) } ?: if (this.dokkaSourceSets.isNotEmpty()) { if (outputDiagnosticInfo) logger.warn( - "Could not find target with name: ${userConfig.name} in Kotlin Gradle Plugin, " + - "using only user provided configuration for this target" + "Could not find source set with name: ${userConfig.name} in Kotlin Gradle Plugin, " + + "using only user provided configuration for this source set" ) userConfig } else { - logger.warn("Could not find target with name: ${userConfig.name} in Kotlin Gradle Plugin") - collectFromSinglePlatformOldPlugin(userConfig.name) + if (outputDiagnosticInfo) + logger.warn("Could not find source set with name: ${userConfig.name} in Kotlin Gradle Plugin") + collectFromSinglePlatformOldPlugin(userConfig.name, userConfig) } return if (subProjects.isNotEmpty()) { try { - subProjects.toProjects().fold(baseConfig) { config, subProject -> + subProjects.toProjects().fold(baseConfig) { configAcc, subProject -> mergeUserConfigurationAndPlatformData( - config, - ConfigurationExtractor(subProject).extractConfiguration(config.name, config.androidVariant)!! + configAcc, + ConfigurationExtractor(subProject).extractConfiguration(userConfig.name)!! ) } } catch (e: NullPointerException) { logger.warn( - "Cannot extract sources from subProjects. Do you have the Kotlin plugin in version 1.3.30+ " + - "and the Kotlin plugin applied in the root project?" + "Cannot extract sources from subProjects. Do you have the Kotlin plugin applied in the root project?" ) baseConfig } @@ -256,49 +254,52 @@ open class DokkaTask : DefaultTask(), Configurable { } } - private fun collectFromSinglePlatformOldPlugin(name: String) = - configExtractor.extractFromKotlinTasks(name, kotlinTasks) - ?.let { mergeUserConfigurationAndPlatformData(configuration, it) } + protected fun collectFromSinglePlatformOldPlugin(name: String, userConfig: GradlePassConfigurationImpl) = + kotlinTasks.find { it.name == name } + ?.let { configExtractor.extractFromKotlinTasks(listOf(it)) } + ?.singleOrNull() + ?.let { mergeUserConfigurationAndPlatformData(userConfig, it) } ?: configExtractor.extractFromJavaPlugin() - ?.let { mergeUserConfigurationAndPlatformData(configuration, it) } - ?: configuration + ?.let { mergeUserConfigurationAndPlatformData(userConfig, it) } + ?: userConfig - private fun mergeUserConfigurationAndPlatformData( + protected fun mergeUserConfigurationAndPlatformData( userConfig: GradlePassConfigurationImpl, autoConfig: PlatformData ) = userConfig.copy().apply { - sourceSetName = autoConfig.name ?: "" + sourceSetID = autoConfig.name ?: "" sourceRoots.addAll(userConfig.sourceRoots.union(autoConfig.sourceRoots.toSourceRoots()).distinct()) - dependentSourceRoots.addAll(userConfig.dependentSourceRoots.union(autoConfig.dependentSourceRoots.toSourceRoots()).distinct()) dependentSourceSets.addAll(userConfig.dependentSourceSets.union(autoConfig.dependentSourceSets).distinct()) classpath = userConfig.classpath.union(autoConfig.classpath.map { it.absolutePath }).distinct() if (userConfig.platform == null && autoConfig.platform != "") platform = autoConfig.platform } - private fun defaultPassConfiguration( + protected fun defaultPassConfiguration( config: GradlePassConfigurationImpl, globalConfig: GradlePassConfigurationImpl? ): GradlePassConfigurationImpl { - if (config.moduleName == "") { + if (config.moduleName.isBlank()) { config.moduleName = project.name } - if (config.sourceSetName.isEmpty()) { - config.sourceSetName = config.name.substringBeforeLast("Main").takeIf(String::isNotBlank) ?: config.platform.toString() + if (config.sourceSetID.isBlank()) { + config.sourceSetID = config.name.takeIf(String::isNotBlank) ?: config.analysisPlatform.key } - config.classpath = (config.classpath as List<Any>).map { it.toString() }.distinct() // Workaround for Groovy's GStringImpl + config.displayName = config.sourceSetID.substringBeforeLast("Main") + config.classpath = + (config.classpath as List<Any>).map { it.toString() }.distinct() // Workaround for Groovy's GStringImpl config.sourceRoots = config.sourceRoots.distinct().toMutableList() config.samples = config.samples.map { project.file(it).absolutePath } config.includes = config.includes.map { project.file(it).absolutePath } config.suppressedFiles += collectSuppressedFiles(config.sourceRoots) - if (project.isAndroidProject() && !config.noAndroidSdkLink) { // TODO: introduce Android as a separate Dokka platform? + if (project.isAndroidProject() && !config.noAndroidSdkLink) { config.externalDocumentationLinks.add(ANDROID_REFERENCE_URL) } - if (config.platform != null && config.platform.toString().isNotBlank()) { + if (config.platform?.isNotBlank() == true) { config.analysisPlatform = dokkaPlatformFromString(config.platform.toString()) } - if (globalConfig != null) { + globalConfig?.let { config.perPackageOptions.addAll(globalConfig.perPackageOptions) config.externalDocumentationLinks.addAll(globalConfig.externalDocumentationLinks) config.sourceLinks.addAll(globalConfig.sourceLinks) @@ -309,7 +310,7 @@ open class DokkaTask : DefaultTask(), Configurable { } private fun dokkaPlatformFromString(platform: String) = when (platform.toLowerCase()) { - KotlinPlatformType.androidJvm.toString().toLowerCase(), "androidjvm", "android" -> Platform.jvm + "androidjvm", "android" -> Platform.jvm "metadata" -> Platform.common else -> Platform.fromString(platform) } @@ -321,7 +322,7 @@ open class DokkaTask : DefaultTask(), Configurable { // Needed for Gradle incremental build @InputFiles fun getInputFiles(): FileCollection { - val config = collectConfigurations() + val config = passConfigurations return project.files(config.flatMap { it.sourceRoots }.map { project.fileTree(File(it.path)) }) + project.files(config.flatMap { it.includes }) + project.files(config.flatMap { it.samples }.map { project.fileTree(File(it)) }) @@ -329,7 +330,7 @@ open class DokkaTask : DefaultTask(), Configurable { @Classpath fun getInputClasspath(): FileCollection = - project.files((collectConfigurations().flatMap { it.classpath } as List<Any>).map { project.fileTree(File(it.toString())) }) + project.files((passConfigurations.flatMap { it.classpath } as List<Any>).map { project.fileTree(File(it.toString())) }) companion object { const val COLORS_ENABLED_PROPERTY = "kotlin.colors.enabled" diff --git a/runners/gradle-plugin/src/main/kotlin/org/jetbrains/dokka/gradle/configurationImplementations.kt b/runners/gradle-plugin/src/main/kotlin/org/jetbrains/dokka/gradle/configurationImplementations.kt index 7fdadd41..2787bb4e 100644 --- a/runners/gradle-plugin/src/main/kotlin/org/jetbrains/dokka/gradle/configurationImplementations.kt +++ b/runners/gradle-plugin/src/main/kotlin/org/jetbrains/dokka/gradle/configurationImplementations.kt @@ -27,9 +27,9 @@ class GradleSourceRootImpl: SourceRoot, Serializable { open class GradlePassConfigurationImpl(@Transient val name: String = ""): PassConfiguration { @Input @Optional override var classpath: List<String> = emptyList() @Input override var moduleName: String = "" - @Input override var sourceSetName: String = "" + @Input override var displayName: String = "" + @Input override var sourceSetID: String = "" @Input override var sourceRoots: MutableList<SourceRoot> = mutableListOf() - @Input override var dependentSourceRoots: MutableList<SourceRoot> = mutableListOf() @Input override var dependentSourceSets: MutableList<String> = mutableListOf() @Input override var samples: List<String> = emptyList() @Input override var includes: List<String> = emptyList() @@ -48,13 +48,9 @@ open class GradlePassConfigurationImpl(@Transient val name: String = ""): PassCo @Input override var noJdkLink: Boolean = false @Input var noAndroidSdkLink: Boolean = false @Input override var suppressedFiles: List<String> = emptyList() - @Input override var collectInheritedExtensionsFromLibraries: Boolean = false @Input override var analysisPlatform: Platform = Platform.DEFAULT @Input @Optional var platform: String? = null - @Input override var targets: List<String> = emptyList() - @Input @Optional override var sinceKotlin: String? = null @Transient var collectKotlinTasks: (() -> List<Any?>?)? = null - @Input @Optional @Transient var androidVariant: String? = null fun kotlinTasks(taskSupplier: Callable<List<Any>>) { collectKotlinTasks = { taskSupplier.call() } @@ -129,9 +125,8 @@ class GradleDokkaModuleDescription: DokkaModuleDescription { class GradleDokkaConfigurationImpl: DokkaConfiguration { override var outputDir: String = "" override var format: String = "html" - override var generateIndexPages: Boolean = false override var cacheRoot: String? = null - override var impliedPlatforms: List<String> = emptyList() + override var offlineMode: Boolean = false override var passesConfigurations: List<GradlePassConfigurationImpl> = emptyList() override var pluginsClasspath: List<File> = emptyList() override var pluginsConfiguration: Map<String, String> = mutableMapOf() diff --git a/runners/gradle-plugin/src/main/kotlin/org/jetbrains/dokka/gradle/main.kt b/runners/gradle-plugin/src/main/kotlin/org/jetbrains/dokka/gradle/main.kt index 1049656e..d2a0f043 100644 --- a/runners/gradle-plugin/src/main/kotlin/org/jetbrains/dokka/gradle/main.kt +++ b/runners/gradle-plugin/src/main/kotlin/org/jetbrains/dokka/gradle/main.kt @@ -8,23 +8,31 @@ import java.io.File import java.io.InputStream import java.util.* -internal const val CONFIGURATION_EXTENSION_NAME = "configuration" internal const val SOURCE_SETS_EXTENSION_NAME = "dokkaSourceSets" internal const val DOKKA_TASK_NAME = "dokka" internal const val DOKKA_COLLECTOR_TASK_NAME = "dokkaCollector" internal const val DOKKA_MULTIMODULE_TASK_NAME = "dokkaMultimodule" open class DokkaPlugin : Plugin<Project> { - override fun apply(project: Project) { loadDokkaVersion() val dokkaRuntimeConfiguration = addConfiguration(project) val pluginsConfiguration = project.configurations.create("dokkaPlugins").apply { dependencies.add(project.dependencies.create("org.jetbrains.dokka:dokka-base:${DokkaVersion.version}")) + attributes.attribute( + org.gradle.api.attributes.Usage.USAGE_ATTRIBUTE, + project.objects.named(org.gradle.api.attributes.Usage::class.java, "java-runtime") + ) + isCanBeConsumed = false } addDokkaTasks(project, dokkaRuntimeConfiguration, pluginsConfiguration, DokkaTask::class.java) addDokkaCollectorTasks(project, DokkaCollectorTask::class.java) - addDokkaMultimoduleTasks(project.rootProject, dokkaRuntimeConfiguration, pluginsConfiguration, DokkaMultimoduleTask::class.java) + addDokkaMultimoduleTasks( + project.rootProject, + dokkaRuntimeConfiguration, + pluginsConfiguration, + DokkaMultimoduleTask::class.java + ) } private fun loadDokkaVersion() = @@ -32,7 +40,9 @@ open class DokkaPlugin : Plugin<Project> { private fun addConfiguration(project: Project) = project.configurations.create("dokkaRuntime").apply { - defaultDependencies { dependencies -> dependencies.add(project.dependencies.create("org.jetbrains.dokka:dokka-core:${DokkaVersion.version}")) } + defaultDependencies { dependencies -> + dependencies.add(project.dependencies.create("org.jetbrains.dokka:dokka-core:${DokkaVersion.version}")) + } } private fun addDokkaTasks( @@ -48,9 +58,8 @@ open class DokkaPlugin : Plugin<Project> { } project.tasks.withType(taskClass) { task -> task.dokkaSourceSets = project.container(GradlePassConfigurationImpl::class.java) - task.configuration = GradlePassConfigurationImpl() task.dokkaRuntime = runtimeConfiguration - task.pluginsConfig = pluginsConfiguration + task.pluginsClasspathConfiguration = pluginsConfiguration task.outputDirectory = File(project.rootProject.buildDir, "$DOKKA_TASK_NAME/${project.name}").absolutePath } } @@ -65,7 +74,6 @@ open class DokkaPlugin : Plugin<Project> { project.tasks.create(DOKKA_COLLECTOR_TASK_NAME, taskClass) } project.tasks.withType(taskClass) { task -> - task.modules = emptyList() task.outputDirectory = File(project.buildDir, DOKKA_TASK_NAME).absolutePath } } @@ -103,5 +111,5 @@ object DokkaVersion { object ClassloaderContainer { @JvmField - var fatJarClassLoader: ClassLoader? = null + var coreClassLoader: ClassLoader? = null }
\ No newline at end of file diff --git a/runners/gradle-plugin/src/main/kotlin/org/jetbrains/dokka/gradle/utils.kt b/runners/gradle-plugin/src/main/kotlin/org/jetbrains/dokka/gradle/utils.kt index 3369a640..a4bf65ee 100644 --- a/runners/gradle-plugin/src/main/kotlin/org/jetbrains/dokka/gradle/utils.kt +++ b/runners/gradle-plugin/src/main/kotlin/org/jetbrains/dokka/gradle/utils.kt @@ -7,7 +7,7 @@ import org.jetbrains.kotlin.gradle.plugin.KotlinPlatformType import org.jetbrains.kotlin.gradle.plugin.KotlinTarget -fun Project.isAndroidProject() = try { +internal fun Project.isAndroidProject() = try { project.extensions.getByName("android") true } catch(e: UnknownDomainObjectException) { @@ -16,4 +16,17 @@ fun Project.isAndroidProject() = try { false } -fun KotlinTarget.isAndroidTarget() = this.platformType == KotlinPlatformType.androidJvm
\ No newline at end of file +internal fun Project.isNotMultiplatformProject() = !isMultiplatformProject() + +internal fun Project.isMultiplatformProject() = try { + project.extensions.getByType(KotlinMultiplatformExtension::class.java) + true +} catch(e: UnknownDomainObjectException) { + false +} catch (e: NoClassDefFoundError){ + false +} catch(e: ClassNotFoundException) { + false +} + +internal fun KotlinTarget.isAndroidTarget() = this.platformType == KotlinPlatformType.androidJvm
\ No newline at end of file diff --git a/runners/maven-plugin/src/main/kotlin/DokkaMojo.kt b/runners/maven-plugin/src/main/kotlin/DokkaMojo.kt index 8242d0d1..71fe5b40 100644 --- a/runners/maven-plugin/src/main/kotlin/DokkaMojo.kt +++ b/runners/maven-plugin/src/main/kotlin/DokkaMojo.kt @@ -29,11 +29,9 @@ import org.eclipse.aether.transport.file.FileTransporterFactory import org.eclipse.aether.transport.http.HttpTransporterFactory import org.eclipse.aether.util.graph.visitor.PreorderNodeListGenerator import org.jetbrains.dokka.* -import org.jetbrains.dokka.utilities.DokkaConsoleLogger import java.io.File import java.net.URL - class SourceLinkMapItem { @Parameter(name = "path", required = true) var path: String = "" @@ -92,8 +90,6 @@ abstract class AbstractDokkaMojo : AbstractMojo() { @Parameter var sourceRoots: List<SourceRoot> = emptyList() - @Parameter - var dependentSourceRoots: List<SourceRoot> = emptyList() @Parameter var dependentSourceSets: List<String> = emptyList() @@ -146,6 +142,12 @@ abstract class AbstractDokkaMojo : AbstractMojo() { @Parameter var cacheRoot: String? = null + @Parameter(defaultValue = "JVM") + var displayName: String = "JVM" + + @Parameter(defaultValue = "false") + var offlineMode: Boolean = false + @Parameter var languageVersion: String? = null @@ -158,25 +160,14 @@ abstract class AbstractDokkaMojo : AbstractMojo() { @Parameter var suppressedFiles: List<String> = emptyList() - @Parameter - var collectInheritedExtensionsFromLibraries: Boolean = false @Parameter var platform: String = "" @Parameter - var targets: List<String> = emptyList() - - @Parameter - var sinceKotlin: String? = null - - @Parameter var includeNonPublic: Boolean = false @Parameter - var generateIndexPages: Boolean = false - - @Parameter var dokkaPlugins: List<Dependency> = emptyList() protected abstract fun getOutDir(): String @@ -209,19 +200,21 @@ abstract class AbstractDokkaMojo : AbstractMojo() { } val passConfiguration = PassConfigurationImpl( + moduleName = moduleName, + displayName = displayName, + sourceSetID = sourceSetName, classpath = classpath, - sourceSetName = sourceSetName, sourceRoots = sourceDirectories.map { SourceRootImpl(it) }, - dependentSourceRoots = dependentSourceRoots.map { SourceRootImpl(path = it.path) }, dependentSourceSets = dependentSourceSets, samples = samples, includes = includes, - collectInheritedExtensionsFromLibraries = collectInheritedExtensionsFromLibraries, // TODO: Should we implement this? - sourceLinks = sourceLinks.map { SourceLinkDefinitionImpl(it.path, it.url, it.lineSuffix) }, - jdkVersion = jdkVersion, - skipDeprecated = skipDeprecated, - skipEmptyPackages = skipEmptyPackages, + includeNonPublic = includeNonPublic, + includeRootPackage = includeRootPackage, reportUndocumented = reportUndocumented, + skipEmptyPackages = skipEmptyPackages, + skipDeprecated = skipDeprecated, + jdkVersion = jdkVersion, + sourceLinks = sourceLinks.map { SourceLinkDefinitionImpl(it.path, it.url, it.lineSuffix) }, perPackageOptions = perPackageOptions.map { PackageOptionsImpl( prefix = it.prefix, @@ -232,18 +225,13 @@ abstract class AbstractDokkaMojo : AbstractMojo() { ) }, externalDocumentationLinks = externalDocumentationLinks.map { it.build() as ExternalDocumentationLinkImpl }, - noStdlibLink = noStdlibLink, - noJdkLink = noJdkLink, languageVersion = languageVersion, apiVersion = apiVersion, - moduleName = moduleName, + noStdlibLink = noStdlibLink, + noJdkLink = noJdkLink, suppressedFiles = suppressedFiles, - sinceKotlin = sinceKotlin, - analysisPlatform = if (platform.isNotEmpty()) Platform.fromString(platform) else Platform.DEFAULT, - targets = targets, - includeNonPublic = includeNonPublic, - includeRootPackage = includeRootPackage - ).let{ + analysisPlatform = if (platform.isNotEmpty()) Platform.fromString(platform) else Platform.DEFAULT + ).let { it.copy( externalDocumentationLinks = defaultLinks(it) + it.externalDocumentationLinks ) @@ -254,12 +242,11 @@ abstract class AbstractDokkaMojo : AbstractMojo() { val configuration = DokkaConfigurationImpl( outputDir = getOutDir(), format = getOutFormat(), - impliedPlatforms = impliedPlatforms, + offlineMode = offlineMode, cacheRoot = cacheRoot, passesConfigurations = listOf(passConfiguration).also { - if(passConfiguration.moduleName.isEmpty()) logger.warn("Not specified module name. It can result in unexpected behaviour while including documentation for module") + if (passConfiguration.moduleName.isEmpty()) logger.warn("Not specified module name. It can result in unexpected behaviour while including documentation for module") }, - generateIndexPages = generateIndexPages, pluginsClasspath = getArtifactByAether("org.jetbrains.dokka", "dokka-base", dokkaVersion) + dokkaPlugins.map { getArtifactByAether(it.groupId, it.artifactId, it.version) }.flatten(), pluginsConfiguration = mutableMapOf(), //TODO implement as it is in Gradle diff --git a/settings.gradle.kts b/settings.gradle.kts index 39a82007..b3e15ade 100644 --- a/settings.gradle.kts +++ b/settings.gradle.kts @@ -1,6 +1,7 @@ rootProject.name = "dokka" include("core") +include("plugins:base:search-component") include("coreDependencies") include("testApi") include("test-tools") @@ -31,6 +32,4 @@ pluginManagement { jcenter() gradlePluginPortal() } -} -include("plugins:base:frontend") -findProject(":plugins:base:frontend")?.name = "frontend" +}
\ No newline at end of file diff --git a/testApi/src/main/kotlin/testApi/testRunner/TestRunner.kt b/testApi/src/main/kotlin/testApi/testRunner/TestRunner.kt index 7f1be6b5..3aec2909 100644 --- a/testApi/src/main/kotlin/testApi/testRunner/TestRunner.kt +++ b/testApi/src/main/kotlin/testApi/testRunner/TestRunner.kt @@ -139,7 +139,7 @@ abstract class AbstractCoreTest { protected class DokkaConfigurationBuilder { var outputDir: String = "out" var format: String = "html" - var generateIndexPages: Boolean = true + var offlineMode: Boolean = false var cacheRoot: String? = null var pluginsClasspath: List<File> = emptyList() var pluginsConfigurations: Map<String, String> = emptyMap() @@ -147,9 +147,8 @@ abstract class AbstractCoreTest { fun build() = DokkaConfigurationImpl( outputDir = outputDir, format = format, - generateIndexPages = generateIndexPages, cacheRoot = cacheRoot, - impliedPlatforms = emptyList(), + offlineMode = offlineMode, passesConfigurations = passesConfigurations, pluginsClasspath = pluginsClasspath, pluginsConfiguration = pluginsConfigurations, @@ -171,9 +170,9 @@ abstract class AbstractCoreTest { protected class DokkaPassConfigurationBuilder( var moduleName: String = "root", var sourceSetName: String = "main", + var displayName: String = "JVM", var classpath: List<String> = emptyList(), var sourceRoots: List<String> = emptyList(), - var dependentSourceRoots: List<String> = emptyList(), var dependentSourceSets: List<String> = emptyList(), var samples: List<String> = emptyList(), var includes: List<String> = emptyList(), @@ -188,20 +187,17 @@ abstract class AbstractCoreTest { var noStdlibLink: Boolean = false, var noJdkLink: Boolean = false, var suppressedFiles: List<String> = emptyList(), - var collectInheritedExtensionsFromLibraries: Boolean = true, var analysisPlatform: String = "jvm", - var targets: List<String> = listOf("jvm"), - var sinceKotlin: String? = null, var perPackageOptions: List<PackageOptionsImpl> = emptyList(), var externalDocumentationLinks: List<ExternalDocumentationLinkImpl> = emptyList(), var sourceLinks: List<SourceLinkDefinitionImpl> = emptyList() ) { fun build() = PassConfigurationImpl( moduleName = moduleName, - sourceSetName = sourceSetName, + displayName = displayName, + sourceSetID = sourceSetName, classpath = classpath, sourceRoots = sourceRoots.map { SourceRootImpl(it) }, - dependentSourceRoots = dependentSourceRoots.map { SourceRootImpl(it) }, dependentSourceSets = dependentSourceSets, samples = samples, includes = includes, @@ -211,18 +207,15 @@ abstract class AbstractCoreTest { skipEmptyPackages = skipEmptyPackages, skipDeprecated = skipDeprecated, jdkVersion = jdkVersion, + sourceLinks = sourceLinks, + perPackageOptions = perPackageOptions, + externalDocumentationLinks = externalDocumentationLinks, languageVersion = languageVersion, apiVersion = apiVersion, noStdlibLink = noStdlibLink, noJdkLink = noJdkLink, suppressedFiles = suppressedFiles, - collectInheritedExtensionsFromLibraries = collectInheritedExtensionsFromLibraries, - analysisPlatform = Platform.fromString(analysisPlatform), - targets = targets, - sinceKotlin = sinceKotlin, - perPackageOptions = perPackageOptions, - externalDocumentationLinks = externalDocumentationLinks, - sourceLinks = sourceLinks + analysisPlatform = Platform.fromString(analysisPlatform) ) } |