Skip to content

Commit

Permalink
Use the correct source directory set on JVM (#5163)
Browse files Browse the repository at this point in the history
  • Loading branch information
Goooler committed Oct 6, 2022
1 parent 4102bd4 commit d642648
Showing 1 changed file with 35 additions and 29 deletions.
Expand Up @@ -4,49 +4,55 @@ package io.gitlab.arturbosch.detekt.internal

import io.gitlab.arturbosch.detekt.DetektPlugin
import io.gitlab.arturbosch.detekt.extensions.DetektExtension
import org.gradle.api.GradleException
import org.gradle.api.Project
import org.gradle.api.file.FileCollection
import org.gradle.api.internal.HasConvention
import org.gradle.api.plugins.JavaPluginConvention
import org.gradle.api.tasks.SourceSet
import org.jetbrains.kotlin.gradle.plugin.KotlinSourceSet
import org.jetbrains.kotlin.gradle.dsl.KotlinCommonOptions
import org.jetbrains.kotlin.gradle.dsl.KotlinJvmProjectExtension
import org.jetbrains.kotlin.gradle.plugin.KotlinCompilation
import org.jetbrains.kotlin.gradle.plugin.mpp.pm20.targets

internal class DetektJvm(private val project: Project) {
fun registerTasks(extension: DetektExtension) {
project.convention.getPlugin(JavaPluginConvention::class.java).sourceSets.all { sourceSet ->
project.registerJvmDetektTask(extension, sourceSet)
project.registerJvmCreateBaselineTask(extension, sourceSet)
project.extensions.getByType(KotlinJvmProjectExtension::class.java).targets.forEach { target ->
target.compilations.all { compilation ->
val inputSource = compilation.kotlinSourceSets
.map { it.kotlin.sourceDirectories }
.fold(project.files() as FileCollection) { collection, next -> collection.plus(next) }
project.registerJvmDetektTask(compilation, extension, inputSource)
project.registerJvmCreateBaselineTask(compilation, extension, inputSource)
}
}
}

private fun Project.registerJvmDetektTask(extension: DetektExtension, sourceSet: SourceSet) {
val kotlinSourceSet = (sourceSet as HasConvention).convention.plugins["kotlin"] as? KotlinSourceSet
?: throw GradleException("Kotlin source set not found. Please report on detekt's issue tracker")
registerDetektTask(DetektPlugin.DETEKT_TASK_NAME + sourceSet.name.capitalize(), extension) {
source = kotlinSourceSet.kotlin
classpath.setFrom(sourceSet.compileClasspath.existingFiles(), sourceSet.output.classesDirs.existingFiles())
private fun Project.registerJvmDetektTask(
compilation: KotlinCompilation<KotlinCommonOptions>,
extension: DetektExtension,
inputSource: FileCollection
) {
registerDetektTask(DetektPlugin.DETEKT_TASK_NAME + compilation.name.capitalize(), extension) {
setSource(inputSource)
classpath.setFrom(inputSource, compilation.compileDependencyFiles)
// If a baseline file is configured as input file, it must exist to be configured, otherwise the task fails.
// We try to find the configured baseline or alternatively a specific variant matching this task.
extension.baseline?.existingVariantOrBaseFile(sourceSet.name)?.let { baselineFile ->
baseline.convention(layout.file(project.provider { baselineFile }))
extension.baseline?.existingVariantOrBaseFile(compilation.name)?.let { baselineFile ->
baseline.convention(layout.file(provider { baselineFile }))
}
setReportOutputConventions(reports, extension, sourceSet.name)
description = "EXPERIMENTAL: Run detekt analysis for ${sourceSet.name} classes with type resolution"
setReportOutputConventions(reports, extension, compilation.name)
description = "EXPERIMENTAL: Run detekt analysis for ${compilation.name} classes with type resolution"
}
}

private fun Project.registerJvmCreateBaselineTask(extension: DetektExtension, sourceSet: SourceSet) {
val kotlinSourceSet = (sourceSet as HasConvention).convention.plugins["kotlin"] as? KotlinSourceSet
?: throw GradleException("Kotlin source set not found. Please report on detekt's issue tracker")
registerCreateBaselineTask(DetektPlugin.BASELINE_TASK_NAME + sourceSet.name.capitalize(), extension) {
source = kotlinSourceSet.kotlin
classpath.setFrom(sourceSet.compileClasspath.existingFiles(), sourceSet.output.classesDirs.existingFiles())
val variantBaselineFile = extension.baseline?.addVariantName(sourceSet.name)
baseline.convention(project.layout.file(project.provider { variantBaselineFile }))
description = "EXPERIMENTAL: Creates detekt baseline for ${sourceSet.name} classes with type resolution"
private fun Project.registerJvmCreateBaselineTask(
compilation: KotlinCompilation<KotlinCommonOptions>,
extension: DetektExtension,
inputSource: FileCollection
) {
registerCreateBaselineTask(DetektPlugin.BASELINE_TASK_NAME + compilation.name.capitalize(), extension) {
setSource(inputSource)
classpath.setFrom(inputSource, compilation.compileDependencyFiles)
val variantBaselineFile = extension.baseline?.addVariantName(compilation.name)
baseline.convention(layout.file(provider { variantBaselineFile }))
description = "EXPERIMENTAL: Creates detekt baseline for ${compilation.name} classes with type resolution"
}
}

private fun FileCollection.existingFiles() = filter { it.exists() }
}

0 comments on commit d642648

Please sign in to comment.