Skip to content

Commit

Permalink
Introduce add finding to baseline action
Browse files Browse the repository at this point in the history
  • Loading branch information
arturbosch committed Aug 21, 2022
1 parent 9dee6d6 commit 7e7aa38
Show file tree
Hide file tree
Showing 3 changed files with 49 additions and 0 deletions.
Expand Up @@ -10,6 +10,7 @@ import com.intellij.psi.PsiFile
import io.gitlab.arturbosch.detekt.api.CorrectableCodeSmell
import io.gitlab.arturbosch.detekt.api.Finding
import io.gitlab.arturbosch.detekt.api.TextLocation
import io.gitlab.arturbosch.detekt.idea.action.AddToBaselineAction
import io.gitlab.arturbosch.detekt.idea.config.DetektPluginSettings
import io.gitlab.arturbosch.detekt.idea.intention.AutoCorrectIntention
import io.gitlab.arturbosch.detekt.idea.util.isDetektEnabled
Expand Down Expand Up @@ -67,6 +68,8 @@ class DetektAnnotator : ExternalAnnotator<PsiFile, List<Finding>>() {

if (finding is CorrectableCodeSmell) {
annotationBuilder.withFix(AutoCorrectIntention())
} else {
annotationBuilder.withFix(AddToBaselineAction(finding))
}

annotationBuilder.create()
Expand Down
@@ -0,0 +1,45 @@
package io.gitlab.arturbosch.detekt.idea.action

import com.intellij.codeInsight.daemon.DaemonCodeAnalyzer
import com.intellij.codeInsight.intention.IntentionAction
import com.intellij.openapi.components.service
import com.intellij.openapi.editor.Editor
import com.intellij.openapi.project.Project
import com.intellij.psi.PsiFile
import io.github.detekt.tooling.api.BaselineProvider
import io.gitlab.arturbosch.detekt.api.Finding
import io.gitlab.arturbosch.detekt.idea.DETEKT
import io.gitlab.arturbosch.detekt.idea.DetektBundle
import io.gitlab.arturbosch.detekt.idea.config.DetektPluginSettings
import kotlin.io.path.Path

class AddToBaselineAction(private val finding: Finding) : IntentionAction {

override fun startInWriteAction(): Boolean = true

override fun getText(): String = DetektBundle.message("detekt.actions.addToBaseline", finding.id)

override fun getFamilyName(): String = DETEKT

override fun isAvailable(project: Project, editor: Editor, file: PsiFile): Boolean {
val id = finding.compactWithSignature()
return id.trim().isNotEmpty() && project.isBaselineDefined()
}

private fun Project.isBaselineDefined(): Boolean = service<DetektPluginSettings>().baselinePath.isNotEmpty()

override fun invoke(project: Project, editor: Editor, file: PsiFile) {
val settings = project.service<DetektPluginSettings>()
if (project.isBaselineDefined()) {
val provider = BaselineProvider.load()
val baselinePath = Path(settings.baselinePath)
val baseline = provider.read(baselinePath)
val newBaseline = provider.of(
baseline.manuallySuppressedIssues + provider.id(finding),
baseline.currentIssues,
)
provider.write(baselinePath, newBaseline)
DaemonCodeAnalyzer.getInstance(project).restart()
}
}
}
1 change: 1 addition & 0 deletions src/main/resources/messages/detektBundle.properties
Expand Up @@ -21,3 +21,4 @@ detekt.notifications.actions.openSettings=Open Detekt Settings
detekt.notifications.message.problemsFound=The Detekt plugin found some problems
detekt.notifications.content.skippingRun=Skipping Detekt run.
detekt.configuration.validationError.filePath=This must be a valid path pointing to an existing file. Invalid paths will not be saved.
detekt.actions.addToBaseline=Add finding {0} to baseline

0 comments on commit 7e7aa38

Please sign in to comment.