From 413f446668787bfeb9768dbc42621208eae1c5f9 Mon Sep 17 00:00:00 2001 From: Matthew Haughton <3flex@users.noreply.github.com> Date: Thu, 1 Sep 2022 13:17:39 +1000 Subject: [PATCH] Add toolchain support to Gradle plugin This aligns to the behaviour of toolchains in the Kotlin Gradle Plugin. KGP will set jvmTarget and jdkHome based on the enabled toolchain, assuming it hasn't been set elsewhere in the build script. --- detekt-gradle-plugin/settings.gradle.kts | 2 ++ .../io/gitlab/arturbosch/detekt/Detekt.kt | 9 ++++++ .../detekt/DetektCreateBaselineTask.kt | 7 ++++ .../arturbosch/detekt/internal/SharedTasks.kt | 32 +++++++++++++++++++ .../arturbosch/detekt/invoke/CliArgument.kt | 6 ++++ 5 files changed, 56 insertions(+) diff --git a/detekt-gradle-plugin/settings.gradle.kts b/detekt-gradle-plugin/settings.gradle.kts index feb401417fd..730717cc790 100644 --- a/detekt-gradle-plugin/settings.gradle.kts +++ b/detekt-gradle-plugin/settings.gradle.kts @@ -2,6 +2,8 @@ pluginManagement { includeBuild("../build-logic") } +includeBuild("..") + dependencyResolutionManagement { versionCatalogs { create("libs") { diff --git a/detekt-gradle-plugin/src/main/kotlin/io/gitlab/arturbosch/detekt/Detekt.kt b/detekt-gradle-plugin/src/main/kotlin/io/gitlab/arturbosch/detekt/Detekt.kt index ff1876a7f01..7a7d29cb0a1 100644 --- a/detekt-gradle-plugin/src/main/kotlin/io/gitlab/arturbosch/detekt/Detekt.kt +++ b/detekt-gradle-plugin/src/main/kotlin/io/gitlab/arturbosch/detekt/Detekt.kt @@ -19,6 +19,7 @@ import io.gitlab.arturbosch.detekt.invoke.DetektInvoker import io.gitlab.arturbosch.detekt.invoke.DisableDefaultRuleSetArgument import io.gitlab.arturbosch.detekt.invoke.FailFastArgument import io.gitlab.arturbosch.detekt.invoke.InputArgument +import io.gitlab.arturbosch.detekt.invoke.JdkHomeArgument import io.gitlab.arturbosch.detekt.invoke.JvmTargetArgument import io.gitlab.arturbosch.detekt.invoke.LanguageVersionArgument import io.gitlab.arturbosch.detekt.invoke.ParallelArgument @@ -26,6 +27,7 @@ import io.gitlab.arturbosch.detekt.invoke.isDryRunEnabled import org.gradle.api.Action import org.gradle.api.file.ConfigurableFileCollection import org.gradle.api.file.Directory +import org.gradle.api.file.DirectoryProperty import org.gradle.api.file.FileTree import org.gradle.api.file.RegularFile import org.gradle.api.file.RegularFileProperty @@ -38,6 +40,7 @@ import org.gradle.api.tasks.Classpath import org.gradle.api.tasks.Console import org.gradle.api.tasks.IgnoreEmptyDirectories import org.gradle.api.tasks.Input +import org.gradle.api.tasks.InputDirectory import org.gradle.api.tasks.InputFile import org.gradle.api.tasks.InputFiles import org.gradle.api.tasks.Internal @@ -96,6 +99,11 @@ abstract class Detekt @Inject constructor( get() = jvmTargetProp.get() set(value) = jvmTargetProp.set(value) + @get:InputDirectory + @get:PathSensitive(PathSensitivity.ABSOLUTE) + @get:Optional + abstract val jdkHome: DirectoryProperty + @get:Internal internal abstract val debugProp: Property var debug: Boolean @@ -216,6 +224,7 @@ abstract class Detekt @Inject constructor( ClasspathArgument(classpath), LanguageVersionArgument(languageVersionProp.orNull), JvmTargetArgument(jvmTargetProp.orNull), + JdkHomeArgument(jdkHome), ConfigArgument(config), BaselineArgument(baseline.orNull), DefaultReportArgument(DetektReportType.XML, xmlReportFile.orNull), diff --git a/detekt-gradle-plugin/src/main/kotlin/io/gitlab/arturbosch/detekt/DetektCreateBaselineTask.kt b/detekt-gradle-plugin/src/main/kotlin/io/gitlab/arturbosch/detekt/DetektCreateBaselineTask.kt index 37452d8e0e4..add1f5143c1 100644 --- a/detekt-gradle-plugin/src/main/kotlin/io/gitlab/arturbosch/detekt/DetektCreateBaselineTask.kt +++ b/detekt-gradle-plugin/src/main/kotlin/io/gitlab/arturbosch/detekt/DetektCreateBaselineTask.kt @@ -17,6 +17,7 @@ import io.gitlab.arturbosch.detekt.invoke.InputArgument import io.gitlab.arturbosch.detekt.invoke.JvmTargetArgument import io.gitlab.arturbosch.detekt.invoke.ParallelArgument import org.gradle.api.file.ConfigurableFileCollection +import org.gradle.api.file.DirectoryProperty import org.gradle.api.file.FileTree import org.gradle.api.file.RegularFileProperty import org.gradle.api.provider.Property @@ -26,6 +27,7 @@ import org.gradle.api.tasks.Classpath import org.gradle.api.tasks.Console import org.gradle.api.tasks.IgnoreEmptyDirectories import org.gradle.api.tasks.Input +import org.gradle.api.tasks.InputDirectory import org.gradle.api.tasks.InputFiles import org.gradle.api.tasks.Internal import org.gradle.api.tasks.Optional @@ -113,6 +115,11 @@ abstract class DetektCreateBaselineTask : SourceTask() { get() = jvmTargetProp.get() set(value) = jvmTargetProp.set(value) + @get:InputDirectory + @get:PathSensitive(PathSensitivity.ABSOLUTE) + @get:Optional + abstract val jdkHome: DirectoryProperty + @get:Internal internal val arguments: Provider> = project.provider { listOf( diff --git a/detekt-gradle-plugin/src/main/kotlin/io/gitlab/arturbosch/detekt/internal/SharedTasks.kt b/detekt-gradle-plugin/src/main/kotlin/io/gitlab/arturbosch/detekt/internal/SharedTasks.kt index c663e448360..5997a817dc9 100644 --- a/detekt-gradle-plugin/src/main/kotlin/io/gitlab/arturbosch/detekt/internal/SharedTasks.kt +++ b/detekt-gradle-plugin/src/main/kotlin/io/gitlab/arturbosch/detekt/internal/SharedTasks.kt @@ -3,8 +3,12 @@ package io.gitlab.arturbosch.detekt.internal import io.gitlab.arturbosch.detekt.Detekt import io.gitlab.arturbosch.detekt.DetektCreateBaselineTask import io.gitlab.arturbosch.detekt.extensions.DetektExtension +import org.gradle.api.JavaVersion import org.gradle.api.Project +import org.gradle.api.plugins.JavaBasePlugin +import org.gradle.api.plugins.JavaPluginExtension import org.gradle.api.tasks.TaskProvider +import org.gradle.jvm.toolchain.JavaToolchainService internal fun Project.registerDetektTask( name: String, @@ -40,6 +44,20 @@ internal fun Project.registerDetektTask( } } + project.plugins.withType(JavaBasePlugin::class.java) { _ -> + val toolchain = project.extensions.getByType(JavaPluginExtension::class.java).toolchain + + // acquire a provider that returns the launcher for the toolchain + val service = project.extensions.getByType(JavaToolchainService::class.java) + val defaultLauncher = service.launcherFor(toolchain) + it.jdkHome.convention(defaultLauncher.map { launcher -> launcher.metadata.installationPath }) + it.jvmTargetProp.convention( + defaultLauncher.map { launcher -> + JavaVersion.toVersion(launcher.metadata.languageVersion.asInt()).toString() + } + ) + } + it.debugProp.convention(provider { extension.debug }) it.parallelProp.convention(provider { extension.parallel }) it.disableDefaultRuleSetsProp.convention(provider { extension.disableDefaultRuleSets }) @@ -59,6 +77,20 @@ internal fun Project.registerCreateBaselineTask( configuration: DetektCreateBaselineTask.() -> Unit ): TaskProvider = tasks.register(name, DetektCreateBaselineTask::class.java) { + project.plugins.withType(JavaBasePlugin::class.java) { _ -> + val toolchain = project.extensions.getByType(JavaPluginExtension::class.java).toolchain + + // acquire a provider that returns the launcher for the toolchain + val service = project.extensions.getByType(JavaToolchainService::class.java) + val defaultLauncher = service.launcherFor(toolchain) + it.jdkHome.convention(defaultLauncher.map { launcher -> launcher.metadata.installationPath }) + it.jvmTargetProp.convention( + defaultLauncher.map { launcher -> + JavaVersion.toVersion(launcher.metadata.languageVersion.asInt()).toString() + } + ) + } + it.config.setFrom(project.provider { extension.config }) it.debug.convention(project.provider { extension.debug }) it.parallel.convention(project.provider { extension.parallel }) diff --git a/detekt-gradle-plugin/src/main/kotlin/io/gitlab/arturbosch/detekt/invoke/CliArgument.kt b/detekt-gradle-plugin/src/main/kotlin/io/gitlab/arturbosch/detekt/invoke/CliArgument.kt index f44401694ae..01768b6f108 100644 --- a/detekt-gradle-plugin/src/main/kotlin/io/gitlab/arturbosch/detekt/invoke/CliArgument.kt +++ b/detekt-gradle-plugin/src/main/kotlin/io/gitlab/arturbosch/detekt/invoke/CliArgument.kt @@ -1,6 +1,7 @@ package io.gitlab.arturbosch.detekt.invoke import io.gitlab.arturbosch.detekt.extensions.DetektReportType +import org.gradle.api.file.DirectoryProperty import org.gradle.api.file.FileCollection import org.gradle.api.file.RegularFile import java.io.File @@ -21,6 +22,7 @@ private const val CREATE_BASELINE_PARAMETER = "--create-baseline" private const val CLASSPATH_PARAMETER = "--classpath" private const val LANGUAGE_VERSION_PARAMETER = "--language-version" private const val JVM_TARGET_PARAMETER = "--jvm-target" +private const val JDK_HOME_PARAMETER = "--jdk-home" private const val BASE_PATH_PARAMETER = "--base-path" internal sealed class CliArgument { @@ -58,6 +60,10 @@ internal data class JvmTargetArgument(val jvmTarget: String?) : CliArgument() { override fun toArgument() = jvmTarget?.let { listOf(JVM_TARGET_PARAMETER, it) }.orEmpty() } +internal data class JdkHomeArgument(val jdkHome: DirectoryProperty) : CliArgument() { + override fun toArgument() = jdkHome.orNull?.let { listOf(JDK_HOME_PARAMETER, it.toString()) }.orEmpty() +} + internal data class BaselineArgument(val baseline: RegularFile?) : CliArgument() { override fun toArgument() = baseline?.let { listOf(BASELINE_PARAMETER, it.asFile.absolutePath) }.orEmpty() }