diff --git a/idea/idea-analysis/src/org/jetbrains/kotlin/idea/inspections/IntentionBasedInspection.kt b/idea/idea-analysis/src/org/jetbrains/kotlin/idea/inspections/IntentionBasedInspection.kt index 3154cb0ede5..af9f28bc7be 100644 --- a/idea/idea-analysis/src/org/jetbrains/kotlin/idea/inspections/IntentionBasedInspection.kt +++ b/idea/idea-analysis/src/org/jetbrains/kotlin/idea/inspections/IntentionBasedInspection.kt @@ -25,7 +25,6 @@ import com.intellij.openapi.editor.Editor import com.intellij.openapi.editor.EditorFactory import com.intellij.openapi.fileEditor.FileDocumentManager import com.intellij.openapi.project.Project -import com.intellij.openapi.util.TextRange import com.intellij.psi.PsiElement import com.intellij.psi.PsiElementVisitor import com.intellij.psi.PsiFile @@ -33,7 +32,7 @@ import org.jetbrains.kotlin.idea.intentions.JetSelfTargetingRangeIntention import org.jetbrains.kotlin.psi.JetElement public abstract class IntentionBasedInspection( - protected val intentions: List>, + public val intentions: List>, protected val problemText: String?, protected val elementType: Class ) : AbstractKotlinInspection() { diff --git a/idea/idea-analysis/src/org/jetbrains/kotlin/idea/intentions/JetSelfTargetingIntention.kt b/idea/idea-analysis/src/org/jetbrains/kotlin/idea/intentions/JetSelfTargetingIntention.kt index c373ade19d4..32b9d2b4254 100644 --- a/idea/idea-analysis/src/org/jetbrains/kotlin/idea/intentions/JetSelfTargetingIntention.kt +++ b/idea/idea-analysis/src/org/jetbrains/kotlin/idea/intentions/JetSelfTargetingIntention.kt @@ -16,18 +16,22 @@ package org.jetbrains.kotlin.idea.intentions +import com.intellij.codeInsight.daemon.HighlightDisplayKey import com.intellij.codeInsight.intention.IntentionAction +import com.intellij.codeInspection.LocalInspectionEP import com.intellij.openapi.editor.Editor +import com.intellij.openapi.extensions.Extensions import com.intellij.openapi.project.Project import com.intellij.openapi.util.TextRange +import com.intellij.profile.codeInspection.InspectionProjectProfileManager import com.intellij.psi.PsiElement import com.intellij.psi.PsiFile import com.intellij.psi.util.PsiTreeUtil -import org.jetbrains.kotlin.idea.JetBundle +import org.jetbrains.kotlin.idea.inspections.IntentionBasedInspection import org.jetbrains.kotlin.psi.JetElement import org.jetbrains.kotlin.psi.psiUtil.containsInside -import org.jetbrains.kotlin.psi.psiUtil.parents import org.jetbrains.kotlin.psi.psiUtil.parentsWithSelf +import java.util.HashMap public abstract class JetSelfTargetingIntention( public val elementType: Class, @@ -66,6 +70,7 @@ public abstract class JetSelfTargetingIntention( } for (element in elementsToCheck) { + @suppress("UNCHECKED_CAST") if (elementType.isInstance(element) && isApplicableTo(element as TElement, offset)) { return element as TElement } @@ -76,8 +81,19 @@ public abstract class JetSelfTargetingIntention( protected open fun allowCaretInsideElement(element: PsiElement): Boolean = true - final override fun isAvailable(project: Project, editor: Editor, file: PsiFile) - = getTarget(editor, file) != null + final override fun isAvailable(project: Project, editor: Editor, file: PsiFile): Boolean { + val target = getTarget(editor, file) ?: return false + return !isIntentionBaseInspectionEnabled(project, target) + } + + private fun isIntentionBaseInspectionEnabled(project: Project, target: TElement): Boolean { + val inspection = findInspection(javaClass) ?: return false + + val key = HighlightDisplayKey.find(inspection.shortName) + if (!InspectionProjectProfileManager.getInstance(project).getInspectionProfile(target).isToolEnabled(key)) return false + + return inspection.intentions.single { it.intention.javaClass == javaClass }.additionalChecker(target) + } final override fun invoke(project: Project, editor: Editor, file: PsiFile): Unit { val target = getTarget(editor, file) ?: error("Intention is not applicable") @@ -87,6 +103,28 @@ public abstract class JetSelfTargetingIntention( override fun startInWriteAction() = true override fun toString(): String = getText() + + companion object { + private val intentionBasedInspections = HashMap>, IntentionBasedInspection<*>?>() + + fun findInspection(intentionClass: Class>): IntentionBasedInspection? { + if (intentionBasedInspections.containsKey(intentionClass)) { + @suppress("UNCHECKED_CAST") + return intentionBasedInspections[intentionClass] as IntentionBasedInspection? + } + + for (extension in Extensions.getExtensions(LocalInspectionEP.LOCAL_INSPECTION)) { + val inspection = extension.instance as? IntentionBasedInspection<*> ?: continue + if (inspection.intentions.any { it.intention.javaClass == intentionClass }) { + intentionBasedInspections[intentionClass] = inspection + @suppress("UNCHECKED_CAST") + return inspection as IntentionBasedInspection + } + } + + return null + } + } } public abstract class JetSelfTargetingRangeIntention(