name.remal.gradle_plugins.plugins.code_quality.sonar.SonarLint.kt Maven / Gradle / Ivy
package name.remal.gradle_plugins.plugins.code_quality.sonar
import name.remal.filterNotNullValues
import name.remal.forInstantiatedWithPropagatedPackage
import name.remal.gradle_plugins.dsl.BuildTask
import name.remal.gradle_plugins.dsl.extensions.emptyFileCollection
import name.remal.gradle_plugins.dsl.extensions.forClassLoader
import name.remal.gradle_plugins.dsl.extensions.visitFiles
import name.remal.gradle_plugins.dsl.utils.code_quality.FindBugsReport
import name.remal.gradle_plugins.plugins.code_quality.BaseCodeQualityFindBugsResultsTask
import name.remal.gradle_plugins.plugins.code_quality.sonar.internal.SonarLintInvoker
import name.remal.gradle_plugins.plugins.code_quality.sonar.internal.SonarSourceFile
import name.remal.gradle_plugins.plugins.code_quality.sonar.internal.impl.SonarLintInvokerImpl
import org.gradle.api.file.FileCollection
import org.gradle.api.tasks.CacheableTask
import org.gradle.api.tasks.Classpath
import org.gradle.api.tasks.Input
import org.gradle.api.tasks.Optional
@BuildTask
@CacheableTask
class SonarLint : BaseCodeQualityFindBugsResultsTask(), SonarPropertiesMixin {
override val findBugsXmlReportName get() = SonarLintReports::findBugsXml.name
override val htmlReportName get() = SonarLintReports::html.name
@get:Input
@get:Optional
var excludedMessages: MutableSet = sortedSetOf()
set(value) {
field = value.toSortedSet()
}
fun excludeMessage(value: String) = excludeMessages(value)
fun excludeMessages(vararg values: String) = apply {
excludedMessages.addAll(values)
}
fun excludeMessages(values: Iterable) = apply {
excludedMessages.addAll(values)
}
init {
handleExtension {
it.excludes.also {
exclude(it.sources)
excludeMessages(it.messages)
}
}
}
@get:Input
var isTestSources: Boolean = false
@get:Input
@get:Optional
override var sonarProperties: MutableMap = sortedMapOf()
set(value) {
field = value.toSortedMap()
}
init {
handleExtension { sonarProperties.putAll(it.sonarProperties) }
}
@get:Classpath
var sonarClasspath: FileCollection = project.emptyFileCollection()
@get:Classpath
var sonarPluginsClasspath: FileCollection = project.emptyFileCollection()
override fun doAnalyze(): FindBugsReport {
val inputFiles = mutableListOf()
getSource().visitFiles { fileDetails ->
inputFiles.add(SonarSourceFile(
fileDetails.file,
fileDetails.path,
isTestSources
))
}
lateinit var findBugsReport: FindBugsReport
sonarClasspath.forClassLoader { classLoader ->
classLoader.forInstantiatedWithPropagatedPackage(SonarLintInvoker::class.java, SonarLintInvokerImpl::class.java) { invoker ->
findBugsReport = invoker.invoke(
inputFiles,
excludedMessages,
sonarProperties.filterNotNullValues(),
project.projectDir,
sonarPluginsClasspath,
logger,
buildCancellationToken
)
}
}
return findBugsReport
}
}