From 49819b2a9c3b60ed24733751c54f9ec2246652cb 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 feb401417fde..730717cc7902 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 ff1876a7f013..7a7d29cb0a14 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 37452d8e0e4e..add1f5143c1b 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 f9431ae6e842..19ff62033698 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.set(provider { extension.debug }) it.parallelProp.set(provider { extension.parallel }) it.disableDefaultRuleSetsProp.set(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.set(project.provider { extension.debug }) it.parallel.set(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 f44401694ae3..01768b6f1082 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() }