diff --git a/detekt-api/api/detekt-api.api b/detekt-api/api/detekt-api.api index 50ce3df9b88..96146680d77 100644 --- a/detekt-api/api/detekt-api.api +++ b/detekt-api/api/detekt-api.api @@ -107,7 +107,7 @@ public class io/gitlab/arturbosch/detekt/api/DetektVisitor : org/jetbrains/kotli public abstract interface class io/gitlab/arturbosch/detekt/api/Detektion : org/jetbrains/kotlin/com/intellij/openapi/util/UserDataHolder { public abstract fun add (Lio/gitlab/arturbosch/detekt/api/Notification;)V public abstract fun add (Lio/gitlab/arturbosch/detekt/api/ProjectMetric;)V - public abstract fun getFindings ()Ljava/util/Map; + public abstract fun getFindings ()Ljava/util/List; public abstract fun getMetrics ()Ljava/util/Collection; public abstract fun getNotifications ()Ljava/util/Collection; } @@ -149,7 +149,7 @@ public final class io/gitlab/arturbosch/detekt/api/Extension$DefaultImpls { public abstract interface class io/gitlab/arturbosch/detekt/api/FileProcessListener : io/gitlab/arturbosch/detekt/api/Extension { public abstract fun onFinish (Ljava/util/List;Lio/gitlab/arturbosch/detekt/api/Detektion;Lorg/jetbrains/kotlin/resolve/BindingContext;)V public abstract fun onProcess (Lorg/jetbrains/kotlin/psi/KtFile;Lorg/jetbrains/kotlin/resolve/BindingContext;)V - public abstract fun onProcessComplete (Lorg/jetbrains/kotlin/psi/KtFile;Ljava/util/Map;Lorg/jetbrains/kotlin/resolve/BindingContext;)V + public abstract fun onProcessComplete (Lorg/jetbrains/kotlin/psi/KtFile;Ljava/util/List;Lorg/jetbrains/kotlin/resolve/BindingContext;)V public abstract fun onStart (Ljava/util/List;Lorg/jetbrains/kotlin/resolve/BindingContext;)V } @@ -159,7 +159,7 @@ public final class io/gitlab/arturbosch/detekt/api/FileProcessListener$DefaultIm public static fun init (Lio/gitlab/arturbosch/detekt/api/FileProcessListener;Lio/gitlab/arturbosch/detekt/api/SetupContext;)V public static fun onFinish (Lio/gitlab/arturbosch/detekt/api/FileProcessListener;Ljava/util/List;Lio/gitlab/arturbosch/detekt/api/Detektion;Lorg/jetbrains/kotlin/resolve/BindingContext;)V public static fun onProcess (Lio/gitlab/arturbosch/detekt/api/FileProcessListener;Lorg/jetbrains/kotlin/psi/KtFile;Lorg/jetbrains/kotlin/resolve/BindingContext;)V - public static fun onProcessComplete (Lio/gitlab/arturbosch/detekt/api/FileProcessListener;Lorg/jetbrains/kotlin/psi/KtFile;Ljava/util/Map;Lorg/jetbrains/kotlin/resolve/BindingContext;)V + public static fun onProcessComplete (Lio/gitlab/arturbosch/detekt/api/FileProcessListener;Lorg/jetbrains/kotlin/psi/KtFile;Ljava/util/List;Lorg/jetbrains/kotlin/resolve/BindingContext;)V public static fun onStart (Lio/gitlab/arturbosch/detekt/api/FileProcessListener;Ljava/util/List;Lorg/jetbrains/kotlin/resolve/BindingContext;)V } @@ -254,7 +254,7 @@ public abstract interface class io/gitlab/arturbosch/detekt/api/PropertiesAware public abstract interface class io/gitlab/arturbosch/detekt/api/ReportingExtension : io/gitlab/arturbosch/detekt/api/Extension { public abstract fun onFinalResult (Lio/gitlab/arturbosch/detekt/api/Detektion;)V public abstract fun onRawResult (Lio/gitlab/arturbosch/detekt/api/Detektion;)V - public abstract fun transformFindings (Ljava/util/Map;)Ljava/util/Map; + public abstract fun transformFindings (Ljava/util/List;)Ljava/util/List; } public final class io/gitlab/arturbosch/detekt/api/ReportingExtension$DefaultImpls { @@ -263,7 +263,7 @@ public final class io/gitlab/arturbosch/detekt/api/ReportingExtension$DefaultImp public static fun init (Lio/gitlab/arturbosch/detekt/api/ReportingExtension;Lio/gitlab/arturbosch/detekt/api/SetupContext;)V public static fun onFinalResult (Lio/gitlab/arturbosch/detekt/api/ReportingExtension;Lio/gitlab/arturbosch/detekt/api/Detektion;)V public static fun onRawResult (Lio/gitlab/arturbosch/detekt/api/ReportingExtension;Lio/gitlab/arturbosch/detekt/api/Detektion;)V - public static fun transformFindings (Lio/gitlab/arturbosch/detekt/api/ReportingExtension;Ljava/util/Map;)Ljava/util/Map; + public static fun transformFindings (Lio/gitlab/arturbosch/detekt/api/ReportingExtension;Ljava/util/List;)Ljava/util/List; } public abstract interface annotation class io/gitlab/arturbosch/detekt/api/RequiresTypeResolution : java/lang/annotation/Annotation { diff --git a/detekt-api/src/main/kotlin/io/gitlab/arturbosch/detekt/api/Detektion.kt b/detekt-api/src/main/kotlin/io/gitlab/arturbosch/detekt/api/Detektion.kt index 79e4cf623b4..840029dd342 100644 --- a/detekt-api/src/main/kotlin/io/gitlab/arturbosch/detekt/api/Detektion.kt +++ b/detekt-api/src/main/kotlin/io/gitlab/arturbosch/detekt/api/Detektion.kt @@ -7,7 +7,7 @@ import org.jetbrains.kotlin.com.intellij.openapi.util.UserDataHolder * which needs to be transferred from the detekt engine to the user. */ interface Detektion : UserDataHolder { - val findings: Map> + val findings: List val notifications: Collection val metrics: Collection diff --git a/detekt-api/src/main/kotlin/io/gitlab/arturbosch/detekt/api/FileProcessListener.kt b/detekt-api/src/main/kotlin/io/gitlab/arturbosch/detekt/api/FileProcessListener.kt index 2e16f30ce7f..dac288f95c9 100644 --- a/detekt-api/src/main/kotlin/io/gitlab/arturbosch/detekt/api/FileProcessListener.kt +++ b/detekt-api/src/main/kotlin/io/gitlab/arturbosch/detekt/api/FileProcessListener.kt @@ -28,7 +28,7 @@ interface FileProcessListener : Extension { * Called when processing of a file completes. * This method is called from a thread pool thread. Heavy computations allowed. */ - fun onProcessComplete(file: KtFile, findings: Map>, bindingContext: BindingContext) {} + fun onProcessComplete(file: KtFile, findings: List, bindingContext: BindingContext) {} /** * Mainly use this method to save computed metrics from KtFile's to the {@link Detektion} container. diff --git a/detekt-api/src/main/kotlin/io/gitlab/arturbosch/detekt/api/ReportingExtension.kt b/detekt-api/src/main/kotlin/io/gitlab/arturbosch/detekt/api/ReportingExtension.kt index 04144fdd56a..ac659b97816 100644 --- a/detekt-api/src/main/kotlin/io/gitlab/arturbosch/detekt/api/ReportingExtension.kt +++ b/detekt-api/src/main/kotlin/io/gitlab/arturbosch/detekt/api/ReportingExtension.kt @@ -16,7 +16,7 @@ interface ReportingExtension : Extension { /** * Allows to transform the reported findings e.g. apply custom filtering. */ - fun transformFindings(findings: Map>): Map> = findings + fun transformFindings(findings: List): List = findings /** * Is called after all extensions's [transformFindings] were called. diff --git a/detekt-api/src/testFixtures/kotlin/io/gitlab/arturbosch/detekt/test/TestDetektion.kt b/detekt-api/src/testFixtures/kotlin/io/gitlab/arturbosch/detekt/test/TestDetektion.kt index c7a6681d2c8..850ffe75abf 100644 --- a/detekt-api/src/testFixtures/kotlin/io/gitlab/arturbosch/detekt/test/TestDetektion.kt +++ b/detekt-api/src/testFixtures/kotlin/io/gitlab/arturbosch/detekt/test/TestDetektion.kt @@ -4,7 +4,6 @@ import io.gitlab.arturbosch.detekt.api.Detektion import io.gitlab.arturbosch.detekt.api.Finding2 import io.gitlab.arturbosch.detekt.api.Notification import io.gitlab.arturbosch.detekt.api.ProjectMetric -import io.gitlab.arturbosch.detekt.api.RuleSet import org.jetbrains.kotlin.com.intellij.openapi.util.Key import org.jetbrains.kotlin.com.intellij.openapi.util.UserDataHolderBase @@ -14,7 +13,7 @@ class TestDetektion( notifications: List = emptyList(), ) : Detektion, UserDataHolderBase() { - override val findings: Map> = findings.groupBy { it.ruleInfo.ruleSetId } + override val findings: List = findings.toList() override val metrics: Collection get() = _metrics override val notifications: List get() = _notifications diff --git a/detekt-compiler-plugin/src/main/kotlin/io/github/detekt/compiler/plugin/internal/MessageCollectorExtensions.kt b/detekt-compiler-plugin/src/main/kotlin/io/github/detekt/compiler/plugin/internal/MessageCollectorExtensions.kt index 5088c5b9b45..ff485720337 100644 --- a/detekt-compiler-plugin/src/main/kotlin/io/github/detekt/compiler/plugin/internal/MessageCollectorExtensions.kt +++ b/detekt-compiler-plugin/src/main/kotlin/io/github/detekt/compiler/plugin/internal/MessageCollectorExtensions.kt @@ -21,7 +21,7 @@ fun MessageCollector.error(msg: String) { } fun MessageCollector.reportFindings(result: Detektion) { - for (finding in result.findings.values.flatten()) { + result.findings.forEach { finding -> val (message, location) = finding.renderAsCompilerWarningMessage() warn(message, location) } diff --git a/detekt-core/src/main/kotlin/io/gitlab/arturbosch/detekt/core/Analyzer.kt b/detekt-core/src/main/kotlin/io/gitlab/arturbosch/detekt/core/Analyzer.kt index 996b786aea0..a2a6dbcf2eb 100644 --- a/detekt-core/src/main/kotlin/io/gitlab/arturbosch/detekt/core/Analyzer.kt +++ b/detekt-core/src/main/kotlin/io/gitlab/arturbosch/detekt/core/Analyzer.kt @@ -18,7 +18,6 @@ import io.gitlab.arturbosch.detekt.api.internal.isSuppressedBy import io.gitlab.arturbosch.detekt.api.internal.whichDetekt import io.gitlab.arturbosch.detekt.api.internal.whichJava import io.gitlab.arturbosch.detekt.api.internal.whichOS -import io.gitlab.arturbosch.detekt.core.rules.associateRuleIdsToRuleSetIds import io.gitlab.arturbosch.detekt.core.suppressors.buildSuppressors import io.gitlab.arturbosch.detekt.core.util.isActiveOrDefault import io.gitlab.arturbosch.detekt.core.util.shouldAnalyzeFile @@ -28,8 +27,6 @@ import org.jetbrains.kotlin.resolve.BindingContext import org.jetbrains.kotlin.resolve.calls.smartcasts.DataFlowValueFactoryImpl import kotlin.reflect.full.hasAnnotation -private typealias FindingsResult = List>> - internal class Analyzer( private val settings: ProcessingSettings, private val providers: List, @@ -38,39 +35,31 @@ internal class Analyzer( fun run( ktFiles: Collection, bindingContext: BindingContext = BindingContext.EMPTY - ): Map> { + ): List { val languageVersionSettings = settings.environment.configuration.languageVersionSettings val dataFlowValueFactory = DataFlowValueFactoryImpl(languageVersionSettings) val compilerResources = CompilerResources(languageVersionSettings, dataFlowValueFactory) - val findingsPerFile: FindingsResult = - if (settings.spec.executionSpec.parallelAnalysis) { - runAsync(ktFiles, bindingContext, compilerResources) - } else { - runSync(ktFiles, bindingContext, compilerResources) - } - if (bindingContext == BindingContext.EMPTY) { warnAboutEnabledRequiresTypeResolutionRules() } - - val findingsPerRuleSet = HashMap>() - for (findings in findingsPerFile) { - findingsPerRuleSet.mergeSmells(findings) + return if (settings.spec.executionSpec.parallelAnalysis) { + runAsync(ktFiles, bindingContext, compilerResources) + } else { + runSync(ktFiles, bindingContext, compilerResources) } - return findingsPerRuleSet } private fun runSync( ktFiles: Collection, bindingContext: BindingContext, compilerResources: CompilerResources - ): FindingsResult = - ktFiles.map { file -> + ): List = + ktFiles.flatMap { file -> processors.forEach { it.onProcess(file, bindingContext) } val findings = runCatching { analyze(file, bindingContext, compilerResources) } .onFailure { throwIllegalStateException(file, it) } - .getOrDefault(emptyMap()) + .getOrDefault(emptyList()) processors.forEach { it.onProcessComplete(file, findings, bindingContext) } findings } @@ -79,9 +68,9 @@ internal class Analyzer( ktFiles: Collection, bindingContext: BindingContext, compilerResources: CompilerResources - ): FindingsResult { + ): List { val service = settings.taskPool - val tasks: TaskList>?> = ktFiles.map { file -> + val tasks: TaskList?> = ktFiles.map { file -> service.task { processors.forEach { it.onProcess(file, bindingContext) } val findings = analyze(file, bindingContext, compilerResources) @@ -89,24 +78,19 @@ internal class Analyzer( findings }.recover { throwIllegalStateException(file, it) } } - return awaitAll(tasks).filterNotNull() + return awaitAll(tasks).filterNotNull().flatten() } private fun analyze( file: KtFile, bindingContext: BindingContext, compilerResources: CompilerResources - ): Map> { + ): List { val activeRuleSetsToRuleSetConfigs = providers.asSequence() .map { it to settings.config.subConfig(it.ruleSetId.value) } .filter { (_, ruleSetConfig) -> ruleSetConfig.isActiveOrDefault(true) } .map { (provider, ruleSetConfig) -> provider.instance() to ruleSetConfig } .filter { (_, ruleSetConfig) -> ruleSetConfig.shouldAnalyzeFile(file) } - .toList() - - val ruleIdsToRuleSetIds = associateRuleIdsToRuleSetIds( - activeRuleSetsToRuleSetConfigs.map { (ruleSet, _) -> ruleSet } - ) val (correctableRules, otherRules) = activeRuleSetsToRuleSetConfigs .flatMap { (ruleSet, ruleSetConfig) -> @@ -126,26 +110,11 @@ internal class Analyzer( } .partition { (_, rule) -> rule.autoCorrect } - val result = HashMap>() - - fun executeRules(rules: List>) { - for ((ruleInfo, rule) in rules) { - val findings = rule.visitFile(file, bindingContext, compilerResources) - .filterSuppressedFindings(rule, bindingContext) - for (finding in findings) { - val mappedRuleSet = checkNotNull(ruleIdsToRuleSetIds[rule.ruleId]) { - "Mapping for '${rule.ruleId}' expected." - } - result.computeIfAbsent(mappedRuleSet) { mutableListOf() } - .add(finding.toFinding2(ruleInfo, rule.computeSeverity())) - } - } + return (correctableRules + otherRules).flatMap { (ruleInfo, rule) -> + rule.visitFile(file, bindingContext, compilerResources) + .filterSuppressedFindings(rule, bindingContext) + .map { it.toFinding2(ruleInfo, rule.computeSeverity()) } } - - executeRules(correctableRules) - executeRules(otherRules) - - return result } private fun warnAboutEnabledRequiresTypeResolutionRules() { @@ -176,12 +145,6 @@ private fun List.filterSuppressedFindings(rule: Rule, bindingContext: B } } -private fun MutableMap>.mergeSmells(other: Map>) { - for ((key, findings) in other.entries) { - merge(key, findings) { f1, f2 -> f1.plus(f2) } - } -} - private fun throwIllegalStateException(file: KtFile, error: Throwable): Nothing { val message = """ Analyzing ${file.absolutePath()} led to an exception. diff --git a/detekt-core/src/main/kotlin/io/gitlab/arturbosch/detekt/core/DelegatingResult.kt b/detekt-core/src/main/kotlin/io/gitlab/arturbosch/detekt/core/DelegatingResult.kt index 3a0a4d31d4e..e78ce03603d 100644 --- a/detekt-core/src/main/kotlin/io/gitlab/arturbosch/detekt/core/DelegatingResult.kt +++ b/detekt-core/src/main/kotlin/io/gitlab/arturbosch/detekt/core/DelegatingResult.kt @@ -2,9 +2,8 @@ package io.gitlab.arturbosch.detekt.core import io.gitlab.arturbosch.detekt.api.Detektion import io.gitlab.arturbosch.detekt.api.Finding2 -import io.gitlab.arturbosch.detekt.api.RuleSet class DelegatingResult( result: Detektion, - override val findings: Map> + override val findings: List ) : Detektion by result diff --git a/detekt-core/src/main/kotlin/io/gitlab/arturbosch/detekt/core/DetektResult.kt b/detekt-core/src/main/kotlin/io/gitlab/arturbosch/detekt/core/DetektResult.kt index a2cddaa0c17..e6ee581cc26 100644 --- a/detekt-core/src/main/kotlin/io/gitlab/arturbosch/detekt/core/DetektResult.kt +++ b/detekt-core/src/main/kotlin/io/gitlab/arturbosch/detekt/core/DetektResult.kt @@ -4,11 +4,10 @@ import io.gitlab.arturbosch.detekt.api.Detektion import io.gitlab.arturbosch.detekt.api.Finding2 import io.gitlab.arturbosch.detekt.api.Notification import io.gitlab.arturbosch.detekt.api.ProjectMetric -import io.gitlab.arturbosch.detekt.api.RuleSet import org.jetbrains.kotlin.com.intellij.openapi.util.UserDataHolderBase @Suppress("DataClassShouldBeImmutable") -data class DetektResult(override val findings: Map>) : Detektion, UserDataHolderBase() { +data class DetektResult(override val findings: List) : Detektion, UserDataHolderBase() { private val _notifications = ArrayList() override val notifications: Collection = _notifications diff --git a/detekt-core/src/main/kotlin/io/gitlab/arturbosch/detekt/core/baseline/BaselineFilteredResult.kt b/detekt-core/src/main/kotlin/io/gitlab/arturbosch/detekt/core/baseline/BaselineFilteredResult.kt index 58063b5f6e9..53f1ee533ee 100644 --- a/detekt-core/src/main/kotlin/io/gitlab/arturbosch/detekt/core/baseline/BaselineFilteredResult.kt +++ b/detekt-core/src/main/kotlin/io/gitlab/arturbosch/detekt/core/baseline/BaselineFilteredResult.kt @@ -3,13 +3,11 @@ package io.gitlab.arturbosch.detekt.core.baseline import io.github.detekt.tooling.api.Baseline import io.gitlab.arturbosch.detekt.api.Detektion import io.gitlab.arturbosch.detekt.api.Finding2 -import io.gitlab.arturbosch.detekt.api.RuleSet internal class BaselineFilteredResult( result: Detektion, private val baseline: Baseline, ) : Detektion by result { - override val findings: Map> = result.findings - .mapValues { (_, findings) -> findings.filterNot { baseline.contains(it.baselineId) } } + override val findings: List = result.findings.filterNot { baseline.contains(it.baselineId) } } diff --git a/detekt-core/src/main/kotlin/io/gitlab/arturbosch/detekt/core/baseline/BaselineResultMapping.kt b/detekt-core/src/main/kotlin/io/gitlab/arturbosch/detekt/core/baseline/BaselineResultMapping.kt index 4d8f89534a7..df96ebe252b 100644 --- a/detekt-core/src/main/kotlin/io/gitlab/arturbosch/detekt/core/baseline/BaselineResultMapping.kt +++ b/detekt-core/src/main/kotlin/io/gitlab/arturbosch/detekt/core/baseline/BaselineResultMapping.kt @@ -2,7 +2,6 @@ package io.gitlab.arturbosch.detekt.core.baseline import io.gitlab.arturbosch.detekt.api.Finding2 import io.gitlab.arturbosch.detekt.api.ReportingExtension -import io.gitlab.arturbosch.detekt.api.RuleSet import io.gitlab.arturbosch.detekt.api.SetupContext import io.gitlab.arturbosch.detekt.api.getOrNull import io.gitlab.arturbosch.detekt.core.DetektResult @@ -20,7 +19,7 @@ class BaselineResultMapping : ReportingExtension { createBaseline = context.getOrNull(DETEKT_BASELINE_CREATION_KEY) ?: false } - override fun transformFindings(findings: Map>): Map> { + override fun transformFindings(findings: List): List { val baselineFile = baselineFile require(!createBaseline || (createBaseline && baselineFile != null)) { "Invalid baseline options invariant." @@ -29,14 +28,13 @@ class BaselineResultMapping : ReportingExtension { return baselineFile?.let { findings.transformWithBaseline(it) } ?: findings } - private fun Map>.transformWithBaseline( + private fun List.transformWithBaseline( baselinePath: Path, - ): Map> { + ): List { val facade = BaselineFacade() - val flatten = this.flatMap { it.value } if (createBaseline) { - facade.createOrUpdate(baselinePath, flatten) + facade.createOrUpdate(baselinePath, this) } return facade.transformResult(baselinePath, DetektResult(this)).findings diff --git a/detekt-core/src/main/kotlin/io/gitlab/arturbosch/detekt/core/config/FailurePolicies.kt b/detekt-core/src/main/kotlin/io/gitlab/arturbosch/detekt/core/config/FailurePolicies.kt index 5b9d7866fcb..03df7a9c00c 100644 --- a/detekt-core/src/main/kotlin/io/gitlab/arturbosch/detekt/core/config/FailurePolicies.kt +++ b/detekt-core/src/main/kotlin/io/gitlab/arturbosch/detekt/core/config/FailurePolicies.kt @@ -23,7 +23,6 @@ private fun Detektion.checkForIssuesWithSeverity(config: Config, minSeverity: Se private fun Detektion.computeIssueCount(config: Config, minSeverity: Severity): Int = filterAutoCorrectedIssues(config) - .flatMap { it.value } .count { it.severity.isAtLeast(minSeverity) } private fun Severity.isAtLeast(severity: Severity): Boolean = this.ordinal <= severity.ordinal diff --git a/detekt-core/src/main/kotlin/io/gitlab/arturbosch/detekt/core/reporting/Reporting.kt b/detekt-core/src/main/kotlin/io/gitlab/arturbosch/detekt/core/reporting/Reporting.kt index e9c2d23bba5..8a20c1d5d26 100644 --- a/detekt-core/src/main/kotlin/io/gitlab/arturbosch/detekt/core/reporting/Reporting.kt +++ b/detekt-core/src/main/kotlin/io/gitlab/arturbosch/detekt/core/reporting/Reporting.kt @@ -4,7 +4,6 @@ import io.gitlab.arturbosch.detekt.api.Config import io.gitlab.arturbosch.detekt.api.Detektion import io.gitlab.arturbosch.detekt.api.Finding2 import io.gitlab.arturbosch.detekt.api.OutputReport -import io.gitlab.arturbosch.detekt.api.RuleSet import io.gitlab.arturbosch.detekt.api.internal.BuiltInOutputReport internal fun defaultReportMapping(report: OutputReport) = @@ -35,21 +34,16 @@ private val messageReplacementRegex = Regex("\\s+") fun Config.excludeCorrectable(): Boolean = subConfig(BUILD).valueOrDefault(EXCLUDE_CORRECTABLE, false) -fun Detektion.filterEmptyIssues(config: Config): Map> { +fun Detektion.filterEmptyIssues(config: Config): List { return this .filterAutoCorrectedIssues(config) - .filter { it.value.isNotEmpty() } } -fun Detektion.filterAutoCorrectedIssues(config: Config): Map> { +fun Detektion.filterAutoCorrectedIssues(config: Config): List { if (!config.excludeCorrectable()) { return findings } - val filteredFindings = HashMap>() - findings.forEach { (ruleSetId, findingsList) -> - filteredFindings[ruleSetId] = findingsList.filter { finding -> !finding.autoCorrectEnabled } - } - return filteredFindings + return findings.filter { finding -> !finding.autoCorrectEnabled } } private fun Finding2.truncatedMessage(): String { diff --git a/detekt-core/src/main/kotlin/io/gitlab/arturbosch/detekt/core/reporting/console/AbstractFindingsReport.kt b/detekt-core/src/main/kotlin/io/gitlab/arturbosch/detekt/core/reporting/console/AbstractFindingsReport.kt index 0f81e530f08..3163a53dda3 100644 --- a/detekt-core/src/main/kotlin/io/gitlab/arturbosch/detekt/core/reporting/console/AbstractFindingsReport.kt +++ b/detekt-core/src/main/kotlin/io/gitlab/arturbosch/detekt/core/reporting/console/AbstractFindingsReport.kt @@ -4,7 +4,6 @@ import io.gitlab.arturbosch.detekt.api.Config import io.gitlab.arturbosch.detekt.api.ConsoleReport import io.gitlab.arturbosch.detekt.api.Detektion import io.gitlab.arturbosch.detekt.api.Finding2 -import io.gitlab.arturbosch.detekt.api.RuleSet import io.gitlab.arturbosch.detekt.core.reporting.filterEmptyIssues abstract class AbstractFindingsReport : ConsoleReport() { @@ -25,5 +24,5 @@ abstract class AbstractFindingsReport : ConsoleReport() { return render(findings) } - abstract fun render(findings: Map>): String + abstract fun render(findings: List): String } diff --git a/detekt-core/src/main/kotlin/io/gitlab/arturbosch/detekt/core/reporting/console/FileBasedFindingsReport.kt b/detekt-core/src/main/kotlin/io/gitlab/arturbosch/detekt/core/reporting/console/FileBasedFindingsReport.kt index 338519e6353..c62ef3eecc3 100644 --- a/detekt-core/src/main/kotlin/io/gitlab/arturbosch/detekt/core/reporting/console/FileBasedFindingsReport.kt +++ b/detekt-core/src/main/kotlin/io/gitlab/arturbosch/detekt/core/reporting/console/FileBasedFindingsReport.kt @@ -1,7 +1,6 @@ package io.gitlab.arturbosch.detekt.core.reporting.console import io.gitlab.arturbosch.detekt.api.Finding2 -import io.gitlab.arturbosch.detekt.api.RuleSet import io.gitlab.arturbosch.detekt.core.reporting.printFindings /** @@ -12,10 +11,8 @@ class FileBasedFindingsReport : AbstractFindingsReport() { override val id: String = "FileBasedFindingsReport" - override fun render(findings: Map>): String { - val findingsPerFile = findings.values - .flatten() - .groupBy { it.entity.location.filePath.absolutePath.toString() } + override fun render(findings: List): String { + val findingsPerFile = findings.groupBy { it.entity.location.filePath.absolutePath.toString() } return printFindings(findingsPerFile) } } diff --git a/detekt-core/src/main/kotlin/io/gitlab/arturbosch/detekt/core/reporting/console/FindingsReport.kt b/detekt-core/src/main/kotlin/io/gitlab/arturbosch/detekt/core/reporting/console/FindingsReport.kt index 9f8772032be..82854cb6b3c 100644 --- a/detekt-core/src/main/kotlin/io/gitlab/arturbosch/detekt/core/reporting/console/FindingsReport.kt +++ b/detekt-core/src/main/kotlin/io/gitlab/arturbosch/detekt/core/reporting/console/FindingsReport.kt @@ -1,7 +1,6 @@ package io.gitlab.arturbosch.detekt.core.reporting.console import io.gitlab.arturbosch.detekt.api.Finding2 -import io.gitlab.arturbosch.detekt.api.RuleSet import io.gitlab.arturbosch.detekt.core.reporting.printFindings /** @@ -12,7 +11,7 @@ class FindingsReport : AbstractFindingsReport() { override val id: String = "FindingsReport" - override fun render(findings: Map>): String { - return printFindings(findings.mapKeys { (key, _) -> key.value }) + override fun render(findings: List): String { + return printFindings(findings.groupBy { it.ruleInfo.ruleSetId }.mapKeys { (key, _) -> key.value }) } } diff --git a/detekt-core/src/main/kotlin/io/gitlab/arturbosch/detekt/core/reporting/console/LiteFindingsReport.kt b/detekt-core/src/main/kotlin/io/gitlab/arturbosch/detekt/core/reporting/console/LiteFindingsReport.kt index 9d204e585ee..1c0047ff042 100644 --- a/detekt-core/src/main/kotlin/io/gitlab/arturbosch/detekt/core/reporting/console/LiteFindingsReport.kt +++ b/detekt-core/src/main/kotlin/io/gitlab/arturbosch/detekt/core/reporting/console/LiteFindingsReport.kt @@ -1,7 +1,6 @@ package io.gitlab.arturbosch.detekt.core.reporting.console import io.gitlab.arturbosch.detekt.api.Finding2 -import io.gitlab.arturbosch.detekt.api.RuleSet /** * A lightweight versions of the console report, where each line contains location, messages and issue id only. @@ -11,9 +10,9 @@ class LiteFindingsReport : AbstractFindingsReport() { override val id: String = "LiteFindingsReport" - override fun render(findings: Map>): String { + override fun render(findings: List): String { return buildString { - findings.values.flatten().forEach { finding -> + findings.forEach { finding -> append("${finding.location.compact()}: ${finding.message} [${finding.ruleInfo.id}]") appendLine() } diff --git a/detekt-core/src/main/kotlin/io/gitlab/arturbosch/detekt/core/rules/RuleSets.kt b/detekt-core/src/main/kotlin/io/gitlab/arturbosch/detekt/core/rules/RuleSets.kt index 52bf5bea810..0629f2942d6 100644 --- a/detekt-core/src/main/kotlin/io/gitlab/arturbosch/detekt/core/rules/RuleSets.kt +++ b/detekt-core/src/main/kotlin/io/gitlab/arturbosch/detekt/core/rules/RuleSets.kt @@ -1,19 +1,9 @@ package io.gitlab.arturbosch.detekt.core.rules import io.github.detekt.tooling.api.spec.RulesSpec -import io.gitlab.arturbosch.detekt.api.Rule -import io.gitlab.arturbosch.detekt.api.RuleSet import io.gitlab.arturbosch.detekt.api.RuleSetProvider import io.gitlab.arturbosch.detekt.core.ProcessingSettings -fun associateRuleIdsToRuleSetIds(ruleSets: List): Map { - return ruleSets - .flatMap { ruleSet -> - ruleSet.rules.map { (ruleId, _) -> ruleId to ruleSet.id } - } - .toMap() -} - fun ProcessingSettings.createRuleProviders(): List = when (val runPolicy = spec.rulesSpec.runPolicy) { RulesSpec.RunPolicy.NoRestrictions -> RuleSetLocator(this).load() is RulesSpec.RunPolicy.RestrictToSingleRule -> { diff --git a/detekt-core/src/main/kotlin/io/gitlab/arturbosch/detekt/core/tooling/Lifecycle.kt b/detekt-core/src/main/kotlin/io/gitlab/arturbosch/detekt/core/tooling/Lifecycle.kt index a7d39fcdaf9..11e203fb7cb 100644 --- a/detekt-core/src/main/kotlin/io/gitlab/arturbosch/detekt/core/tooling/Lifecycle.kt +++ b/detekt-core/src/main/kotlin/io/gitlab/arturbosch/detekt/core/tooling/Lifecycle.kt @@ -3,8 +3,6 @@ package io.gitlab.arturbosch.detekt.core.tooling import io.gitlab.arturbosch.detekt.api.Config import io.gitlab.arturbosch.detekt.api.Detektion import io.gitlab.arturbosch.detekt.api.FileProcessListener -import io.gitlab.arturbosch.detekt.api.Finding2 -import io.gitlab.arturbosch.detekt.api.RuleSet import io.gitlab.arturbosch.detekt.api.RuleSetProvider import io.gitlab.arturbosch.detekt.core.Analyzer import io.gitlab.arturbosch.detekt.core.DetektResult @@ -42,8 +40,8 @@ internal interface Lifecycle { val result = measure(Phase.Analyzer) { val analyzer = Analyzer(settings, ruleSets, processors) processors.forEach { it.onStart(filesToAnalyze, bindingContext) } - val findings: Map> = analyzer.run(filesToAnalyze, bindingContext) - val result: Detektion = DetektResult(findings.toSortedMap { o1, o2 -> o1.value.compareTo(o2.value) }) + val findings = analyzer.run(filesToAnalyze, bindingContext) + val result: Detektion = DetektResult(findings) processors.forEach { it.onFinish(filesToAnalyze, result, bindingContext) } result } diff --git a/detekt-core/src/test/kotlin/io/gitlab/arturbosch/detekt/core/AnalyzerSpec.kt b/detekt-core/src/test/kotlin/io/gitlab/arturbosch/detekt/core/AnalyzerSpec.kt index 6b2e97190de..fb570355526 100644 --- a/detekt-core/src/test/kotlin/io/gitlab/arturbosch/detekt/core/AnalyzerSpec.kt +++ b/detekt-core/src/test/kotlin/io/gitlab/arturbosch/detekt/core/AnalyzerSpec.kt @@ -21,7 +21,6 @@ import org.junit.jupiter.api.Nested import org.junit.jupiter.api.Test import org.junit.jupiter.params.ParameterizedTest import org.junit.jupiter.params.provider.ValueSource -import java.util.concurrent.CompletionException import kotlin.io.path.Path @KotlinCoreEnvironmentTest @@ -45,9 +44,8 @@ class AnalyzerSpec(val env: KotlinCoreEnvironment) { ) val analyzer = Analyzer(settings, listOf(CustomRuleSetProvider()), emptyList()) - assertThatThrownBy { - settings.use { analyzer.run(listOf(compileForTest(testFile))) } - }.isInstanceOf(IllegalStateException::class.java) + assertThatThrownBy { settings.use { analyzer.run(listOf(compileForTest(testFile))) } } + .isInstanceOf(IllegalStateException::class.java) } @Test @@ -72,8 +70,7 @@ class AnalyzerSpec(val env: KotlinCoreEnvironment) { val analyzer = Analyzer(settings, listOf(CustomRuleSetProvider()), emptyList()) assertThatThrownBy { settings.use { analyzer.run(listOf(compileForTest(testFile))) } } - .isInstanceOf(CompletionException::class.java) - .hasCauseInstanceOf(IllegalStateException::class.java) + .isInstanceOf(IllegalStateException::class.java) } } @@ -101,7 +98,7 @@ class AnalyzerSpec(val env: KotlinCoreEnvironment) { ) val analyzer = Analyzer(settings, listOf(CustomRuleSetProvider()), emptyList()) - assertThat(settings.use { analyzer.run(listOf(compileForTest(testFile))) }.values.flatten()).isEmpty() + assertThat(settings.use { analyzer.run(listOf(compileForTest(testFile))) }).isEmpty() assertThat(output.toString()).isEqualTo( "The rule 'RequiresTypeResolutionMaxLineLength' requires type resolution but it was run without it.\n" ) @@ -128,7 +125,7 @@ class AnalyzerSpec(val env: KotlinCoreEnvironment) { ) val analyzer = Analyzer(settings, listOf(CustomRuleSetProvider()), emptyList()) - assertThat(settings.use { analyzer.run(listOf(compileForTest(testFile))) }.values.flatten()).hasSize(1) + assertThat(settings.use { analyzer.run(listOf(compileForTest(testFile))) }).hasSize(1) assertThat(output.toString()).isEqualTo( "The rule 'RequiresTypeResolutionMaxLineLength' requires type resolution but it was run without it.\n" ) @@ -157,7 +154,7 @@ class AnalyzerSpec(val env: KotlinCoreEnvironment) { val ktFile = compileForTest(testFile) val bindingContext = env.getContextForPaths(listOf(ktFile)) - assertThat(settings.use { analyzer.run(listOf(ktFile), bindingContext) }.values.flatten()).hasSize(2) + assertThat(settings.use { analyzer.run(listOf(ktFile), bindingContext) }).hasSize(2) assertThat(output.toString()).isEmpty() } @@ -181,7 +178,7 @@ class AnalyzerSpec(val env: KotlinCoreEnvironment) { ) val analyzer = Analyzer(settings, listOf(CustomRuleSetProvider()), emptyList()) - assertThat(settings.use { analyzer.run(listOf(compileForTest(testFile))) }.values.flatten()).isEmpty() + assertThat(settings.use { analyzer.run(listOf(compileForTest(testFile))) }).isEmpty() assertThat(output.toString()).isEmpty() } @@ -353,8 +350,6 @@ class AnalyzerSpec(val env: KotlinCoreEnvironment) { .use { settings -> Analyzer(settings, listOf(CustomRuleSetProvider()), emptyList()) .run(listOf(compileContentForTest("", root, Path(path)))) - .values - .flatten() .isNotEmpty() } } diff --git a/detekt-core/src/test/kotlin/io/gitlab/arturbosch/detekt/core/baseline/BaselineFilteredResultSpec.kt b/detekt-core/src/test/kotlin/io/gitlab/arturbosch/detekt/core/baseline/BaselineFilteredResultSpec.kt index f4636ebe9eb..12d512a8867 100644 --- a/detekt-core/src/test/kotlin/io/gitlab/arturbosch/detekt/core/baseline/BaselineFilteredResultSpec.kt +++ b/detekt-core/src/test/kotlin/io/gitlab/arturbosch/detekt/core/baseline/BaselineFilteredResultSpec.kt @@ -12,18 +12,9 @@ class BaselineFilteredResultSpec { private val baselineFile = resourceAsPath("/baseline_feature/valid-baseline.xml") private val result = TestDetektion( - createFinding( - ruleName = "LongParameterList", - entity = createEntity(signature = "Signature"), - ), - createFinding( - ruleName = "LongMethod", - entity = createEntity(signature = "Signature"), - ), - createFinding( - ruleName = "FeatureEnvy", - entity = createEntity(signature = "Signature"), - ), + createFinding("LongParameterList", createEntity(signature = "Signature")), + createFinding("LongMethod", createEntity(signature = "Signature")), + createFinding("FeatureEnvy", createEntity(signature = "Signature")), ) @Test @@ -36,8 +27,6 @@ class BaselineFilteredResultSpec { fun `filters with an existing baseline file`() { val baseline = DefaultBaseline.load(baselineFile) val actual = BaselineFilteredResult(result, baseline) - // Note: Detektion works with Map - // but the TestDetektion maps the RuleId as RuleSetId - actual.findings.forEach { (_, value) -> assertThat(value).isEmpty() } + assertThat(actual.findings).isEmpty() } } diff --git a/detekt-core/src/test/kotlin/io/gitlab/arturbosch/detekt/core/baseline/BaselineResultMappingSpec.kt b/detekt-core/src/test/kotlin/io/gitlab/arturbosch/detekt/core/baseline/BaselineResultMappingSpec.kt index f7b9feec1b8..d59642fb753 100644 --- a/detekt-core/src/test/kotlin/io/gitlab/arturbosch/detekt/core/baseline/BaselineResultMappingSpec.kt +++ b/detekt-core/src/test/kotlin/io/gitlab/arturbosch/detekt/core/baseline/BaselineResultMappingSpec.kt @@ -4,11 +4,10 @@ import io.github.detekt.test.utils.NullPrintStream import io.github.detekt.test.utils.createTempDirectoryForTest import io.github.detekt.test.utils.resourceAsPath import io.gitlab.arturbosch.detekt.api.Config -import io.gitlab.arturbosch.detekt.api.Finding2 -import io.gitlab.arturbosch.detekt.api.RuleSet import io.gitlab.arturbosch.detekt.api.SetupContext import io.gitlab.arturbosch.detekt.test.createEntity import io.gitlab.arturbosch.detekt.test.createFinding +import io.gitlab.arturbosch.detekt.test.createRuleInfo import org.assertj.core.api.Assertions.assertThat import org.junit.jupiter.api.AfterEach import org.junit.jupiter.api.Test @@ -23,11 +22,12 @@ class BaselineResultMappingSpec { private val dir = createTempDirectoryForTest("baseline_format") private val baselineFile = dir.resolve("baseline.xml") private val existingBaselineFile = resourceAsPath("/baseline_feature/valid-baseline.xml") - private val finding: Finding2 = createFinding( - ruleName = "SomeIssueId", - entity = createEntity(signature = "SomeSignature"), + private val findings = listOf( + createFinding( + ruleInfo = createRuleInfo("SomeIssueId", "RuleSet"), + entity = createEntity(signature = "SomeSignature"), + ) ) - private val findings: Map> = mapOf(RuleSet.Id("RuleSet") to listOf(finding)) @AfterEach fun tearDown() { @@ -41,7 +41,7 @@ class BaselineResultMappingSpec { createBaseline = true, ) - mapping.transformFindings(emptyMap()) + mapping.transformFindings(emptyList()) assertThat(baselineFile).doesNotExist() } diff --git a/detekt-core/src/test/kotlin/io/gitlab/arturbosch/detekt/core/reporting/OutputFacadeSpec.kt b/detekt-core/src/test/kotlin/io/gitlab/arturbosch/detekt/core/reporting/OutputFacadeSpec.kt index 58b1c4f5545..d2d8b8f130a 100644 --- a/detekt-core/src/test/kotlin/io/gitlab/arturbosch/detekt/core/reporting/OutputFacadeSpec.kt +++ b/detekt-core/src/test/kotlin/io/gitlab/arturbosch/detekt/core/reporting/OutputFacadeSpec.kt @@ -7,11 +7,11 @@ import io.github.detekt.report.xml.XmlOutputReport import io.github.detekt.test.utils.StringPrintStream import io.github.detekt.test.utils.createTempFileForTest import io.github.detekt.test.utils.resourceAsPath -import io.gitlab.arturbosch.detekt.api.RuleSet import io.gitlab.arturbosch.detekt.core.DetektResult import io.gitlab.arturbosch.detekt.core.createNullLoggingSpec import io.gitlab.arturbosch.detekt.core.tooling.withSettings import io.gitlab.arturbosch.detekt.test.createFinding +import io.gitlab.arturbosch.detekt.test.createRuleInfo import org.assertj.core.api.Assertions.assertThat import org.junit.jupiter.api.Test import java.nio.file.Path @@ -22,7 +22,7 @@ class OutputFacadeSpec { fun `Running the output facade with multiple reports`() { val printStream = StringPrintStream() val inputPath: Path = resourceAsPath("/cases") - val defaultResult = DetektResult(mapOf(RuleSet.Id("Key") to listOf(createFinding()))) + val defaultResult = DetektResult(listOf(createFinding(createRuleInfo(ruleSetId = "Key")))) val plainOutputPath = createTempFileForTest("detekt", ".txt") val htmlOutputPath = createTempFileForTest("detekt", ".html") val xmlOutputPath = createTempFileForTest("detekt", ".xml") diff --git a/detekt-core/src/test/kotlin/io/gitlab/arturbosch/detekt/core/reporting/console/ComplexityReportSpec.kt b/detekt-core/src/test/kotlin/io/gitlab/arturbosch/detekt/core/reporting/console/ComplexityReportSpec.kt index 34bf7d68c6c..520640ab578 100644 --- a/detekt-core/src/test/kotlin/io/gitlab/arturbosch/detekt/core/reporting/console/ComplexityReportSpec.kt +++ b/detekt-core/src/test/kotlin/io/gitlab/arturbosch/detekt/core/reporting/console/ComplexityReportSpec.kt @@ -8,9 +8,9 @@ import io.github.detekt.metrics.processors.logicalLinesKey import io.github.detekt.metrics.processors.sourceLinesKey import io.github.detekt.test.utils.readResourceContent import io.gitlab.arturbosch.detekt.api.Detektion -import io.gitlab.arturbosch.detekt.api.RuleSet import io.gitlab.arturbosch.detekt.core.DetektResult import io.gitlab.arturbosch.detekt.test.createFinding +import io.gitlab.arturbosch.detekt.test.createRuleInfo import org.assertj.core.api.Assertions.assertThat import org.junit.jupiter.api.Test @@ -33,7 +33,7 @@ class ComplexityReportSpec { } } -private fun createDetektion(): Detektion = DetektResult(mapOf(RuleSet.Id("Key") to listOf(createFinding()))) +private fun createDetektion(): Detektion = DetektResult(listOf(createFinding(createRuleInfo(ruleSetId = "Key")))) private fun addData(detektion: Detektion) { detektion.putUserData(complexityKey, 2) diff --git a/detekt-metrics/src/main/kotlin/io/github/detekt/metrics/ComplexityMetric.kt b/detekt-metrics/src/main/kotlin/io/github/detekt/metrics/ComplexityMetric.kt index 604028050ef..3f0a8fedcf3 100644 --- a/detekt-metrics/src/main/kotlin/io/github/detekt/metrics/ComplexityMetric.kt +++ b/detekt-metrics/src/main/kotlin/io/github/detekt/metrics/ComplexityMetric.kt @@ -15,5 +15,5 @@ class ComplexityMetric(detektion: Detektion) { val sloc = detektion.getUserData(sourceLinesKey) val lloc = detektion.getUserData(logicalLinesKey) val cloc = detektion.getUserData(commentLinesKey) - val findings = detektion.findings.entries + val findingsCount = detektion.findings.size } diff --git a/detekt-metrics/src/main/kotlin/io/github/detekt/metrics/ComplexityReportGenerator.kt b/detekt-metrics/src/main/kotlin/io/github/detekt/metrics/ComplexityReportGenerator.kt index dff775deb4f..82503456185 100644 --- a/detekt-metrics/src/main/kotlin/io/github/detekt/metrics/ComplexityReportGenerator.kt +++ b/detekt-metrics/src/main/kotlin/io/github/detekt/metrics/ComplexityReportGenerator.kt @@ -36,7 +36,7 @@ class ComplexityReportGenerator(private val complexityMetric: ComplexityMetric) complexityMetric.lloc == null || complexityMetric.lloc == 0 -> true complexityMetric.sloc == null || complexityMetric.sloc == 0 -> true else -> { - numberOfSmells = complexityMetric.findings.sumOf { it.value.size } + numberOfSmells = complexityMetric.findingsCount smellPerThousandLines = numberOfSmells * 1000 / complexityMetric.lloc mccPerThousandLines = requireNotNull(complexityMetric.mcc) * 1000 / complexityMetric.lloc commentSourceRatio = requireNotNull(complexityMetric.cloc) * 100 / complexityMetric.sloc diff --git a/detekt-metrics/src/test/kotlin/io/github/detekt/metrics/processors/MetricProcessorTester.kt b/detekt-metrics/src/test/kotlin/io/github/detekt/metrics/processors/MetricProcessorTester.kt index 4fe972b9239..a7c06457357 100644 --- a/detekt-metrics/src/test/kotlin/io/github/detekt/metrics/processors/MetricProcessorTester.kt +++ b/detekt-metrics/src/test/kotlin/io/github/detekt/metrics/processors/MetricProcessorTester.kt @@ -4,7 +4,6 @@ import io.gitlab.arturbosch.detekt.api.Detektion import io.gitlab.arturbosch.detekt.api.Finding2 import io.gitlab.arturbosch.detekt.api.Notification import io.gitlab.arturbosch.detekt.api.ProjectMetric -import io.gitlab.arturbosch.detekt.api.RuleSet import org.jetbrains.kotlin.com.intellij.openapi.util.Key import org.jetbrains.kotlin.com.intellij.openapi.util.UserDataHolderBase import org.jetbrains.kotlin.psi.KtFile @@ -19,7 +18,7 @@ class MetricProcessorTester( with(processor) { onStart(listOf(file), BindingContext.EMPTY) onProcess(file, BindingContext.EMPTY) - onProcessComplete(file, emptyMap(), BindingContext.EMPTY) + onProcessComplete(file, emptyList(), BindingContext.EMPTY) onFinish(listOf(file), result, BindingContext.EMPTY) } return checkNotNull(result.getUserData(key)) @@ -27,7 +26,7 @@ class MetricProcessorTester( } private class MetricResults : Detektion, UserDataHolderBase() { - override val findings: Map> + override val findings: List get() = throw UnsupportedOperationException() override val notifications: Collection get() = throw UnsupportedOperationException() diff --git a/detekt-report-html/src/main/kotlin/io/github/detekt/report/html/HtmlOutputReport.kt b/detekt-report-html/src/main/kotlin/io/github/detekt/report/html/HtmlOutputReport.kt index 07b66e24591..541345cd889 100644 --- a/detekt-report-html/src/main/kotlin/io/github/detekt/report/html/HtmlOutputReport.kt +++ b/detekt-report-html/src/main/kotlin/io/github/detekt/report/html/HtmlOutputReport.kt @@ -85,16 +85,13 @@ class HtmlOutputReport : BuiltInOutputReport, OutputReport() { } } - private fun renderFindings(findings: Map>) = createHTML().div { - val total = findings.values - .asSequence() - .map { it.size } - .fold(0) { a, b -> a + b } + private fun renderFindings(findings: List) = createHTML().div { + val total = findings.count() text("Total: %,d".format(Locale.ROOT, total)) findings - .filter { it.value.isNotEmpty() } + .groupBy { it.ruleInfo.ruleSetId } .toList() .sortedBy { (group, _) -> group.value } .forEach { (group, groupFindings) -> diff --git a/detekt-report-md/src/main/kotlin/io/github/detekt/report/md/MdOutputReport.kt b/detekt-report-md/src/main/kotlin/io/github/detekt/report/md/MdOutputReport.kt index 2831196e34a..0e2762f8118 100644 --- a/detekt-report-md/src/main/kotlin/io/github/detekt/report/md/MdOutputReport.kt +++ b/detekt-report-md/src/main/kotlin/io/github/detekt/report/md/MdOutputReport.kt @@ -15,7 +15,6 @@ import io.gitlab.arturbosch.detekt.api.Detektion import io.gitlab.arturbosch.detekt.api.Finding2 import io.gitlab.arturbosch.detekt.api.OutputReport import io.gitlab.arturbosch.detekt.api.ProjectMetric -import io.gitlab.arturbosch.detekt.api.RuleSet import io.gitlab.arturbosch.detekt.api.SourceLocation import io.gitlab.arturbosch.detekt.api.internal.BuiltInOutputReport import io.gitlab.arturbosch.detekt.api.internal.whichDetekt @@ -120,16 +119,13 @@ private fun MarkdownContent.renderRule(ruleInfo: Finding2.RuleInfo, findings: Li } } -private fun MarkdownContent.renderFindings(findings: Map>) { - val total = findings.values - .asSequence() - .map { it.size } - .fold(0) { a, b -> a + b } +private fun MarkdownContent.renderFindings(findings: List) { + val total = findings.count() h2 { "Findings (%,d)".format(Locale.ROOT, total) } findings - .filter { it.value.isNotEmpty() } + .groupBy { it.ruleInfo.ruleSetId } .toList() .sortedBy { (group, _) -> group.value } .forEach { (_, groupFindings) -> diff --git a/detekt-report-sarif/src/main/kotlin/io/github/detekt/report/sarif/Results.kt b/detekt-report-sarif/src/main/kotlin/io/github/detekt/report/sarif/Results.kt index 5cb478c414a..a6f567e26e8 100644 --- a/detekt-report-sarif/src/main/kotlin/io/github/detekt/report/sarif/Results.kt +++ b/detekt-report-sarif/src/main/kotlin/io/github/detekt/report/sarif/Results.kt @@ -8,14 +8,11 @@ import io.github.detekt.sarif4k.Region import io.gitlab.arturbosch.detekt.api.Detektion import io.gitlab.arturbosch.detekt.api.Finding2 import io.gitlab.arturbosch.detekt.api.Location -import io.gitlab.arturbosch.detekt.api.RuleSet import io.gitlab.arturbosch.detekt.api.Severity import kotlin.io.path.invariantSeparatorsPathString internal fun toResults(detektion: Detektion): List = - detektion.findings.flatMap { (ruleSetId, findings) -> - findings.map { it.toResult(ruleSetId) } - } + detektion.findings.map { it.toResult() } internal fun Severity.toResultLevel() = when (this) { Severity.Error -> Level.Error @@ -23,9 +20,9 @@ internal fun Severity.toResultLevel() = when (this) { Severity.Info -> Level.Note } -private fun Finding2.toResult(ruleSetId: RuleSet.Id): io.github.detekt.sarif4k.Result { +private fun Finding2.toResult(): io.github.detekt.sarif4k.Result { return io.github.detekt.sarif4k.Result( - ruleID = "detekt.$ruleSetId.${ruleInfo.id}", + ruleID = "detekt.${ruleInfo.ruleSetId}.${ruleInfo.id}", level = severity.toResultLevel(), locations = (listOf(location) + references.map { it.location }).map { it.toLocation() }.distinct(), message = Message(text = message) diff --git a/detekt-report-txt/src/main/kotlin/io/github/detekt/report/txt/TxtOutputReport.kt b/detekt-report-txt/src/main/kotlin/io/github/detekt/report/txt/TxtOutputReport.kt index b80d6d904e0..458012cbc24 100644 --- a/detekt-report-txt/src/main/kotlin/io/github/detekt/report/txt/TxtOutputReport.kt +++ b/detekt-report-txt/src/main/kotlin/io/github/detekt/report/txt/TxtOutputReport.kt @@ -16,7 +16,6 @@ class TxtOutputReport : BuiltInOutputReport, OutputReport() { override fun render(detektion: Detektion): String { return detektion.findings - .flatMap { it.value } .ifEmpty { return "" } .joinToString("\n", postfix = "\n") { it.compactWithSignature() } } diff --git a/detekt-report-xml/src/main/kotlin/io/github/detekt/report/xml/XmlOutputReport.kt b/detekt-report-xml/src/main/kotlin/io/github/detekt/report/xml/XmlOutputReport.kt index 37e4193f864..1e853a3e02e 100644 --- a/detekt-report-xml/src/main/kotlin/io/github/detekt/report/xml/XmlOutputReport.kt +++ b/detekt-report-xml/src/main/kotlin/io/github/detekt/report/xml/XmlOutputReport.kt @@ -20,13 +20,12 @@ class XmlOutputReport : BuiltInOutputReport, OutputReport() { get() = severity.name.lowercase(Locale.US) override fun render(detektion: Detektion): String { - val smells = detektion.findings.flatMap { it.value } - val lines = ArrayList() lines += "" lines += "" - smells.groupBy { it.location.filePath.relativePath ?: it.location.filePath.absolutePath } + detektion.findings + .groupBy { it.location.filePath.relativePath ?: it.location.filePath.absolutePath } .forEach { (filePath, findings) -> lines += "" findings.forEach { diff --git a/detekt-sample-extensions/src/test/kotlin/io/gitlab/arturbosch/detekt/sample/extensions/processors/QualifiedNameProcessorSpec.kt b/detekt-sample-extensions/src/test/kotlin/io/gitlab/arturbosch/detekt/sample/extensions/processors/QualifiedNameProcessorSpec.kt index 867d86ab9d9..65fd6a36a81 100644 --- a/detekt-sample-extensions/src/test/kotlin/io/gitlab/arturbosch/detekt/sample/extensions/processors/QualifiedNameProcessorSpec.kt +++ b/detekt-sample-extensions/src/test/kotlin/io/gitlab/arturbosch/detekt/sample/extensions/processors/QualifiedNameProcessorSpec.kt @@ -5,7 +5,6 @@ import io.gitlab.arturbosch.detekt.api.Detektion import io.gitlab.arturbosch.detekt.api.Finding2 import io.gitlab.arturbosch.detekt.api.Notification import io.gitlab.arturbosch.detekt.api.ProjectMetric -import io.gitlab.arturbosch.detekt.api.RuleSet import org.assertj.core.api.Assertions.assertThat import org.jetbrains.kotlin.com.intellij.openapi.util.UserDataHolderBase import org.jetbrains.kotlin.resolve.BindingContext @@ -31,7 +30,7 @@ class QualifiedNameProcessorSpec { private val result = object : Detektion, UserDataHolderBase() { - override val findings: Map> = emptyMap() + override val findings: List = emptyList() override val notifications: Collection = emptyList() override val metrics: Collection = emptyList() diff --git a/detekt-tooling/src/main/kotlin/io/github/detekt/tooling/internal/EmptyContainer.kt b/detekt-tooling/src/main/kotlin/io/github/detekt/tooling/internal/EmptyContainer.kt index e470ca8929a..7687fec0810 100644 --- a/detekt-tooling/src/main/kotlin/io/github/detekt/tooling/internal/EmptyContainer.kt +++ b/detekt-tooling/src/main/kotlin/io/github/detekt/tooling/internal/EmptyContainer.kt @@ -4,12 +4,11 @@ import io.gitlab.arturbosch.detekt.api.Detektion import io.gitlab.arturbosch.detekt.api.Finding2 import io.gitlab.arturbosch.detekt.api.Notification import io.gitlab.arturbosch.detekt.api.ProjectMetric -import io.gitlab.arturbosch.detekt.api.RuleSet import org.jetbrains.kotlin.com.intellij.openapi.util.Key object EmptyContainer : Detektion { - override val findings: Map> = emptyMap() + override val findings: List = emptyList() override val notifications: Collection = emptyList() override val metrics: Collection = emptyList()