Skip to content

Commit

Permalink
Add toolchain support to Gradle plugin
Browse files Browse the repository at this point in the history
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.
  • Loading branch information
3flex committed Sep 2, 2022
1 parent 3ea5ae9 commit d17d5d1
Show file tree
Hide file tree
Showing 5 changed files with 56 additions and 0 deletions.
2 changes: 2 additions & 0 deletions detekt-gradle-plugin/settings.gradle.kts
Expand Up @@ -2,6 +2,8 @@ pluginManagement {
includeBuild("../build-logic")
}

includeBuild("..")

dependencyResolutionManagement {
versionCatalogs {
create("libs") {
Expand Down
Expand Up @@ -19,13 +19,15 @@ 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
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
Expand All @@ -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
Expand Down Expand Up @@ -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<Boolean>
var debug: Boolean
Expand Down Expand Up @@ -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),
Expand Down
Expand Up @@ -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
Expand All @@ -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
Expand Down Expand Up @@ -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<List<String>> = project.provider {
listOf(
Expand Down
Expand Up @@ -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,
Expand Down Expand Up @@ -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 })
Expand All @@ -59,6 +77,20 @@ internal fun Project.registerCreateBaselineTask(
configuration: DetektCreateBaselineTask.() -> Unit
): TaskProvider<DetektCreateBaselineTask> =
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 })
Expand Down
@@ -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
Expand All @@ -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 {
Expand Down Expand Up @@ -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()
}
Expand Down

0 comments on commit d17d5d1

Please sign in to comment.