diff --git a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/KotlinMultiplatformPlugin.kt b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/KotlinMultiplatformPlugin.kt index 08d3eee2531..c518ab08e56 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/KotlinMultiplatformPlugin.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/KotlinMultiplatformPlugin.kt @@ -9,6 +9,7 @@ import org.gradle.api.Plugin import org.gradle.api.Project import org.gradle.api.attributes.AttributeContainer import org.gradle.api.file.DuplicatesStrategy +import org.gradle.api.plugins.BasePlugin import org.gradle.api.plugins.JavaBasePlugin import org.gradle.api.tasks.TaskProvider import org.gradle.jvm.tasks.Jar @@ -27,7 +28,6 @@ import org.jetbrains.kotlin.gradle.plugin.mpp.pm20.setupFragmentsMetadataForKpmM import org.jetbrains.kotlin.gradle.plugin.mpp.pm20.setupKpmModulesPublication import org.jetbrains.kotlin.gradle.plugin.mpp.pm20.util.copyAttributes import org.jetbrains.kotlin.gradle.plugin.sources.DefaultLanguageSettingsBuilder -import org.jetbrains.kotlin.gradle.plugin.sources.SourceSetMetadataStorageForIde import org.jetbrains.kotlin.gradle.plugin.sources.checkSourceSetVisibilityRequirements import org.jetbrains.kotlin.gradle.plugin.sources.internal import org.jetbrains.kotlin.gradle.plugin.statistics.KotlinBuildStatsService @@ -302,21 +302,23 @@ private fun applyUserDefinedAttributesWithLegacyModel( } } -internal fun sourcesJarTask(compilation: KotlinCompilation<*>, componentName: String?, artifactNameAppendix: String): TaskProvider = +internal fun sourcesJarTask(compilation: KotlinCompilation<*>, componentName: String, artifactNameAppendix: String): TaskProvider = sourcesJarTask(compilation.target.project, lazy { compilation.allKotlinSourceSets.associate { it.name to it.kotlin } }, componentName, artifactNameAppendix) -internal fun sourcesJarTask( +private fun sourcesJarTask( project: Project, sourceSets: Lazy>>, - componentName: String?, + taskNamePrefix: String, artifactNameAppendix: String -): TaskProvider = sourcesJarTaskNamed(lowerCamelCaseName(componentName, "sourcesJar"), project, sourceSets, artifactNameAppendix) +): TaskProvider = sourcesJarTaskNamed(lowerCamelCaseName(taskNamePrefix, "sourcesJar"), taskNamePrefix, project, sourceSets, artifactNameAppendix) internal fun sourcesJarTaskNamed( taskName: String, + componentName: String, project: Project, sourceSets: Lazy>>, - artifactNameAppendix: String + artifactNameAppendix: String, + componentTypeName: String = "target", ): TaskProvider { project.locateTask(taskName)?.let { return it @@ -327,6 +329,8 @@ internal fun sourcesJarTaskNamed( sourcesJar.archiveClassifier.set("sources") sourcesJar.isPreserveFileTimestamps = false sourcesJar.isReproducibleFileOrder = true + sourcesJar.group = BasePlugin.BUILD_GROUP + sourcesJar.description = "Assembles a jar archive containing the sources of $componentTypeName '$componentName'." } project.whenEvaluated { diff --git a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/KotlinSoftwareComponent.kt b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/KotlinSoftwareComponent.kt index 33723d155b6..5bfa8a79ac4 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/KotlinSoftwareComponent.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/KotlinSoftwareComponent.kt @@ -94,10 +94,11 @@ abstract class KotlinSoftwareComponent( } val sourcesArtifacts: Set by lazy { - val sourcesJarTask = sourcesJarTask( + val sourcesJarTask = sourcesJarTaskNamed( + "sourcesJar", + name, project, lazy { project.kotlinExtension.sourceSets.associate { it.name to it.kotlin } }, - null, name.toLowerCase() ) val sourcesJarArtifact = project.artifacts.add(Dependency.ARCHIVES_CONFIGURATION, sourcesJarTask) { sourcesJarArtifact -> diff --git a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/pm20/GradleKpmSourceArchiveTaskConfigurator.kt b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/pm20/GradleKpmSourceArchiveTaskConfigurator.kt index 524f19e2e16..fd133e0e739 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/pm20/GradleKpmSourceArchiveTaskConfigurator.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/pm20/GradleKpmSourceArchiveTaskConfigurator.kt @@ -17,12 +17,14 @@ object GradleKpmDefaultKotlinSourceArchiveTaskConfigurator : GradleKpmSourceArch override fun registerSourceArchiveTask(variant: GradleKpmVariant): TaskProvider<*> { return sourcesJarTaskNamed( taskName = variant.sourceArchiveTaskName, + componentName = variant.name, project = variant.project, sourceSets = lazy { GradleKpmFragmentSourcesProvider().getSourcesFromRefinesClosureAsMap(variant) .entries.associate { it.key.unambiguousNameInProject to it.value.get() } }, - artifactNameAppendix = variant.name + artifactNameAppendix = variant.name, + componentTypeName = "variant", ) } } diff --git a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/pm20/setupFragmentsMetadataForKpmModules.kt b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/pm20/setupFragmentsMetadataForKpmModules.kt index ea589a03457..0ca6deef5a0 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/pm20/setupFragmentsMetadataForKpmModules.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/pm20/setupFragmentsMetadataForKpmModules.kt @@ -73,9 +73,11 @@ private fun configureMetadataExposure(module: GradleKpmModule) { val sourcesArtifactAppendix = dashSeparatedName(module.moduleClassifier, "all", "sources") val sourcesArtifact = sourcesJarTaskNamed( module.disambiguateName("allSourcesJar"), + module.name, project, lazy { GradleKpmFragmentSourcesProvider().getAllFragmentSourcesAsMap(module).entries.associate { it.key.fragmentName to it.value.get() } }, - sourcesArtifactAppendix + sourcesArtifactAppendix, + "module", ) DocumentationVariantConfigurator().createSourcesElementsConfiguration( project, sourceElementsConfigurationName(module), diff --git a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/metadata/KotlinMetadataTargetConfigurator.kt b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/metadata/KotlinMetadataTargetConfigurator.kt index 4e90d1720b5..d350a6a02fe 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/metadata/KotlinMetadataTargetConfigurator.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/metadata/KotlinMetadataTargetConfigurator.kt @@ -341,7 +341,9 @@ class KotlinMetadataTargetConfigurator : project.registerTask( transformGranularMetadataTaskName(compilation.name), listOf(sourceSet) - ) { } + ) { + it.description = "Generates serialized dependencies metadata for compilation '${compilation.name}' of target '${compilation.target.name}' (for tooling)" + } compilation.compileDependencyFiles += createMetadataDependencyTransformationClasspath( project.configurations.getByName(ALL_COMPILE_METADATA_CONFIGURATION_NAME), @@ -498,11 +500,13 @@ internal class NativeSharedCompilationProcessor( internal fun Project.createGenerateProjectStructureMetadataTask(module: GradleKpmModule): TaskProvider = project.registerTask(lowerCamelCaseName("generate", module.moduleClassifier, "ProjectStructureMetadata")) { task -> task.lazyKotlinProjectStructureMetadata = lazy { buildProjectStructureMetadata(module) } + task.description = "Generates serialized project structure metadata of module '${module.name}' (for tooling)" } internal fun Project.createGenerateProjectStructureMetadataTask(): TaskProvider = project.registerTask(lowerCamelCaseName("generateProjectStructureMetadata")) { task -> task.lazyKotlinProjectStructureMetadata = lazy { project.multiplatformExtension.kotlinProjectStructureMetadata } + task.description = "Generates serialized project structure metadata of the current project (for tooling)" } internal interface ResolvedMetadataFilesProvider { diff --git a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/native/KotlinNativeTarget.kt b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/native/KotlinNativeTarget.kt index 5325762c0fc..0a15d27cf21 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/native/KotlinNativeTarget.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/native/KotlinNativeTarget.kt @@ -10,6 +10,7 @@ import org.gradle.api.NamedDomainObjectContainer import org.gradle.api.Project import org.gradle.api.artifacts.Dependency import org.gradle.api.attributes.Attribute +import org.gradle.api.plugins.BasePlugin import org.gradle.jvm.tasks.Jar import org.jetbrains.kotlin.gradle.dsl.KotlinNativeBinaryContainer import org.jetbrains.kotlin.gradle.dsl.kotlinExtension @@ -65,6 +66,8 @@ abstract class KotlinNativeTarget @Inject constructor( val hostSpecificMetadataJar = project.locateOrRegisterTask(hostSpecificMetadataJarTaskName) { metadataJar -> metadataJar.archiveAppendix.set(project.provider { disambiguationClassifier.orEmpty().toLowerCase() }) metadataJar.archiveClassifier.set("metadata") + metadataJar.group = BasePlugin.BUILD_GROUP + metadataJar.description = "Assembles Kotlin metadata of target '${name}'." val publishable = this@KotlinNativeTarget.publishable metadataJar.onlyIf { publishable } diff --git a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/native/KotlinNativeTargetConfigurator.kt b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/native/KotlinNativeTargetConfigurator.kt index 882b7aae100..2e6185436b5 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/native/KotlinNativeTargetConfigurator.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/native/KotlinNativeTargetConfigurator.kt @@ -66,8 +66,8 @@ open class KotlinNativeTargetConfigurator : AbstractKotl if (binary !is TestExecutable) { - tasks.named(binary.compilation.target.artifactsTaskName).configure { it.dependsOn(result) } - locateOrRegisterTask(LifecycleBasePlugin.ASSEMBLE_TASK_NAME).configure { it.dependsOn(result) } + tasks.named(binary.compilation.target.artifactsTaskName).dependsOn(result) + locateOrRegisterTask(LifecycleBasePlugin.ASSEMBLE_TASK_NAME).dependsOn(result) } if (binary is Framework) { @@ -254,7 +254,10 @@ open class KotlinNativeTargetConfigurator : AbstractKotl } override fun configureArchivesAndComponent(target: T): Unit = with(target.project) { - registerTask(target.artifactsTaskName) { } + registerTask(target.artifactsTaskName) { + it.group = BasePlugin.BUILD_GROUP + it.description = "Assembles outputs for target '${target.name}'." + } target.compilations.all { createKlibCompilationTask(it) } val apiElements = configurations.getByName(target.apiElementsConfigurationName) @@ -299,7 +302,10 @@ open class KotlinNativeTargetConfigurator : AbstractKotl } target.binaries.prefixGroups.all { prefixGroup -> - val linkGroupTask = project.tasks.maybeCreate(prefixGroup.linkTaskName) + val linkGroupTask = project.locateOrRegisterTask(prefixGroup.linkTaskName) { + it.group = BasePlugin.BUILD_GROUP + it.description = "Links all binaries for target '${target.name}'." + } prefixGroup.binaries.all { linkGroupTask.dependsOn(it.linkTaskName) } @@ -307,7 +313,10 @@ open class KotlinNativeTargetConfigurator : AbstractKotl // Create an aggregate link task for each compilation. target.compilations.all { - project.registerTask(it.binariesTaskName) + project.registerTask(it.binariesTaskName) { task -> + task.group = BasePlugin.BUILD_GROUP + task.description = "Links all binaries for compilation '${it.name}' of target '${it.target.name}'." + } } project.whenEvaluated { @@ -435,20 +444,14 @@ open class KotlinNativeTargetConfigurator : AbstractKotl compilation.output.classesDirs.from(compileTaskProvider.map { it.outputFile }) - project.project.tasks.named(compilation.compileAllTaskName).configure { - it.dependsOn(compileTaskProvider) - } + project.project.tasks.named(compilation.compileAllTaskName).dependsOn(compileTaskProvider) if (compilation.isMainCompilationData()) { if (compilation is KotlinNativeCompilation) { - project.project.tasks.named(compilation.target.artifactsTaskName).configure { - it.dependsOn(compileTaskProvider) - } + project.project.tasks.named(compilation.target.artifactsTaskName).dependsOn(compileTaskProvider) } - project.project.tasks.named(LifecycleBasePlugin.ASSEMBLE_TASK_NAME).configure { - it.dependsOn(compileTaskProvider) - } + project.project.tasks.named(LifecycleBasePlugin.ASSEMBLE_TASK_NAME).dependsOn(compileTaskProvider) } val shouldAddCompileOutputsToElements = compilation.owner is GradleKpmVariant || compilation.isMainCompilationData() if (shouldAddCompileOutputsToElements) { @@ -552,7 +555,10 @@ internal class GradleKpmNativeTargetConfigurator(private } private fun configureBinariesTask(target: T) { - target.project.registerTask(target.artifactsTaskName) { } + target.project.registerTask(target.artifactsTaskName) { + it.group = BasePlugin.BUILD_GROUP + it.description = "Assembles outputs for target '${target.name}'." + } } } diff --git a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/tasks/TasksProvider.kt b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/tasks/TasksProvider.kt index 7f707d394b7..0742ba7d4b1 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/tasks/TasksProvider.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/tasks/TasksProvider.kt @@ -58,6 +58,8 @@ internal fun TaskProvider<*>.dependsOn(other: TaskProvider<*>) = configure { it. internal fun TaskProvider<*>.dependsOn(other: Task) = configure { it.dependsOn(other) } +internal fun TaskProvider<*>.dependsOn(otherPath: String) = configure { it.dependsOn(otherPath) } + internal inline fun TaskCollection.withType(): TaskCollection = withType(S::class.java) /** diff --git a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/testing/internal/KotlinTestsRegistry.kt b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/testing/internal/KotlinTestsRegistry.kt index c54a8ffdc19..2c45aa83f1a 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/testing/internal/KotlinTestsRegistry.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/testing/internal/KotlinTestsRegistry.kt @@ -7,15 +7,16 @@ package org.jetbrains.kotlin.gradle.testing.internal import org.gradle.api.Project import org.gradle.api.Task +import org.gradle.api.plugins.BasePlugin import org.gradle.api.plugins.JavaBasePlugin import org.gradle.api.tasks.TaskProvider import org.gradle.api.tasks.testing.AbstractTestTask import org.gradle.language.base.plugins.LifecycleBasePlugin import org.jetbrains.kotlin.gradle.tasks.dependsOn +import org.jetbrains.kotlin.gradle.tasks.locateOrRegisterTask import org.jetbrains.kotlin.gradle.tasks.registerTask import org.jetbrains.kotlin.gradle.tasks.locateTask import org.jetbrains.kotlin.gradle.utils.getSystemProperty -import org.jetbrains.kotlin.gradle.utils.isConfigurationCacheAvailable /** * Internal service for creating aggregated test tasks and registering all test tasks. @@ -102,10 +103,12 @@ class KotlinTestsRegistry(val project: Project, val allTestsTaskName: String = " private val Project.cleanAllTestTask: TaskProvider<*> get() { val taskName = cleanTaskName(allTestsTask.name) - return project.locateTask(taskName) - ?: project.registerTask(taskName).also { cleanAllTest -> - tasks.named(LifecycleBasePlugin.CLEAN_TASK_NAME).dependsOn(cleanAllTest) - } + return project.locateOrRegisterTask(taskName) { cleanAllTest -> + cleanAllTest.group = BasePlugin.BUILD_GROUP + cleanAllTest.description = "Deletes all the test results." + }.also { cleanAllTest -> + tasks.named(LifecycleBasePlugin.CLEAN_TASK_NAME).dependsOn(cleanAllTest) + } } companion object {