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() }