Enable suppression actions for Kotlin inspections

This commit is contained in:
Nikolay Krasko
2015-12-11 19:57:33 +03:00
committed by Nikolay Krasko
parent 94c0ccf2bf
commit 712d2bdec0
3 changed files with 20 additions and 16 deletions
@@ -46,9 +46,12 @@ class KotlinSuppressableWarningProblemGroup(
} }
fun createSuppressWarningActions(element: PsiElement, diagnosticFactory: DiagnosticFactory<*>): List<SuppressIntentionAction> { fun createSuppressWarningActions(element: PsiElement, diagnosticFactory: DiagnosticFactory<*>): List<SuppressIntentionAction> =
if (diagnosticFactory.getSeverity() != Severity.WARNING) createSuppressWarningActions(element, diagnosticFactory.severity, diagnosticFactory.name)
return Collections.emptyList()
fun createSuppressWarningActions(element: PsiElement, severity: Severity, suppressionKey: String): List<SuppressIntentionAction> {
if (severity != Severity.WARNING) return Collections.emptyList()
val actions = arrayListOf<SuppressIntentionAction>() val actions = arrayListOf<SuppressIntentionAction>()
var current: PsiElement? = element var current: PsiElement? = element
@@ -58,7 +61,7 @@ fun createSuppressWarningActions(element: PsiElement, diagnosticFactory: Diagnos
val declaration = current val declaration = current
val kind = DeclarationKindDetector.detect(declaration) val kind = DeclarationKindDetector.detect(declaration)
if (kind != null) { if (kind != null) {
actions.add(KotlinSuppressIntentionAction(declaration, diagnosticFactory, kind)) actions.add(KotlinSuppressIntentionAction(declaration, suppressionKey, kind))
} }
suppressAtStatementAllowed = false suppressAtStatementAllowed = false
} }
@@ -66,7 +69,7 @@ fun createSuppressWarningActions(element: PsiElement, diagnosticFactory: Diagnos
// Add suppress action at first statement // Add suppress action at first statement
if (current.parent is KtBlockExpression || current.parent is KtDestructuringDeclaration) { if (current.parent is KtBlockExpression || current.parent is KtDestructuringDeclaration) {
val kind = if (current.parent is KtBlockExpression) "statement" else "initializer" val kind = if (current.parent is KtBlockExpression) "statement" else "initializer"
actions.add(KotlinSuppressIntentionAction(current, diagnosticFactory, actions.add(KotlinSuppressIntentionAction(current, suppressionKey,
AnnotationHostKind(kind, "", true))) AnnotationHostKind(kind, "", true)))
suppressAtStatementAllowed = false suppressAtStatementAllowed = false
} }
@@ -17,18 +17,20 @@
package org.jetbrains.kotlin.idea.inspections package org.jetbrains.kotlin.idea.inspections
import com.intellij.codeHighlighting.HighlightDisplayLevel import com.intellij.codeHighlighting.HighlightDisplayLevel
import com.intellij.codeInsight.daemon.HighlightDisplayKey
import com.intellij.codeInspection.CustomSuppressableInspectionTool import com.intellij.codeInspection.CustomSuppressableInspectionTool
import com.intellij.codeInspection.LocalInspectionTool import com.intellij.codeInspection.LocalInspectionTool
import com.intellij.codeInspection.SuppressIntentionAction import com.intellij.codeInspection.SuppressIntentionAction
import com.intellij.codeInspection.SuppressManager import com.intellij.codeInspection.SuppressManager
import com.intellij.psi.PsiElement import com.intellij.psi.PsiElement
import org.jetbrains.kotlin.diagnostics.Severity import org.jetbrains.kotlin.diagnostics.Severity
import org.jetbrains.kotlin.idea.highlighter.createSuppressWarningActions
import org.jetbrains.kotlin.idea.caches.resolve.KotlinCacheService import org.jetbrains.kotlin.idea.caches.resolve.KotlinCacheService
public abstract class AbstractKotlinInspection: LocalInspectionTool(), CustomSuppressableInspectionTool { public abstract class AbstractKotlinInspection: LocalInspectionTool(), CustomSuppressableInspectionTool {
public override fun getSuppressActions(element: PsiElement?): Array<SuppressIntentionAction>? { public override fun getSuppressActions(element: PsiElement?): Array<SuppressIntentionAction>? {
return SuppressManager.getInstance()!!.createSuppressActions(HighlightDisplayKey.find(getShortName())!!) if (element == null) return emptyArray()
return createSuppressWarningActions(element, toSeverity(defaultLevel), this.shortName).toTypedArray()
} }
public override fun isSuppressedFor(element: PsiElement): Boolean { public override fun isSuppressedFor(element: PsiElement): Boolean {
@@ -16,31 +16,30 @@
package org.jetbrains.kotlin.idea.quickfix package org.jetbrains.kotlin.idea.quickfix
import com.intellij.codeInspection.SuppressIntentionAction
import com.intellij.openapi.editor.Editor import com.intellij.openapi.editor.Editor
import com.intellij.openapi.project.Project import com.intellij.openapi.project.Project
import com.intellij.psi.PsiElement import com.intellij.psi.PsiElement
import org.jetbrains.kotlin.diagnostics.DiagnosticFactory
import org.jetbrains.kotlin.psi.*
import org.jetbrains.kotlin.idea.KotlinBundle
import org.jetbrains.kotlin.resolve.BindingContext
import org.jetbrains.kotlin.builtins.KotlinBuiltIns import org.jetbrains.kotlin.builtins.KotlinBuiltIns
import com.intellij.codeInspection.SuppressIntentionAction import org.jetbrains.kotlin.idea.KotlinBundle
import org.jetbrains.kotlin.idea.util.PsiPrecedences
import org.jetbrains.kotlin.idea.caches.resolve.analyze import org.jetbrains.kotlin.idea.caches.resolve.analyze
import org.jetbrains.kotlin.idea.util.PsiPrecedences
import org.jetbrains.kotlin.psi.*
import org.jetbrains.kotlin.resolve.BindingContext
public class KotlinSuppressIntentionAction( public class KotlinSuppressIntentionAction(
private val suppressAt: KtExpression, private val suppressAt: KtExpression,
private val diagnosticFactory: DiagnosticFactory<*>, private val suppressKey: String,
private val kind: AnnotationHostKind private val kind: AnnotationHostKind
) : SuppressIntentionAction() { ) : SuppressIntentionAction() {
override fun getFamilyName() = KotlinBundle.message("suppress.warnings.family") override fun getFamilyName() = KotlinBundle.message("suppress.warnings.family")
override fun getText() = KotlinBundle.message("suppress.warning.for", diagnosticFactory.getName(), kind.kind, kind.name) override fun getText() = KotlinBundle.message("suppress.warning.for", suppressKey, kind.kind, kind.name)
override fun isAvailable(project: Project, editor: Editor?, element: PsiElement) = element.isValid() override fun isAvailable(project: Project, editor: Editor?, element: PsiElement) = element.isValid()
override fun invoke(project: Project, editor: Editor?, element: PsiElement) { override fun invoke(project: Project, editor: Editor?, element: PsiElement) {
val id = "\"${diagnosticFactory.getName()}\"" val id = "\"$suppressKey\""
if (suppressAt is KtModifierListOwner) { if (suppressAt is KtModifierListOwner) {
suppressAtModifierListOwner(suppressAt, id) suppressAtModifierListOwner(suppressAt, id)
} }