All Downloads are FREE. Search and download functionalities are using the official Maven repository.

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
    }

}




© 2015 - 2024 Weber Informatics LLC | Privacy Policy