[Gradle] Add 'validatePlugins' tasks for Gradle plugin dependencies

Gradle 8 has removed "validate-external-gradle-plugin" plugin which we
used before to run validate task inputs proper annotations.

With this change, every Gradle dependency that is not published as a
Gradle plugin but uses Gradle API types is also running
'validatedPlugins' task registered manually via a build script.

^KT-59827 Fixed
This commit is contained in:
Yahor Berdnikau
2023-07-13 20:45:20 +02:00
committed by Space Team
parent f5889bcc6c
commit dc5660d98c
51 changed files with 143 additions and 88 deletions
+1
View File
@@ -400,6 +400,7 @@ val gradlePluginProjects = listOf(
":kotlin-gradle-plugin-idea",
":kotlin-gradle-plugin-idea-proto",
":kotlin-gradle-plugin-kpm-android",
":kotlin-gradle-plugin-model",
":kotlin-gradle-plugin-tcs-android",
":kotlin-allopen",
":kotlin-noarg",
@@ -566,11 +566,6 @@ public final class org/jetbrains/kotlin/gradle/dsl/jvm/JvmTargetValidationMode :
public static fun values ()[Lorg/jetbrains/kotlin/gradle/dsl/jvm/JvmTargetValidationMode;
}
public abstract class org/jetbrains/kotlin/gradle/plugin/AbstractCompileWithDependenciesTracking : org/gradle/api/tasks/compile/AbstractCompile {
public fun <init> ()V
public fun isDependentTaskOutOfDate (Lorg/gradle/api/Task;)Z
}
public abstract interface class org/jetbrains/kotlin/gradle/plugin/CInteropSettings : org/gradle/api/Named {
public abstract fun compilerOpts (Ljava/util/List;)V
public abstract fun compilerOpts ([Ljava/lang/String;)V
@@ -1,9 +0,0 @@
package org.jetbrains.kotlin.gradle.plugin
import org.gradle.api.Task
import org.gradle.api.tasks.compile.AbstractCompile
abstract class AbstractCompileWithDependenciesTracking : AbstractCompile() {
open fun isDependentTaskOutOfDate(task: Task): Boolean = false
}
@@ -11,6 +11,7 @@ interface IncrementalSyncTask : Task {
@get:InputFiles
@get:NormalizeLineEndings
@get:IgnoreEmptyDirectories
@get:PathSensitive(PathSensitivity.ABSOLUTE)
@get:SkipWhenEmpty
val from: ConfigurableFileCollection
@@ -247,28 +247,6 @@ class SimpleKotlinGradleIT : KGPBaseTest() {
}
}
@DisplayName("Validate Gradle plugins inputs")
// TODO(Dmitrii Krasnov): validate-external-gradle-plugin has been removed in Gradle 8.0,
// so this test should be removed after correct configuring k-g-p and k-g-p-api tasks
@GradleTestVersions(
minVersion = TestVersions.Gradle.G_7_6,
maxVersion = TestVersions.Gradle.G_7_6
) // Always should use only latest Gradle version
@GradleTest
internal fun validatePluginInputs(gradleVersion: GradleVersion) {
project("kotlinProject", gradleVersion) {
buildGradle.modify {
"""
plugins {
id "validate-external-gradle-plugin"
${it.substringAfter("plugins {")}
""".trimIndent()
}
build("validateExternalPlugins")
}
}
@DisplayName("Accessing Kotlin SourceSet in KotlinDSL")
@GradleTestVersions(maxVersion = TestVersions.Gradle.G_7_1)
@GradleTest
@@ -207,6 +207,7 @@ class Kapt3AndroidIT : Kapt3BaseIT() {
this.argsFile = argsFile
}
@PathSensitive(PathSensitivity.RELATIVE)
@InputFile
File inputFile = null
@@ -170,11 +170,6 @@ tasks {
}
}
withType<ValidatePlugins>().configureEach {
failOnWarning.set(true)
enableStricterValidation.set(true)
}
withType<ShadowJar>().configureEach {
relocate("com.github.gundy", "$kotlinEmbeddableRootPackage.com.github.gundy")
relocate("de.undercouch.gradle.tasks.download", "$kotlinEmbeddableRootPackage.de.undercouch.gradle.tasks.download")
@@ -187,9 +182,12 @@ tasks {
}
}
projectTest {
dependsOn(tasks.named("validatePlugins"))
tasks.named("validatePlugins") {
// We're manually registering and wiring validation tasks for each plugin variant
enabled = false
}
projectTest {
workingDir = rootDir
}
@@ -12,6 +12,7 @@ import org.gradle.api.provider.ListProperty
import org.gradle.api.provider.MapProperty
import org.gradle.api.provider.Property
import org.gradle.api.provider.ProviderFactory
import org.gradle.api.tasks.CacheableTask
import org.gradle.api.tasks.Input
import org.gradle.api.tasks.Internal
import org.gradle.api.tasks.TaskAction
@@ -35,6 +36,7 @@ import java.net.URL
import java.net.URLClassLoader
import javax.inject.Inject
@CacheableTask
abstract class KaptWithoutKotlincTask @Inject constructor(
objectFactory: ObjectFactory,
private val providerFactory: ProviderFactory,
@@ -8,13 +8,12 @@ package org.jetbrains.kotlin.gradle.plugin
import org.gradle.api.DefaultTask
import org.gradle.api.Project
import org.gradle.api.file.Directory
import org.gradle.api.file.FileCollection
import org.gradle.api.file.SourceDirectorySet
import org.gradle.api.logging.Logging
import org.gradle.api.provider.Property
import org.gradle.api.tasks.SourceSet
import org.gradle.api.tasks.TaskProvider
import org.gradle.api.tasks.bundling.Jar
import org.gradle.work.DisableCachingByDefault
import org.jetbrains.kotlin.gradle.plugin.mpp.KotlinJvmCompilation
import org.jetbrains.kotlin.gradle.plugin.mpp.KotlinWithJavaCompilation
import org.jetbrains.kotlin.gradle.tasks.AbstractKotlinCompile
@@ -116,6 +115,7 @@ internal abstract class KotlinSourceSetProcessor<T : AbstractKotlinCompile<*>>(
private fun createAdditionalClassesTaskForIdeRunner() {
val kotlinCompilation = compilationInfo.tcsOrNull?.compilation ?: return
@DisableCachingByDefault(because = "Marker task for IDE sync")
open class IDEClassesTask : DefaultTask()
// Workaround: as per KT-26641, when there's a Kotlin compilation with a Java source set, we create another task
// that has a name composed as '<IDE module name>Classes`, where the IDE module name is the default source set name:
@@ -10,6 +10,7 @@ import org.gradle.api.DefaultTask
import org.gradle.api.Project
import org.gradle.api.tasks.TaskAction
import org.gradle.api.tasks.TaskProvider
import org.gradle.work.DisableCachingByDefault
import org.jetbrains.kotlin.gradle.dsl.kotlinExtension
import org.jetbrains.kotlin.gradle.idea.tcs.IdeaKotlinDependencyCoordinates
import org.jetbrains.kotlin.gradle.tasks.locateOrRegisterTask
@@ -32,6 +33,7 @@ internal fun Project.locateOrRegisterIdeResolveDependenciesTask(): TaskProvider<
* This will invoke the [IdeMultiplatformImport] to resolve all dependencies (like the IDE would).
* Outputs are written as json and protobufs
*/
@DisableCachingByDefault(because = "Used for debugging/diagnostic purpose.")
internal open class IdeResolveDependenciesTask : DefaultTask() {
@TaskAction
@@ -95,6 +95,7 @@ open class MetadataDependencyTransformationTask
.fileProperty()
.apply { set(outputsDir.resolve("${kotlinSourceSet.name}.visibleSourceSets")) }
@get:PathSensitive(PathSensitivity.RELATIVE)
@get:InputFiles
protected val parentVisibleSourceSetFiles: FileCollection = project.filesProvider {
parentTransformationTasks.map { taskProvider ->
@@ -104,6 +105,7 @@ open class MetadataDependencyTransformationTask
}
}
@get:PathSensitive(PathSensitivity.RELATIVE)
@get:InputFiles
protected val parentTransformedLibraries: FileCollection = project.filesProvider {
parentTransformationTasks.map { taskProvider ->
@@ -229,9 +229,11 @@ internal abstract class FrameworkCopy : DefaultTask() {
@get:Inject
abstract val execOperations: ExecOperations
@get:PathSensitive(PathSensitivity.ABSOLUTE)
@get:InputDirectory
abstract val sourceFramework: DirectoryProperty
@get:PathSensitive(PathSensitivity.ABSOLUTE)
@get:InputFiles
@get:IgnoreEmptyDirectories
protected val sourceDsym = sourceFramework.mapToFile().map { File(it.path + ".dSYM") }
@@ -12,6 +12,7 @@ import org.gradle.api.file.ProjectLayout
import org.gradle.api.provider.Provider
import org.gradle.api.tasks.*
import org.gradle.process.ExecOperations
import org.gradle.work.DisableCachingByDefault
import org.jetbrains.kotlin.gradle.plugin.cocoapods.asValidFrameworkName
import org.jetbrains.kotlin.gradle.plugin.diagnostics.KotlinToolingDiagnostics
import org.jetbrains.kotlin.gradle.plugin.diagnostics.UsesKotlinToolingDiagnostics
@@ -144,6 +145,7 @@ private fun Project.registerAssembleFatForXCFrameworkTask(
}
}
@DisableCachingByDefault
abstract class XCFrameworkTask
@Inject
internal constructor(
@@ -42,6 +42,7 @@ internal abstract class XcodeVersionTask : DefaultTask() {
}
}
@get:PathSensitive(PathSensitivity.ABSOLUTE)
@get:InputFiles // @InputFiles instead of @InputFile because it allows non-existing files
abstract val xcodeSelectLink: ConfigurableFileCollection
@@ -11,6 +11,7 @@ import org.gradle.api.Plugin
import org.gradle.api.Project
import org.gradle.api.artifacts.Configuration
import org.gradle.api.artifacts.dsl.DependencyHandler
import org.gradle.api.artifacts.transform.CacheableTransform
import org.gradle.api.artifacts.transform.InputArtifact
import org.gradle.api.artifacts.transform.TransformAction
import org.gradle.api.artifacts.transform.TransformOutputs
@@ -18,6 +19,7 @@ import org.gradle.api.artifacts.transform.TransformParameters
import org.gradle.api.attributes.Attribute
import org.gradle.api.file.FileSystemLocation
import org.gradle.api.provider.Provider
import org.gradle.api.tasks.Classpath
import org.gradle.work.NormalizeLineEndings
import org.jetbrains.kotlin.cli.common.messages.MessageRenderer
import org.jetbrains.kotlin.cli.common.messages.PrintingMessageCollector
@@ -115,7 +117,9 @@ private fun configureDiscoveryTransformation(
project.dependencies.registerOnceDiscoverScriptExtensionsTransform()
}
@CacheableTransform
internal abstract class DiscoverScriptExtensionsTransformAction : TransformAction<TransformParameters.None> {
@get:Classpath
@get:InputArtifact
@get:NormalizeLineEndings
abstract val inputArtifact: Provider<FileSystemLocation>
@@ -7,12 +7,14 @@ package org.jetbrains.kotlin.gradle.targets.js.binaryen
import org.gradle.api.file.RegularFileProperty
import org.gradle.api.tasks.*
import org.gradle.work.DisableCachingByDefault
import org.gradle.work.NormalizeLineEndings
import org.jetbrains.kotlin.gradle.plugin.mpp.KotlinJsCompilation
import org.jetbrains.kotlin.gradle.tasks.registerTask
import org.jetbrains.kotlin.gradle.utils.newFileProperty
import javax.inject.Inject
@DisableCachingByDefault
open class BinaryenExec
@Inject
constructor() : AbstractExecTask<BinaryenExec>(BinaryenExec::class.java) {
@@ -62,6 +64,7 @@ constructor() : AbstractExecTask<BinaryenExec>(BinaryenExec::class.java) {
"-Oz",
)
@PathSensitive(PathSensitivity.RELATIVE)
@InputFile
@NormalizeLineEndings
val inputFileProperty: RegularFileProperty = project.newFileProperty()
@@ -7,6 +7,7 @@ package org.jetbrains.kotlin.gradle.targets.js.d8
import org.gradle.api.file.RegularFileProperty
import org.gradle.api.tasks.*
import org.gradle.work.DisableCachingByDefault
import org.gradle.work.NormalizeLineEndings
import org.jetbrains.kotlin.gradle.plugin.KotlinPlatformType
import org.jetbrains.kotlin.gradle.plugin.mpp.KotlinJsCompilation
@@ -14,6 +15,7 @@ import org.jetbrains.kotlin.gradle.targets.js.addWasmExperimentalArguments
import org.jetbrains.kotlin.gradle.tasks.registerTask
import org.jetbrains.kotlin.gradle.utils.newFileProperty
@DisableCachingByDefault
open class D8Exec : AbstractExecTask<D8Exec>(D8Exec::class.java) {
init {
onlyIf {
@@ -7,6 +7,7 @@ package org.jetbrains.kotlin.gradle.targets.js.nodejs
import org.gradle.api.file.RegularFileProperty
import org.gradle.api.tasks.*
import org.gradle.work.DisableCachingByDefault
import org.gradle.work.NormalizeLineEndings
import org.jetbrains.kotlin.gradle.plugin.KotlinPlatformType
import org.jetbrains.kotlin.gradle.plugin.mpp.KotlinJsCompilation
@@ -19,6 +20,7 @@ import org.jetbrains.kotlin.gradle.tasks.registerTask
import org.jetbrains.kotlin.gradle.utils.newFileProperty
import javax.inject.Inject
@DisableCachingByDefault
open class NodeJsExec
@Inject
constructor(
@@ -8,6 +8,7 @@ import org.gradle.api.model.ObjectFactory
import org.gradle.api.provider.Provider
import org.gradle.api.tasks.*
import org.gradle.internal.hash.FileHasher
import org.gradle.work.DisableCachingByDefault
import org.jetbrains.kotlin.gradle.logging.kotlinInfo
import org.jetbrains.kotlin.gradle.plugin.statistics.KotlinBuildStatsService
import org.jetbrains.kotlin.gradle.targets.js.nodejs.NodeJsRootPlugin.Companion.kotlinNodeJsExtension
@@ -20,6 +21,7 @@ import java.nio.file.Path
import java.nio.file.Paths
import javax.inject.Inject
@DisableCachingByDefault
abstract class NodeJsSetupTask : DefaultTask() {
@Transient
private val settings = project.rootProject.kotlinNodeJsExtension
@@ -11,10 +11,12 @@ import org.gradle.api.tasks.Input
import org.gradle.api.tasks.Internal
import org.gradle.api.tasks.OutputFile
import org.gradle.api.tasks.TaskAction
import org.gradle.work.DisableCachingByDefault
import org.jetbrains.kotlin.gradle.targets.js.npm.NpmProject.Companion.PACKAGE_JSON
import org.jetbrains.kotlin.gradle.utils.property
import java.io.File
@DisableCachingByDefault
abstract class PublicPackageJsonTask :
DefaultTask(),
UsesKotlinNpmResolutionManager {
@@ -8,9 +8,11 @@ package org.jetbrains.kotlin.gradle.targets.js.npm.tasks
import org.gradle.api.DefaultTask
import org.gradle.api.tasks.TaskAction
import org.gradle.internal.hash.FileHasher
import org.gradle.work.DisableCachingByDefault
import org.jetbrains.kotlin.gradle.targets.js.npm.UsesGradleNodeModulesCache
import javax.inject.Inject
@DisableCachingByDefault
abstract class KotlinNpmCachesSetup :
DefaultTask(),
UsesGradleNodeModulesCache {
@@ -7,6 +7,7 @@ package org.jetbrains.kotlin.gradle.targets.js.npm.tasks
import org.gradle.api.DefaultTask
import org.gradle.api.tasks.*
import org.gradle.work.DisableCachingByDefault
import org.gradle.work.NormalizeLineEndings
import org.jetbrains.kotlin.gradle.targets.js.nodejs.NodeJsRootExtension
import org.jetbrains.kotlin.gradle.targets.js.nodejs.NodeJsRootPlugin.Companion.kotlinNodeJsExtension
@@ -18,6 +19,7 @@ import org.jetbrains.kotlin.gradle.targets.js.npm.resolver.KotlinRootNpmResolver
import org.jetbrains.kotlin.gradle.targets.js.yarn.yarn
import java.io.File
@DisableCachingByDefault
abstract class KotlinNpmInstallTask :
DefaultTask(),
UsesKotlinNpmResolutionManager {
@@ -9,6 +9,7 @@ import org.gradle.api.DefaultTask
import org.gradle.api.artifacts.component.ProjectComponentIdentifier
import org.gradle.api.provider.Property
import org.gradle.api.tasks.*
import org.gradle.work.DisableCachingByDefault
import org.gradle.work.NormalizeLineEndings
import org.jetbrains.kotlin.gradle.plugin.mpp.KotlinJsCompilation
import org.jetbrains.kotlin.gradle.targets.js.nodejs.NodeJsRootExtension
@@ -22,6 +23,7 @@ import org.jetbrains.kotlin.gradle.utils.CompositeProjectComponentArtifactMetada
import org.jetbrains.kotlin.gradle.utils.`is`
import java.io.File
@DisableCachingByDefault
abstract class KotlinPackageJsonTask :
DefaultTask(),
UsesKotlinNpmResolutionManager,
@@ -7,6 +7,7 @@ package org.jetbrains.kotlin.gradle.targets.js.npm.tasks
import org.gradle.api.DefaultTask
import org.gradle.api.tasks.*
import org.gradle.work.DisableCachingByDefault
import org.gradle.work.NormalizeLineEndings
import org.jetbrains.kotlin.gradle.targets.js.nodejs.NodeJsRootPlugin.Companion.kotlinNodeJsExtension
import org.jetbrains.kotlin.gradle.targets.js.npm.*
@@ -14,6 +15,7 @@ import org.jetbrains.kotlin.gradle.targets.js.npm.resolver.KotlinRootNpmResolver
import org.jetbrains.kotlin.gradle.targets.js.yarn.yarn
import java.io.File
@DisableCachingByDefault
abstract class RootPackageJsonTask :
DefaultTask(),
UsesKotlinNpmResolutionManager {
@@ -11,6 +11,7 @@ import org.gradle.api.file.FileCollection
import org.gradle.api.file.RegularFileProperty
import org.gradle.api.tasks.*
import org.gradle.process.internal.DefaultProcessForkOptions
import org.gradle.work.DisableCachingByDefault
import org.gradle.work.NormalizeLineEndings
import org.jetbrains.kotlin.gradle.internal.testing.TCServiceMessagesTestExecutionSpec
import org.jetbrains.kotlin.gradle.plugin.mpp.KotlinJsCompilation
@@ -27,6 +28,7 @@ import org.jetbrains.kotlin.gradle.utils.getValue
import org.jetbrains.kotlin.gradle.utils.newFileProperty
import javax.inject.Inject
@DisableCachingByDefault
abstract class KotlinJsTest
@Inject
constructor(
@@ -9,6 +9,7 @@ import org.gradle.api.DefaultTask
import org.gradle.api.file.DirectoryProperty
import org.gradle.api.provider.Property
import org.gradle.api.tasks.*
import org.gradle.work.DisableCachingByDefault
import org.gradle.work.NormalizeLineEndings
import org.jetbrains.kotlin.gradle.internal.execWithProgress
import org.jetbrains.kotlin.gradle.plugin.mpp.KotlinJsCompilation
@@ -19,6 +20,7 @@ import org.jetbrains.kotlin.gradle.targets.js.npm.RequiresNpmDependencies
import org.jetbrains.kotlin.gradle.targets.js.npm.npmProject
import javax.inject.Inject
@DisableCachingByDefault
abstract class TypeScriptValidationTask
@Inject
constructor(
@@ -12,11 +12,13 @@ import org.gradle.api.file.RegularFileProperty
import org.gradle.api.provider.Property
import org.gradle.api.provider.Provider
import org.gradle.api.tasks.*
import org.gradle.work.DisableCachingByDefault
import org.gradle.work.NormalizeLineEndings
import org.jetbrains.kotlin.gradle.utils.contentEquals
import java.io.File
import javax.inject.Inject
@DisableCachingByDefault
abstract class YarnLockCopyTask : DefaultTask() {
@get:NormalizeLineEndings
@@ -56,6 +58,7 @@ abstract class YarnLockCopyTask : DefaultTask() {
}
}
@DisableCachingByDefault
abstract class YarnLockStoreTask : YarnLockCopyTask() {
@Input
lateinit var yarnLockMismatchReport: Provider<YarnLockMismatchReport>
@@ -12,6 +12,7 @@ import org.gradle.api.file.FileSystemOperations
import org.gradle.api.provider.Provider
import org.gradle.api.tasks.*
import org.gradle.internal.hash.FileHasher
import org.gradle.work.DisableCachingByDefault
import org.jetbrains.kotlin.gradle.logging.kotlinInfo
import org.jetbrains.kotlin.gradle.plugin.statistics.KotlinBuildStatsService
import org.jetbrains.kotlin.gradle.targets.js.extractWithUpToDate
@@ -21,6 +22,7 @@ import java.io.File
import java.net.URI
import javax.inject.Inject
@DisableCachingByDefault
abstract class YarnSetupTask : DefaultTask() {
@Transient
private val settings = project.yarn
@@ -7,6 +7,7 @@ import org.gradle.api.provider.Provider
import org.gradle.api.tasks.JavaExec
import org.gradle.api.tasks.TaskProvider
import org.gradle.jvm.toolchain.JavaToolchainService
import org.gradle.work.DisableCachingByDefault
import org.jetbrains.kotlin.gradle.ExperimentalKotlinGradlePluginApi
import org.jetbrains.kotlin.gradle.InternalKotlinGradlePluginApi
import org.jetbrains.kotlin.gradle.plugin.KotlinCompilation
@@ -41,6 +42,7 @@ import org.jetbrains.kotlin.tooling.core.UnsafeApi
* ```
*/
@InternalKotlinGradlePluginApi
@DisableCachingByDefault
open class KotlinJvmRun : JavaExec()
@ExperimentalKotlinGradlePluginApi
@@ -10,6 +10,7 @@ package org.jetbrains.kotlin.gradle.targets.native.tasks
import org.gradle.api.provider.Property
import org.gradle.api.provider.Provider
import org.gradle.api.tasks.*
import org.gradle.work.DisableCachingByDefault
import org.jetbrains.kotlin.gradle.utils.onlyIfCompat
import org.jetbrains.kotlin.gradle.utils.runCommand
import java.io.File
@@ -20,12 +21,14 @@ import java.io.IOException
* to obtain sources or artifacts for the declared dependencies.
* This task is a part of CocoaPods integration infrastructure.
*/
@DisableCachingByDefault(because = "Abstract super-class, not to be instantiated directly")
abstract class AbstractPodInstallTask : CocoapodsTask() {
init {
onlyIfCompat("Podfile location is set") { podfile.isPresent }
}
@get:Optional
@get:PathSensitive(PathSensitivity.RELATIVE)
@get:InputFile
abstract val podfile: Property<File?>
@@ -8,12 +8,14 @@
package org.jetbrains.kotlin.gradle.targets.native.tasks
import org.gradle.api.DefaultTask
import org.gradle.work.DisableCachingByDefault
import org.jetbrains.kotlin.gradle.plugin.cocoapods.CocoapodsExtension.CocoapodsDependency
import org.jetbrains.kotlin.konan.target.HostManager
val CocoapodsDependency.schemeName: String
get() = name.split("/")[0]
@DisableCachingByDefault(because = "Abstract super-class, not to be instantiated directly")
open class CocoapodsTask : DefaultTask() {
init {
onlyIf {
@@ -13,6 +13,7 @@ import org.gradle.api.provider.Property
import org.gradle.api.provider.Provider
import org.gradle.api.provider.ProviderFactory
import org.gradle.api.tasks.*
import org.gradle.work.DisableCachingByDefault
import org.jetbrains.kotlin.gradle.plugin.cocoapods.CocoapodsExtension.*
import org.jetbrains.kotlin.gradle.plugin.cocoapods.CocoapodsExtension.CocoapodsDependency.PodLocation.*
import org.jetbrains.kotlin.gradle.plugin.cocoapods.cocoapodsBuildDirs
@@ -24,12 +25,14 @@ import javax.inject.Inject
/**
* The task compiles external cocoa pods sources.
*/
@DisableCachingByDefault
abstract class PodBuildTask @Inject constructor(
providerFactory: ProviderFactory,
projectLayout: ProjectLayout,
objectFactory: ObjectFactory,
) : CocoapodsTask() {
@get:PathSensitive(PathSensitivity.RELATIVE)
@get:InputFile
abstract val buildSettingsFile: RegularFileProperty
@@ -44,6 +47,7 @@ abstract class PodBuildTask @Inject constructor(
private val synthetic = projectLayout.cocoapodsBuildDirs.synthetic(family)
@get:PathSensitive(PathSensitivity.RELATIVE)
@get:IgnoreEmptyDirectories
@get:InputDirectory
internal val srcDir: Provider<Directory> = pod.flatMap { pod ->
@@ -13,6 +13,7 @@ import org.gradle.api.provider.ListProperty
import org.gradle.api.provider.Property
import org.gradle.api.provider.Provider
import org.gradle.api.tasks.*
import org.gradle.work.DisableCachingByDefault
import org.jetbrains.kotlin.gradle.plugin.cocoapods.CocoapodsExtension.*
import org.jetbrains.kotlin.gradle.plugin.cocoapods.cocoapodsBuildDirs
import org.jetbrains.kotlin.gradle.plugin.cocoapods.platformLiteral
@@ -25,6 +26,7 @@ import javax.inject.Inject
/**
* The task generates a synthetic project with all cocoapods dependencies
*/
@DisableCachingByDefault
abstract class PodGenTask @Inject constructor(projectLayout: ProjectLayout) : CocoapodsTask() {
init {
@@ -33,6 +35,7 @@ abstract class PodGenTask @Inject constructor(projectLayout: ProjectLayout) : Co
}
}
@get:PathSensitive(PathSensitivity.RELATIVE)
@get:InputFile
internal abstract val podspec: Property<File>
@@ -51,6 +54,7 @@ abstract class PodGenTask @Inject constructor(projectLayout: ProjectLayout) : Co
@get:Nested
internal abstract val pods: ListProperty<CocoapodsDependency>
@get:PathSensitive(PathSensitivity.RELATIVE)
@get:Optional
@get:InputFile
internal abstract val xcodeVersion: RegularFileProperty
@@ -11,10 +11,12 @@ import org.gradle.api.provider.Property
import org.gradle.api.provider.Provider
import org.gradle.api.tasks.Input
import org.gradle.api.tasks.OutputDirectory
import org.gradle.work.DisableCachingByDefault
import org.jetbrains.kotlin.gradle.plugin.cocoapods.platformLiteral
import org.jetbrains.kotlin.konan.target.Family
import java.io.File
@DisableCachingByDefault
abstract class PodInstallSyntheticTask : AbstractPodInstallTask() {
@get:Input
@@ -10,14 +10,17 @@ package org.jetbrains.kotlin.gradle.targets.native.tasks
import org.gradle.api.provider.ListProperty
import org.gradle.api.provider.Property
import org.gradle.api.tasks.*
import org.gradle.work.DisableCachingByDefault
import org.jetbrains.kotlin.gradle.plugin.cocoapods.CocoapodsExtension.CocoapodsDependency
import org.jetbrains.kotlin.gradle.plugin.cocoapods.CocoapodsExtension.SpecRepos
import org.jetbrains.kotlin.gradle.targets.native.cocoapods.MissingCocoapodsMessage
import org.jetbrains.kotlin.gradle.targets.native.cocoapods.MissingSpecReposMessage
import java.io.File
@DisableCachingByDefault
abstract class PodInstallTask : AbstractPodInstallTask() {
@get:PathSensitive(PathSensitivity.RELATIVE)
@get:Optional
@get:InputFile
abstract val podspec: Property<File?>
@@ -12,6 +12,7 @@ import org.gradle.api.file.RegularFile
import org.gradle.api.provider.Property
import org.gradle.api.provider.Provider
import org.gradle.api.tasks.*
import org.gradle.work.DisableCachingByDefault
import org.jetbrains.kotlin.gradle.plugin.cocoapods.CocoapodsExtension.CocoapodsDependency
import org.jetbrains.kotlin.gradle.plugin.cocoapods.cocoapodsBuildDirs
import org.jetbrains.kotlin.gradle.utils.getFile
@@ -19,6 +20,7 @@ import org.jetbrains.kotlin.gradle.utils.runCommand
import java.io.File
import javax.inject.Inject
@DisableCachingByDefault
abstract class PodSetupBuildTask @Inject constructor(projectLayout: ProjectLayout) : CocoapodsTask() {
@get:Input
@@ -8,6 +8,7 @@ package org.jetbrains.kotlin.gradle.targets.native.internal
import org.gradle.api.DefaultTask
import org.gradle.api.file.FileCollection
import org.gradle.api.tasks.OutputDirectory
import org.gradle.work.DisableCachingByDefault
import org.jetbrains.kotlin.commonizer.CommonizerOutputFileLayout
import org.jetbrains.kotlin.commonizer.CommonizerOutputFileLayout.base64Hash
import org.jetbrains.kotlin.commonizer.CommonizerOutputFileLayout.ensureMaxFileNameLength
@@ -17,6 +18,7 @@ import org.jetbrains.kotlin.gradle.utils.future
import org.jetbrains.kotlin.gradle.utils.outputFilesProvider
import java.io.File
@DisableCachingByDefault(because = "Abstract super-class, not to be instantiated directly")
internal abstract class AbstractCInteropCommonizerTask : DefaultTask() {
@get:OutputDirectory
abstract val outputDirectory: File
@@ -12,6 +12,7 @@ import org.gradle.api.file.FileTree
import org.gradle.api.model.ObjectFactory
import org.gradle.api.tasks.*
import org.gradle.process.ExecOperations
import org.gradle.work.DisableCachingByDefault
import org.jetbrains.kotlin.gradle.plugin.cocoapods.asValidFrameworkName
import org.jetbrains.kotlin.gradle.plugin.mpp.Framework
import org.jetbrains.kotlin.gradle.plugin.mpp.KotlinNativeTarget
@@ -115,6 +116,7 @@ class FrameworkDescriptor(
/**
* Task running lipo to create a fat framework from several simple frameworks. It also merges headers, plists and module files.
*/
@DisableCachingByDefault
open class FatFrameworkTask
@Inject
internal constructor(
@@ -8,6 +8,7 @@ package org.jetbrains.kotlin.gradle.targets.native.tasks
import org.gradle.api.DefaultTask
import org.gradle.api.Task
import org.gradle.api.tasks.*
import org.gradle.work.DisableCachingByDefault
import org.jetbrains.kotlin.gradle.plugin.KotlinCompilation
import org.jetbrains.kotlin.gradle.plugin.mpp.NativeBinary
import org.jetbrains.kotlin.gradle.plugin.performance.PerformanceExtension
@@ -18,6 +19,7 @@ import java.io.File
/**
* The task generates performance report for Kotlin/Native binary.
*/
@DisableCachingByDefault
open class NativePerformanceReport : DefaultTask() {
@Internal
lateinit var binary: NativeBinary
@@ -21,6 +21,7 @@ import org.gradle.api.provider.Provider
import org.gradle.api.provider.ProviderFactory
import org.gradle.api.tasks.*
import org.gradle.process.ExecOperations
import org.gradle.work.DisableCachingByDefault
import org.gradle.work.NormalizeLineEndings
import org.jetbrains.kotlin.cli.common.arguments.*
import org.jetbrains.kotlin.compilerRunner.*
@@ -120,6 +121,7 @@ internal fun Collection<File>.filterKlibsPassedToCompiler(): List<File> = filter
internal fun FileCollection.filterKlibsPassedToCompiler(): FileCollection = filter(File::canKlibBePassedToCompiler)
// endregion
@DisableCachingByDefault(because = "Abstract super-class, not to be instantiated directly")
abstract class AbstractKotlinNativeCompile<
T : KotlinCommonToolOptions,
M : CommonToolArguments
@@ -15,6 +15,7 @@ import org.gradle.api.tasks.*
import org.gradle.api.tasks.options.Option
import org.gradle.process.ProcessForkOptions
import org.gradle.process.internal.DefaultProcessForkOptions
import org.gradle.work.DisableCachingByDefault
import org.gradle.work.NormalizeLineEndings
import org.jetbrains.kotlin.gradle.internal.testing.TCServiceMessagesClientSettings
import org.jetbrains.kotlin.gradle.internal.testing.TCServiceMessagesTestExecutionSpec
@@ -26,6 +27,7 @@ import java.io.File
import java.util.concurrent.Callable
import javax.inject.Inject
@DisableCachingByDefault(because = "Abstract super-class, not to be instantiated directly")
abstract class KotlinNativeTest : KotlinTest() {
@get:Inject
abstract val providerFactory: ProviderFactory
@@ -198,6 +200,7 @@ abstract class KotlinNativeTest : KotlinTest() {
/**
* A task running Kotlin/Native tests on a host machine.
*/
@DisableCachingByDefault
abstract class KotlinNativeHostTest : KotlinNativeTest() {
@get:Internal
override val testCommand: TestCommand = object : TestCommand() {
@@ -217,6 +220,7 @@ abstract class KotlinNativeHostTest : KotlinNativeTest() {
/**
* A task running Kotlin/Native tests on a simulator (iOS/watchOS/tvOS).
*/
@DisableCachingByDefault
abstract class KotlinNativeSimulatorTest : KotlinNativeTest() {
@Deprecated("Use the property 'device' instead")
@get:Internal
@@ -19,6 +19,7 @@ import org.gradle.api.provider.Property
import org.gradle.api.provider.Provider
import org.gradle.api.tasks.*
import org.gradle.process.ExecOperations
import org.gradle.work.DisableCachingByDefault
import org.jetbrains.kotlin.compilerRunner.KotlinNativeCompilerRunner
import org.jetbrains.kotlin.compilerRunner.KotlinToolRunner
import org.jetbrains.kotlin.gradle.dsl.*
@@ -35,6 +36,7 @@ import org.jetbrains.kotlin.konan.util.visibleName
import java.io.File
import javax.inject.Inject
@DisableCachingByDefault
@Suppress("LeakingThis")
abstract class KotlinNativeLinkArtifactTask @Inject constructor(
@get:Input val konanTarget: KonanTarget,
@@ -93,6 +95,7 @@ abstract class KotlinNativeLinkArtifactTask @Inject constructor(
@get:Input
abstract val binaryOptions: MapProperty<String, String>
@get:PathSensitive(PathSensitivity.RELATIVE)
@get:Optional
@get:InputFile
abstract val xcodeVersion: RegularFileProperty
@@ -15,10 +15,7 @@ import org.gradle.api.provider.Property
import org.gradle.api.provider.Provider
import org.gradle.api.provider.SetProperty
import org.gradle.api.tasks.*
import org.gradle.work.ChangeType
import org.gradle.work.Incremental
import org.gradle.work.InputChanges
import org.gradle.work.NormalizeLineEndings
import org.gradle.work.*
import org.gradle.workers.WorkerExecutor
import org.jetbrains.kotlin.build.report.metrics.BuildPerformanceMetric
import org.jetbrains.kotlin.build.report.metrics.BuildTime
@@ -52,6 +49,7 @@ import java.io.File
import javax.inject.Inject
import org.jetbrains.kotlin.gradle.tasks.cleanOutputsAndLocalState as cleanOutputsAndLocalStateUtil
@DisableCachingByDefault(because = "Abstract super-class, not to be instantiated directly")
abstract class AbstractKotlinCompile<T : CommonCompilerArguments> @Inject constructor(
objectFactory: ObjectFactory,
workerExecutor: WorkerExecutor
@@ -17,6 +17,7 @@ import org.gradle.api.tasks.Classpath
import org.gradle.api.tasks.Internal
import org.gradle.api.tasks.util.PatternFilterable
import org.gradle.api.tasks.util.PatternSet
import org.gradle.work.DisableCachingByDefault
import org.jetbrains.kotlin.build.DEFAULT_KOTLIN_SOURCE_FILES_EXTENSIONS
import org.jetbrains.kotlin.build.report.metrics.BuildMetricsReporter
import org.jetbrains.kotlin.build.report.metrics.BuildMetricsReporterImpl
@@ -28,6 +29,7 @@ import org.jetbrains.kotlin.gradle.utils.fileExtensionCasePermutations
import org.jetbrains.kotlin.gradle.utils.property
import javax.inject.Inject
@DisableCachingByDefault(because = "Abstract super-class, not to be instantiated directly")
abstract class AbstractKotlinCompileTool<T : CommonToolArguments> @Inject constructor(
objectFactory: ObjectFactory,
) : DefaultTask(),
@@ -9,6 +9,7 @@ import org.gradle.api.DefaultTask
import org.gradle.api.provider.Provider
import org.gradle.api.tasks.Input
import org.gradle.api.tasks.TaskAction
import org.gradle.work.DisableCachingByDefault
import org.jetbrains.kotlin.gradle.tasks.internal.CleanableStore
import java.time.Duration
import java.time.Instant
@@ -16,6 +17,7 @@ import java.time.Instant
/**
* Task to clean all old unused loaded files from registered stores in [CleanableStore].
*/
@DisableCachingByDefault
open class CleanDataTask : DefaultTask() {
/**
@@ -1,39 +0,0 @@
/*
* Copyright 2010-2020 JetBrains s.r.o. and Kotlin Programming Language contributors.
* Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file.
*/
package org.jetbrains.kotlin.gradle.tasks
import org.gradle.api.DefaultTask
import org.gradle.api.tasks.Input
import org.gradle.api.tasks.TaskAction
import org.jetbrains.kotlin.gradle.tasks.internal.CleanableStore
import java.time.*
/**
* Task to clean all old loaded files based on a last modification date.
* All registered store in {@link CleanableStore} would be cleaned
*/
open class CleanOldStoredDataTask : DefaultTask() {
/**
* Time to live in days
*/
@Input
val timeToLiveInDays: Long = 30
@Suppress("unused")
@TaskAction
fun exec() {
val expirationDate = Instant.now().minus(Duration.ofDays(timeToLiveInDays))
CleanableStore.stores.forEach { (_, store) -> store.cleanDir(expirationDate) }
}
companion object {
const val NAME: String = "clean store"
}
}
@@ -12,6 +12,7 @@ import org.gradle.api.tasks.Internal
import org.gradle.api.tasks.Optional
import org.gradle.api.tasks.testing.AbstractTestTask
import org.gradle.process.internal.ExecHandleFactory
import org.gradle.work.DisableCachingByDefault
import org.jetbrains.kotlin.gradle.internal.testing.KotlinTestRunnerListener
import org.jetbrains.kotlin.gradle.internal.testing.TCServiceMessagesTestExecutor
import org.jetbrains.kotlin.gradle.plugin.PropertiesProvider
@@ -21,6 +22,7 @@ import org.jetbrains.kotlin.gradle.plugin.variantImplementationFactoryProvider
import org.jetbrains.kotlin.gradle.utils.injected
import javax.inject.Inject
@DisableCachingByDefault(because = "Abstract super-class, not to be instantiated directly")
abstract class KotlinTest : AbstractTestTask(), UsesVariantImplementationFactories {
@Input
@Optional
@@ -15,6 +15,7 @@ import org.gradle.api.tasks.Internal
import org.gradle.api.tasks.TaskAction
import org.gradle.api.tasks.TaskProvider
import org.gradle.api.tasks.testing.*
import org.gradle.work.DisableCachingByDefault
import org.jetbrains.kotlin.gradle.internal.testing.KotlinTestRunnerListener
import org.jetbrains.kotlin.gradle.plugin.PropertiesProvider
import org.jetbrains.kotlin.gradle.plugin.internal.KotlinTestReportCompatibilityHelper
@@ -44,6 +45,7 @@ import org.jetbrains.kotlin.gradle.utils.toUri
* In this case, only topmost aggregate test task will override reporting,
* event if child tasks will be executed.
*/
@DisableCachingByDefault
abstract class KotlinTestReport : TestReport(), UsesTestReportService {
@Transient
@Internal
@@ -84,6 +84,7 @@ internal val GradleKpmModule.buildKotlinToolingMetadataTask: TaskProvider<BuildK
)
}
@DisableCachingByDefault
abstract class BuildKotlinToolingMetadataTask : DefaultTask() {
@DisableCachingByDefault
@@ -14,6 +14,7 @@ import org.gradle.api.attributes.java.TargetJvmEnvironment
import org.gradle.api.attributes.java.TargetJvmVersion
import org.gradle.api.attributes.plugin.GradlePluginApiVersion
import org.gradle.api.component.AdhocComponentWithVariants
import org.gradle.api.plugins.JavaBasePlugin
import org.gradle.api.plugins.JavaLibraryPlugin
import org.gradle.api.plugins.JavaPlugin
import org.gradle.api.plugins.JavaPluginExtension
@@ -21,10 +22,14 @@ import org.gradle.api.publish.PublishingExtension
import org.gradle.api.publish.maven.MavenPublication
import org.gradle.api.tasks.Copy
import org.gradle.api.tasks.SourceSet
import org.gradle.api.tasks.TaskProvider
import org.gradle.api.tasks.compile.JavaCompile
import org.gradle.jvm.tasks.Jar
import org.gradle.jvm.toolchain.JavaToolchainService
import org.gradle.kotlin.dsl.*
import org.gradle.kotlin.dsl.support.uppercaseFirstChar
import org.gradle.plugin.devel.plugins.JavaGradlePluginPlugin
import org.gradle.plugin.devel.tasks.ValidatePlugins
import org.jetbrains.dokka.DokkaVersion
import org.jetbrains.dokka.gradle.DokkaTask
import org.jetbrains.dokka.gradle.GradleExternalDocumentationLinkBuilder
@@ -174,6 +179,8 @@ fun Project.createGradleCommonSourceSet(): SourceSet {
}
}
registerValidatePluginTasks(commonSourceSet)
return commonSourceSet
}
@@ -513,6 +520,8 @@ fun Project.createGradlePluginVariant(
}
}
registerValidatePluginTasks(variantSourceSet)
return variantSourceSet
}
@@ -767,3 +776,35 @@ private fun GradleExternalDocumentationLinkBuilder.addWorkaroundForElementList(p
}
private val SourceSet.embeddedConfigurationName get() = "${name}Embedded"
// We want to still validate Gradle types without applying `java-gradle-plugin`
// Following configuration is a copy of configuration for the task done by the `java-gradle-plugin`
fun Project.registerValidatePluginTasks(
sourceSet: SourceSet
): TaskProvider<ValidatePlugins> {
val validatePluginsTask = tasks.register<ValidatePlugins>("validatePlugins${sourceSet.name.capitalize()}") {
group = "Plugin development" // PLUGIN_DEVELOPMENT_GROUP
// VALIDATE_PLUGIN_TASK_DESCRIPTION
description = "Validates the plugin by checking parameter annotations on task and artifact transform types etc."
enableStricterValidation.set(true)
failOnWarning.set(true)
outputFile.set(project.layout.buildDirectory.file("reports/plugin-development/validation-report-${sourceSet.name}.txt"))
classes.from({ sourceSet.output.classesDirs })
classpath.from({ sourceSet.compileClasspath })
val javaPluginExtension = project.extensions.getByType<JavaPluginExtension>()
val toolchainService = project.extensions.getByType<JavaToolchainService>()
launcher.convention(toolchainService.launcherFor(javaPluginExtension.toolchain))
}
tasks.named(JavaBasePlugin.CHECK_TASK_NAME) {
dependsOn(validatePluginsTask)
}
tasks.named("test") {
dependsOn(validatePluginsTask)
}
return validatePluginsTask
}