/
DetektPlugin.kt
128 lines (107 loc) · 5.52 KB
/
DetektPlugin.kt
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
package io.gitlab.arturbosch.detekt
import io.gitlab.arturbosch.detekt.extensions.DetektExtension
import io.gitlab.arturbosch.detekt.internal.DetektAndroid
import io.gitlab.arturbosch.detekt.internal.DetektJvm
import io.gitlab.arturbosch.detekt.internal.DetektMultiplatform
import io.gitlab.arturbosch.detekt.internal.DetektPlain
import org.gradle.api.Plugin
import org.gradle.api.Project
import org.gradle.api.plugins.ReportingBasePlugin
import org.gradle.api.reporting.ReportingExtension
class DetektPlugin : Plugin<Project> {
override fun apply(project: Project) {
project.pluginManager.apply(ReportingBasePlugin::class.java)
val extension = project.extensions.create(DETEKT_EXTENSION, DetektExtension::class.java)
extension.reportsDir = project.extensions.getByType(ReportingExtension::class.java).file("detekt")
val defaultConfigFile =
project.file("${project.rootProject.layout.projectDirectory.dir(CONFIG_DIR_NAME)}/$CONFIG_FILE")
if (defaultConfigFile.exists()) {
extension.config = project.files(defaultConfigFile)
}
configurePluginDependencies(project, extension)
setTaskDefaults(project)
project.registerDetektPlainTask(extension)
project.registerDetektJvmTasks(extension)
if (project.findProperty(DETEKT_ANDROID_DISABLED_PROPERTY) != "true") {
project.registerDetektAndroidTasks(extension)
}
if (project.findProperty(DETEKT_MULTIPLATFORM_DISABLED_PROPERTY) != "true") {
project.registerDetektMultiplatformTasks(extension)
}
project.registerGenerateConfigTask(extension)
}
private fun Project.registerDetektJvmTasks(extension: DetektExtension) {
plugins.withId("org.jetbrains.kotlin.jvm") {
DetektJvm(this).registerTasks(extension)
}
}
private fun Project.registerDetektMultiplatformTasks(extension: DetektExtension) {
plugins.withId("org.jetbrains.kotlin.multiplatform") {
DetektMultiplatform(this).registerTasks(extension)
}
}
private fun Project.registerDetektAndroidTasks(extension: DetektExtension) {
plugins.withId("kotlin-android") {
DetektAndroid(this).registerTasks(extension)
}
}
private fun Project.registerDetektPlainTask(extension: DetektExtension) {
DetektPlain(this).registerTasks(extension)
}
private fun Project.registerGenerateConfigTask(extension: DetektExtension) {
val detektGenerateConfigSingleExecution = project.gradle.sharedServices.registerIfAbsent(
"DetektGenerateConfigSingleExecution",
DetektGenerateConfigTask.SingleExecutionBuildService::class.java
) { spec ->
spec.maxParallelUsages.set(1)
}
tasks.register(GENERATE_CONFIG, DetektGenerateConfigTask::class.java) {
it.config.setFrom(project.provider { extension.config })
it.usesService(detektGenerateConfigSingleExecution)
}
}
private fun configurePluginDependencies(project: Project, extension: DetektExtension) {
project.configurations.create(CONFIGURATION_DETEKT_PLUGINS) { configuration ->
configuration.isVisible = false
configuration.isTransitive = true
configuration.description = "The $CONFIGURATION_DETEKT_PLUGINS libraries to be used for this project."
}
project.configurations.create(CONFIGURATION_DETEKT) { configuration ->
configuration.isVisible = false
configuration.isTransitive = true
configuration.description = "The $CONFIGURATION_DETEKT dependencies to be used for this project."
configuration.defaultDependencies { dependencySet ->
val version = extension.toolVersion
dependencySet.add(project.dependencies.create("io.gitlab.arturbosch.detekt:detekt-cli:$version"))
}
}
}
private fun setTaskDefaults(project: Project) {
project.tasks.withType(Detekt::class.java).configureEach {
it.detektClasspath.setFrom(project.configurations.getAt(CONFIGURATION_DETEKT))
it.pluginClasspath.setFrom(project.configurations.getAt(CONFIGURATION_DETEKT_PLUGINS))
}
project.tasks.withType(DetektCreateBaselineTask::class.java).configureEach {
it.detektClasspath.setFrom(project.configurations.getAt(CONFIGURATION_DETEKT))
it.pluginClasspath.setFrom(project.configurations.getAt(CONFIGURATION_DETEKT_PLUGINS))
}
project.tasks.withType(DetektGenerateConfigTask::class.java).configureEach {
it.detektClasspath.setFrom(project.configurations.getAt(CONFIGURATION_DETEKT))
it.pluginClasspath.setFrom(project.configurations.getAt(CONFIGURATION_DETEKT_PLUGINS))
}
}
companion object {
const val DETEKT_TASK_NAME = "detekt"
const val BASELINE_TASK_NAME = "detektBaseline"
const val DETEKT_EXTENSION = "detekt"
private const val GENERATE_CONFIG = "detektGenerateConfig"
internal val defaultExcludes = listOf("build/")
internal val defaultIncludes = listOf("**/*.kt", "**/*.kts")
internal const val CONFIG_DIR_NAME = "config/detekt"
internal const val CONFIG_FILE = "detekt.yml"
internal const val DETEKT_ANDROID_DISABLED_PROPERTY = "detekt.android.disabled"
internal const val DETEKT_MULTIPLATFORM_DISABLED_PROPERTY = "detekt.multiplatform.disabled"
}
}
const val CONFIGURATION_DETEKT = "detekt"
const val CONFIGURATION_DETEKT_PLUGINS = "detektPlugins"