From 6570ca8f92910053069aaa60bb9edd087c0edc81 Mon Sep 17 00:00:00 2001 From: Alexey Kudravtsev Date: Thu, 10 Aug 2023 19:37:38 +0200 Subject: [PATCH] remove KotlinSingleElementInspection because it enumerated all PSI elements unnecessarily; use KtElementVisitor instead GitOrigin-RevId: 573f1e59d63342b4519a3bfb915b45e2ef3143ba --- ...actKotlinApplicableDiagnosticInspection.kt | 29 +++++++-------- ...otlinApplicableDiagnosticInspectionBase.kt | 37 ------------------- ...plicableDiagnosticInspectionWithContext.kt | 11 +++--- .../AbstractKotlinApplicableInspection.kt | 5 +-- .../AbstractKotlinApplicableInspectionBase.kt | 11 +++--- ...ctKotlinApplicableInspectionWithContext.kt | 5 +-- .../KotlinSingleElementInspection.kt | 29 --------------- .../RedundantModifierInspectionBase.kt | 16 ++++++-- ...nBePrimaryConstructorPropertyInspection.kt | 13 ++++++- .../inspections/ImplicitThisInspection.kt | 12 +++++- .../NullableBooleanElvisInspection.kt | 12 +++++- .../RedundantElvisReturnNullInspection.kt | 15 +++++++- ...ingleExpressionStringTemplateInspection.kt | 19 ++++++---- ...emoveToStringInStringTemplateInspection.kt | 18 +++++++-- .../inspections/ReplaceGetOrSetInspection.kt | 16 ++++++-- .../inspections/UnusedSymbolInspection.kt | 23 +++++++----- .../RedundantUnitReturnTypeInspection.kt | 13 ++++++- .../UnusedVariableInspection.kt | 30 ++++++++++++--- .../KotlinDoubleNegationInspection.kt | 13 ++++++- ...ReplaceCallWithBinaryOperatorInspection.kt | 14 +++++-- ...eplaceCollectionCountWithSizeInspection.kt | 14 ++++++- .../ReplaceSizeCheckInspectionBase.kt | 19 ++++++---- .../expressions/WhenWithOnlyElseInspection.kt | 14 ++++++- ...eCallWithClassLiteralArgumentInspection.kt | 12 +++++- ...mptyParenthesesFromLambdaCallInspection.kt | 13 ++++++- .../ConvertToStringTemplateInspection.kt | 15 ++++++-- 26 files changed, 270 insertions(+), 158 deletions(-) delete mode 100644 plugins/kotlin/code-insight/api/src/org/jetbrains/kotlin/idea/codeinsight/api/applicable/inspections/AbstractKotlinApplicableDiagnosticInspectionBase.kt delete mode 100644 plugins/kotlin/code-insight/api/src/org/jetbrains/kotlin/idea/codeinsight/api/inspections/KotlinSingleElementInspection.kt diff --git a/plugins/kotlin/code-insight/api/src/org/jetbrains/kotlin/idea/codeinsight/api/applicable/inspections/AbstractKotlinApplicableDiagnosticInspection.kt b/plugins/kotlin/code-insight/api/src/org/jetbrains/kotlin/idea/codeinsight/api/applicable/inspections/AbstractKotlinApplicableDiagnosticInspection.kt index 7acd115e1649..b20acb2cfb24 100644 --- a/plugins/kotlin/code-insight/api/src/org/jetbrains/kotlin/idea/codeinsight/api/applicable/inspections/AbstractKotlinApplicableDiagnosticInspection.kt +++ b/plugins/kotlin/code-insight/api/src/org/jetbrains/kotlin/idea/codeinsight/api/applicable/inspections/AbstractKotlinApplicableDiagnosticInspection.kt @@ -1,28 +1,25 @@ // Copyright 2000-2022 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license. package org.jetbrains.kotlin.idea.codeinsight.api.applicable.inspections -import org.jetbrains.kotlin.analysis.api.KtAnalysisSession import org.jetbrains.kotlin.analysis.api.diagnostics.KtDiagnosticWithPsi +import org.jetbrains.kotlin.idea.codeinsight.api.applicable.KotlinApplicableToolBase import org.jetbrains.kotlin.psi.KtElement import kotlin.reflect.KClass /** - * A [AbstractKotlinApplicableInspection] that applies to an element if it has a specific [DIAGNOSTIC]. + * [AbstractKotlinApplicableDiagnosticInspection] is a base interface for + * [AbstractKotlinApplicableDiagnosticInspectionWithContext]. + * + * TODO: Consider supporting multiple diagnostics. */ -abstract class AbstractKotlinApplicableDiagnosticInspection>( - elementType: KClass, -) : AbstractKotlinApplicableInspection(elementType), AbstractKotlinApplicableDiagnosticInspectionBase { +interface AbstractKotlinApplicableDiagnosticInspection< + ELEMENT : KtElement, + DIAGNOSTIC : KtDiagnosticWithPsi +> : KotlinApplicableToolBase { /** - * Whether this inspection is applicable to [element] given a [diagnostic]. - * - * @see org.jetbrains.kotlin.idea.codeinsight.api.applicable.KotlinApplicableTool.isApplicableByAnalyze + * The type of the [KtDiagnosticWithPsi] which should be filtered for. */ - context(KtAnalysisSession) - abstract fun isApplicableByDiagnostic(element: ELEMENT, diagnostic: DIAGNOSTIC): Boolean + fun getDiagnosticType(): KClass - context(KtAnalysisSession) - final override fun isApplicableByAnalyze(element: ELEMENT): Boolean { - val diagnostic = this.getDiagnostic(element) ?: return false - return isApplicableByDiagnostic(element, diagnostic) - } -} \ No newline at end of file + override fun isApplicableByPsi(element: ELEMENT): Boolean = true +} diff --git a/plugins/kotlin/code-insight/api/src/org/jetbrains/kotlin/idea/codeinsight/api/applicable/inspections/AbstractKotlinApplicableDiagnosticInspectionBase.kt b/plugins/kotlin/code-insight/api/src/org/jetbrains/kotlin/idea/codeinsight/api/applicable/inspections/AbstractKotlinApplicableDiagnosticInspectionBase.kt deleted file mode 100644 index 7a35c1c45c9c..000000000000 --- a/plugins/kotlin/code-insight/api/src/org/jetbrains/kotlin/idea/codeinsight/api/applicable/inspections/AbstractKotlinApplicableDiagnosticInspectionBase.kt +++ /dev/null @@ -1,37 +0,0 @@ -// Copyright 2000-2022 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license. -package org.jetbrains.kotlin.idea.codeinsight.api.applicable.inspections - -import org.jetbrains.kotlin.analysis.api.KtAnalysisSession -import org.jetbrains.kotlin.analysis.api.components.KtDiagnosticCheckerFilter -import org.jetbrains.kotlin.analysis.api.diagnostics.KtDiagnosticWithPsi -import org.jetbrains.kotlin.idea.codeinsight.api.applicable.KotlinApplicableToolBase -import org.jetbrains.kotlin.psi.KtElement -import kotlin.reflect.KClass - -/** - * [AbstractKotlinApplicableDiagnosticInspectionBase] is a base interface for [AbstractKotlinApplicableDiagnosticInspection] and - * [AbstractKotlinApplicableDiagnosticInspectionWithContext]. - * - * TODO: Consider supporting multiple diagnostics. - */ -interface AbstractKotlinApplicableDiagnosticInspectionBase< - ELEMENT : KtElement, - DIAGNOSTIC : KtDiagnosticWithPsi -> : KotlinApplicableToolBase { - /** - * The type of the [KtDiagnosticWithPsi] which should be filtered for. - */ - fun getDiagnosticType(): KClass - - override fun isApplicableByPsi(element: ELEMENT): Boolean = true -} - -context(KtAnalysisSession) -internal fun < - ELEMENT : KtElement, - DIAGNOSTIC : KtDiagnosticWithPsi -> AbstractKotlinApplicableDiagnosticInspectionBase.getDiagnostic(element: ELEMENT): DIAGNOSTIC? { - val diagnostics = element.getDiagnostics(KtDiagnosticCheckerFilter.ONLY_EXTENDED_CHECKERS) - val suitableDiagnostics = diagnostics.filterIsInstance(getDiagnosticType().java) - return suitableDiagnostics.firstOrNull() -} \ No newline at end of file diff --git a/plugins/kotlin/code-insight/api/src/org/jetbrains/kotlin/idea/codeinsight/api/applicable/inspections/AbstractKotlinApplicableDiagnosticInspectionWithContext.kt b/plugins/kotlin/code-insight/api/src/org/jetbrains/kotlin/idea/codeinsight/api/applicable/inspections/AbstractKotlinApplicableDiagnosticInspectionWithContext.kt index 1f70a96c5353..6fe89870ec1c 100644 --- a/plugins/kotlin/code-insight/api/src/org/jetbrains/kotlin/idea/codeinsight/api/applicable/inspections/AbstractKotlinApplicableDiagnosticInspectionWithContext.kt +++ b/plugins/kotlin/code-insight/api/src/org/jetbrains/kotlin/idea/codeinsight/api/applicable/inspections/AbstractKotlinApplicableDiagnosticInspectionWithContext.kt @@ -2,16 +2,15 @@ package org.jetbrains.kotlin.idea.codeinsight.api.applicable.inspections import org.jetbrains.kotlin.analysis.api.KtAnalysisSession +import org.jetbrains.kotlin.analysis.api.components.KtDiagnosticCheckerFilter import org.jetbrains.kotlin.analysis.api.diagnostics.KtDiagnosticWithPsi import org.jetbrains.kotlin.psi.KtElement -import kotlin.reflect.KClass /** * A [AbstractKotlinApplicableInspectionWithContext] that applies to an element if it has a specific [DIAGNOSTIC]. */ -abstract class AbstractKotlinApplicableDiagnosticInspectionWithContext, CONTEXT>( - elementType: KClass, -) : AbstractKotlinApplicableInspectionWithContext(elementType), AbstractKotlinApplicableDiagnosticInspectionBase { +abstract class AbstractKotlinApplicableDiagnosticInspectionWithContext, CONTEXT> + : AbstractKotlinApplicableInspectionWithContext(), AbstractKotlinApplicableDiagnosticInspection { /** * Provides some context for [apply] given some [element] and [diagnostic]. * @@ -22,7 +21,9 @@ abstract class AbstractKotlinApplicableDiagnosticInspectionWithContext( - elementType: KClass, -) : AbstractKotlinApplicableInspectionBase(elementType), KotlinApplicableTool { +abstract class AbstractKotlinApplicableInspection : AbstractKotlinApplicableInspectionBase(), KotlinApplicableTool { /** * @see com.intellij.codeInspection.CommonProblemDescriptor.getDescriptionTemplate */ diff --git a/plugins/kotlin/code-insight/api/src/org/jetbrains/kotlin/idea/codeinsight/api/applicable/inspections/AbstractKotlinApplicableInspectionBase.kt b/plugins/kotlin/code-insight/api/src/org/jetbrains/kotlin/idea/codeinsight/api/applicable/inspections/AbstractKotlinApplicableInspectionBase.kt index 116e5ce49d3a..bed9a0718570 100644 --- a/plugins/kotlin/code-insight/api/src/org/jetbrains/kotlin/idea/codeinsight/api/applicable/inspections/AbstractKotlinApplicableInspectionBase.kt +++ b/plugins/kotlin/code-insight/api/src/org/jetbrains/kotlin/idea/codeinsight/api/applicable/inspections/AbstractKotlinApplicableInspectionBase.kt @@ -7,20 +7,17 @@ import com.intellij.codeInspection.util.IntentionFamilyName import com.intellij.internal.statistic.ReportingClassSubstitutor import com.intellij.openapi.project.Project import com.intellij.openapi.util.TextRange +import com.intellij.psi.PsiElementVisitor import com.intellij.psi.PsiFile import org.jetbrains.kotlin.idea.codeinsight.api.applicable.KotlinApplicableToolBase -import org.jetbrains.kotlin.idea.codeinsight.api.inspections.KotlinSingleElementInspection import org.jetbrains.kotlin.idea.util.application.runWriteActionIfNeeded import org.jetbrains.kotlin.psi.KtElement -import kotlin.reflect.KClass /** * [AbstractKotlinApplicableInspectionBase] is a base implementation for [AbstractKotlinApplicableInspection] and * [AbstractKotlinApplicableInspectionWithContext]. */ -abstract class AbstractKotlinApplicableInspectionBase( - elementType: KClass, -) : KotlinSingleElementInspection(elementType), KotlinApplicableToolBase { +abstract class AbstractKotlinApplicableInspectionBase : LocalInspectionTool(), KotlinApplicableToolBase { /** * The action family name is an action name without any element-specific information. For example, the family name for an action * "Replace 'get' call with indexing operator" would be "Replace 'get' or 'set' call with indexing operator". @@ -51,7 +48,7 @@ abstract class AbstractKotlinApplicableInspectionBase( */ internal abstract fun buildProblemInfo(element: ELEMENT): ProblemInfo? - final override fun visitTargetElement(element: ELEMENT, holder: ProblemsHolder, isOnTheFly: Boolean) { + final fun visitTargetElement(element: ELEMENT, holder: ProblemsHolder, isOnTheFly: Boolean) { if (!isApplicableByPsi(element)) return val ranges = getApplicabilityRange().getApplicabilityRanges(element) if (ranges.isEmpty()) return @@ -70,6 +67,8 @@ abstract class AbstractKotlinApplicableInspectionBase( ) } } + + abstract override fun buildVisitor(holder: ProblemsHolder, isOnTheFly: Boolean, session: LocalInspectionToolSession): PsiElementVisitor } internal abstract class AbstractKotlinApplicableInspectionQuickFix : LocalQuickFix, ReportingClassSubstitutor { diff --git a/plugins/kotlin/code-insight/api/src/org/jetbrains/kotlin/idea/codeinsight/api/applicable/inspections/AbstractKotlinApplicableInspectionWithContext.kt b/plugins/kotlin/code-insight/api/src/org/jetbrains/kotlin/idea/codeinsight/api/applicable/inspections/AbstractKotlinApplicableInspectionWithContext.kt index 66be152b91da..af0e6b7d2a5b 100644 --- a/plugins/kotlin/code-insight/api/src/org/jetbrains/kotlin/idea/codeinsight/api/applicable/inspections/AbstractKotlinApplicableInspectionWithContext.kt +++ b/plugins/kotlin/code-insight/api/src/org/jetbrains/kotlin/idea/codeinsight/api/applicable/inspections/AbstractKotlinApplicableInspectionWithContext.kt @@ -10,7 +10,6 @@ import org.jetbrains.kotlin.idea.codeinsight.api.applicable.KotlinApplicableTool import org.jetbrains.kotlin.idea.codeinsight.api.applicable.prepareContextWithAnalyze import org.jetbrains.kotlin.idea.codeinsight.utils.findExistingEditor import org.jetbrains.kotlin.psi.KtElement -import kotlin.reflect.KClass /** * A simple [LocalInspectionTool] that visits *one* element type and produces *a single* quickfix. Marks an element with a warning if the @@ -20,9 +19,7 @@ import kotlin.reflect.KClass * For more complex inspections that should either visit multiple kinds of elements or register multiple (or zero) problems, simply use * [LocalInspectionTool]. */ -abstract class AbstractKotlinApplicableInspectionWithContext( - elementType: KClass, -) : AbstractKotlinApplicableInspectionBase(elementType), KotlinApplicableToolWithContext { +abstract class AbstractKotlinApplicableInspectionWithContext : AbstractKotlinApplicableInspectionBase(), KotlinApplicableToolWithContext { /** * @see com.intellij.codeInspection.CommonProblemDescriptor.getDescriptionTemplate */ diff --git a/plugins/kotlin/code-insight/api/src/org/jetbrains/kotlin/idea/codeinsight/api/inspections/KotlinSingleElementInspection.kt b/plugins/kotlin/code-insight/api/src/org/jetbrains/kotlin/idea/codeinsight/api/inspections/KotlinSingleElementInspection.kt deleted file mode 100644 index abe60af2d9e7..000000000000 --- a/plugins/kotlin/code-insight/api/src/org/jetbrains/kotlin/idea/codeinsight/api/inspections/KotlinSingleElementInspection.kt +++ /dev/null @@ -1,29 +0,0 @@ -// Copyright 2000-2022 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license. -package org.jetbrains.kotlin.idea.codeinsight.api.inspections - -import com.intellij.codeInspection.LocalInspectionTool -import com.intellij.codeInspection.LocalInspectionToolSession -import com.intellij.codeInspection.ProblemsHolder -import org.jetbrains.kotlin.psi.KtElement -import org.jetbrains.kotlin.psi.KtVisitorVoid -import kotlin.reflect.KClass - -/** - * A [LocalInspectionTool] that visits elements of a single [elementType]. - */ -abstract class KotlinSingleElementInspection( - val elementType: KClass, -) : LocalInspectionTool() { - protected abstract fun visitTargetElement(element: ELEMENT, holder: ProblemsHolder, isOnTheFly: Boolean) - - final override fun buildVisitor(holder: ProblemsHolder, isOnTheFly: Boolean, session: LocalInspectionToolSession) = - object : KtVisitorVoid() { - override fun visitKtElement(element: KtElement) { - super.visitKtElement(element) - - if (!elementType.isInstance(element) || element.textLength == 0) return - @Suppress("UNCHECKED_CAST") - visitTargetElement(element as ELEMENT, holder, isOnTheFly) - } - } -} diff --git a/plugins/kotlin/code-insight/impl-base/src/org/jetbrains/kotlin/idea/codeinsights/impl/base/inspections/RedundantModifierInspectionBase.kt b/plugins/kotlin/code-insight/impl-base/src/org/jetbrains/kotlin/idea/codeinsights/impl/base/inspections/RedundantModifierInspectionBase.kt index 7805cfcb9406..1927c26503d5 100644 --- a/plugins/kotlin/code-insight/impl-base/src/org/jetbrains/kotlin/idea/codeinsights/impl/base/inspections/RedundantModifierInspectionBase.kt +++ b/plugins/kotlin/code-insight/impl-base/src/org/jetbrains/kotlin/idea/codeinsights/impl/base/inspections/RedundantModifierInspectionBase.kt @@ -2,22 +2,32 @@ package org.jetbrains.kotlin.idea.codeinsights.impl.base.inspections import com.intellij.codeInspection.CleanupLocalInspectionTool +import com.intellij.codeInspection.LocalInspectionToolSession +import com.intellij.codeInspection.ProblemsHolder import com.intellij.openapi.editor.Editor import com.intellij.openapi.project.Project +import com.intellij.psi.PsiElementVisitor import com.intellij.psi.tree.TokenSet import org.jetbrains.kotlin.analysis.api.diagnostics.KtDiagnosticWithPsi import org.jetbrains.kotlin.idea.base.resources.KotlinBundle import org.jetbrains.kotlin.idea.codeinsight.api.applicable.inspections.AbstractKotlinApplicableDiagnosticInspectionWithContext import org.jetbrains.kotlin.lexer.KtModifierKeywordToken +import org.jetbrains.kotlin.psi.KtDeclaration import org.jetbrains.kotlin.psi.KtModifierListOwner +import org.jetbrains.kotlin.psi.KtVisitorVoid abstract class RedundantModifierInspectionBase>( private val modifierSet: TokenSet, -) : AbstractKotlinApplicableDiagnosticInspectionWithContext( - KtModifierListOwner::class - ), +) : AbstractKotlinApplicableDiagnosticInspectionWithContext(), CleanupLocalInspectionTool { + override fun buildVisitor(holder: ProblemsHolder, isOnTheFly: Boolean, session: LocalInspectionToolSession): PsiElementVisitor { + return object : KtVisitorVoid() { + override fun visitDeclaration(dcl: KtDeclaration) { + visitTargetElement(dcl, holder, isOnTheFly) + } + } + } class ModifierContext(val modifier: KtModifierKeywordToken) override fun getProblemDescription(element: KtModifierListOwner, context: ModifierContext): String = diff --git a/plugins/kotlin/code-insight/inspections-k2/src/org/jetbrains/kotlin/idea/k2/codeinsight/inspections/CanBePrimaryConstructorPropertyInspection.kt b/plugins/kotlin/code-insight/inspections-k2/src/org/jetbrains/kotlin/idea/k2/codeinsight/inspections/CanBePrimaryConstructorPropertyInspection.kt index 02299688c9c2..16e9bca6f6b1 100644 --- a/plugins/kotlin/code-insight/inspections-k2/src/org/jetbrains/kotlin/idea/k2/codeinsight/inspections/CanBePrimaryConstructorPropertyInspection.kt +++ b/plugins/kotlin/code-insight/inspections-k2/src/org/jetbrains/kotlin/idea/k2/codeinsight/inspections/CanBePrimaryConstructorPropertyInspection.kt @@ -1,8 +1,11 @@ // Copyright 2000-2023 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license. package org.jetbrains.kotlin.idea.k2.codeinsight.inspections +import com.intellij.codeInspection.LocalInspectionToolSession +import com.intellij.codeInspection.ProblemsHolder import com.intellij.openapi.editor.Editor import com.intellij.openapi.project.Project +import com.intellij.psi.PsiElementVisitor import org.jetbrains.kotlin.analysis.api.KtAnalysisSession import org.jetbrains.kotlin.analysis.api.symbols.KtValueParameterSymbol import org.jetbrains.kotlin.idea.base.resources.KotlinBundle @@ -14,10 +17,18 @@ import org.jetbrains.kotlin.idea.codeinsights.impl.base.intentions.MovePropertyT import org.jetbrains.kotlin.idea.codeinsights.impl.base.intentions.MovePropertyToConstructorUtils.moveToConstructor import org.jetbrains.kotlin.idea.references.mainReference import org.jetbrains.kotlin.psi.KtProperty +import org.jetbrains.kotlin.psi.KtVisitorVoid internal class CanBePrimaryConstructorPropertyInspection - : AbstractKotlinApplicableInspectionWithContext(KtProperty::class) { + : AbstractKotlinApplicableInspectionWithContext() { + override fun buildVisitor(holder: ProblemsHolder, isOnTheFly: Boolean, session: LocalInspectionToolSession): PsiElementVisitor { + return object : KtVisitorVoid() { + override fun visitProperty(property: KtProperty) { + visitTargetElement(property, holder, isOnTheFly) + } + } + } override fun getProblemDescription(element: KtProperty, context: MovePropertyToConstructorInfo): String = KotlinBundle.message( "property.is.explicitly.assigned.to.parameter.0.can", element.name ?: "???" ) diff --git a/plugins/kotlin/code-insight/inspections-k2/src/org/jetbrains/kotlin/idea/k2/codeinsight/inspections/ImplicitThisInspection.kt b/plugins/kotlin/code-insight/inspections-k2/src/org/jetbrains/kotlin/idea/k2/codeinsight/inspections/ImplicitThisInspection.kt index 1840ff3b8bb3..05df90c83e3c 100644 --- a/plugins/kotlin/code-insight/inspections-k2/src/org/jetbrains/kotlin/idea/k2/codeinsight/inspections/ImplicitThisInspection.kt +++ b/plugins/kotlin/code-insight/inspections-k2/src/org/jetbrains/kotlin/idea/k2/codeinsight/inspections/ImplicitThisInspection.kt @@ -1,8 +1,11 @@ // Copyright 2000-2022 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license. package org.jetbrains.kotlin.idea.k2.codeinsight.inspections +import com.intellij.codeInspection.LocalInspectionToolSession +import com.intellij.codeInspection.ProblemsHolder import com.intellij.openapi.editor.Editor import com.intellij.openapi.project.Project +import com.intellij.psi.PsiElementVisitor import org.jetbrains.kotlin.analysis.api.KtAnalysisSession import org.jetbrains.kotlin.idea.base.resources.KotlinBundle import org.jetbrains.kotlin.idea.codeinsight.api.applicable.inspections.AbstractKotlinApplicableInspectionWithContext @@ -14,8 +17,15 @@ import org.jetbrains.kotlin.psi.* import org.jetbrains.kotlin.renderer.render internal class ImplicitThisInspection : - AbstractKotlinApplicableInspectionWithContext(KtExpression::class) { + AbstractKotlinApplicableInspectionWithContext() { + override fun buildVisitor(holder: ProblemsHolder, isOnTheFly: Boolean, session: LocalInspectionToolSession): PsiElementVisitor { + return object : KtVisitorVoid() { + override fun visitExpression(expression: KtExpression) { + visitTargetElement(expression, holder, isOnTheFly) + } + } + } override fun getProblemDescription(element: KtExpression, context: ImplicitReceiverInfo): String = KotlinBundle.message("inspection.implicit.this.display.name") diff --git a/plugins/kotlin/code-insight/inspections-k2/src/org/jetbrains/kotlin/idea/k2/codeinsight/inspections/NullableBooleanElvisInspection.kt b/plugins/kotlin/code-insight/inspections-k2/src/org/jetbrains/kotlin/idea/k2/codeinsight/inspections/NullableBooleanElvisInspection.kt index d1dad824787d..84be7449af20 100644 --- a/plugins/kotlin/code-insight/inspections-k2/src/org/jetbrains/kotlin/idea/k2/codeinsight/inspections/NullableBooleanElvisInspection.kt +++ b/plugins/kotlin/code-insight/inspections-k2/src/org/jetbrains/kotlin/idea/k2/codeinsight/inspections/NullableBooleanElvisInspection.kt @@ -1,8 +1,11 @@ // Copyright 2000-2022 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license. package org.jetbrains.kotlin.idea.k2.codeinsight.inspections +import com.intellij.codeInspection.LocalInspectionToolSession +import com.intellij.codeInspection.ProblemsHolder import com.intellij.openapi.editor.Editor import com.intellij.openapi.project.Project +import com.intellij.psi.PsiElementVisitor import org.jetbrains.kotlin.analysis.api.KtAnalysisSession import org.jetbrains.kotlin.idea.base.psi.replaced import org.jetbrains.kotlin.idea.base.resources.KotlinBundle @@ -20,7 +23,14 @@ import org.jetbrains.kotlin.psi.* * - `!(nb ?: false)` => `nb != true` * See plugins/kotlin/code-insight/descriptions/resources-en/inspectionDescriptions/NullableBooleanElvis.html for details. */ -internal class NullableBooleanElvisInspection : AbstractKotlinApplicableInspection(KtBinaryExpression::class) { +internal class NullableBooleanElvisInspection : AbstractKotlinApplicableInspection() { + override fun buildVisitor(holder: ProblemsHolder, isOnTheFly: Boolean, session: LocalInspectionToolSession): PsiElementVisitor { + return object : KtVisitorVoid() { + override fun visitBinaryExpression(expression: KtBinaryExpression) { + visitTargetElement(expression, holder, isOnTheFly) + } + } + } override fun getProblemDescription(element: KtBinaryExpression): String = KotlinBundle.message("inspection.nullable.boolean.elvis.display.name") override fun getActionFamilyName(): String = KotlinBundle.message("inspection.nullable.boolean.elvis.action.name") diff --git a/plugins/kotlin/code-insight/inspections-k2/src/org/jetbrains/kotlin/idea/k2/codeinsight/inspections/RedundantElvisReturnNullInspection.kt b/plugins/kotlin/code-insight/inspections-k2/src/org/jetbrains/kotlin/idea/k2/codeinsight/inspections/RedundantElvisReturnNullInspection.kt index 37bc25b55c81..8e1dec2bdf4f 100644 --- a/plugins/kotlin/code-insight/inspections-k2/src/org/jetbrains/kotlin/idea/k2/codeinsight/inspections/RedundantElvisReturnNullInspection.kt +++ b/plugins/kotlin/code-insight/inspections-k2/src/org/jetbrains/kotlin/idea/k2/codeinsight/inspections/RedundantElvisReturnNullInspection.kt @@ -1,24 +1,35 @@ // Copyright 2000-2022 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license. package org.jetbrains.kotlin.idea.k2.codeinsight.inspections +import com.intellij.codeInspection.LocalInspectionToolSession +import com.intellij.codeInspection.ProblemsHolder import com.intellij.openapi.editor.Editor import com.intellij.openapi.project.Project import com.intellij.openapi.util.TextRange +import com.intellij.psi.PsiElementVisitor import com.intellij.psi.util.elementType import org.jetbrains.kotlin.analysis.api.KtAnalysisSession import org.jetbrains.kotlin.idea.base.psi.safeDeparenthesize import org.jetbrains.kotlin.idea.base.resources.KotlinBundle import org.jetbrains.kotlin.idea.codeinsight.api.applicable.inspections.AbstractKotlinApplicableInspection -import org.jetbrains.kotlin.idea.codeinsight.api.applicators.* +import org.jetbrains.kotlin.idea.codeinsight.api.applicators.applicabilityRanges import org.jetbrains.kotlin.lexer.KtTokens import org.jetbrains.kotlin.psi.KtBinaryExpression import org.jetbrains.kotlin.psi.KtReturnExpression +import org.jetbrains.kotlin.psi.KtVisitorVoid import org.jetbrains.kotlin.psi.psiUtil.endOffset import org.jetbrains.kotlin.psi.psiUtil.getStrictParentOfType import org.jetbrains.kotlin.psi.psiUtil.startOffset import org.jetbrains.kotlin.psi.stubs.elements.KtStubElementTypes -internal class RedundantElvisReturnNullInspection : AbstractKotlinApplicableInspection(KtBinaryExpression::class) { +internal class RedundantElvisReturnNullInspection : AbstractKotlinApplicableInspection() { + override fun buildVisitor(holder: ProblemsHolder, isOnTheFly: Boolean, session: LocalInspectionToolSession): PsiElementVisitor { + return object : KtVisitorVoid() { + override fun visitBinaryExpression(expression: KtBinaryExpression) { + visitTargetElement(expression, holder, isOnTheFly) + } + } + } override fun getProblemDescription(element: KtBinaryExpression): String = KotlinBundle.message("inspection.redundant.elvis.return.null.descriptor") override fun getActionFamilyName(): String = KotlinBundle.message("remove.redundant.elvis.return.null.text") diff --git a/plugins/kotlin/code-insight/inspections-k2/src/org/jetbrains/kotlin/idea/k2/codeinsight/inspections/RemoveSingleExpressionStringTemplateInspection.kt b/plugins/kotlin/code-insight/inspections-k2/src/org/jetbrains/kotlin/idea/k2/codeinsight/inspections/RemoveSingleExpressionStringTemplateInspection.kt index 5d36549a0373..7fb57a69e470 100644 --- a/plugins/kotlin/code-insight/inspections-k2/src/org/jetbrains/kotlin/idea/k2/codeinsight/inspections/RemoveSingleExpressionStringTemplateInspection.kt +++ b/plugins/kotlin/code-insight/inspections-k2/src/org/jetbrains/kotlin/idea/k2/codeinsight/inspections/RemoveSingleExpressionStringTemplateInspection.kt @@ -1,23 +1,28 @@ // Copyright 2000-2022 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license. package org.jetbrains.kotlin.idea.k2.codeinsight.inspections +import com.intellij.codeInspection.LocalInspectionToolSession +import com.intellij.codeInspection.ProblemsHolder import com.intellij.openapi.editor.Editor import com.intellij.openapi.project.Project +import com.intellij.psi.PsiElementVisitor import org.jetbrains.kotlin.analysis.api.KtAnalysisSession import org.jetbrains.kotlin.idea.base.resources.KotlinBundle import org.jetbrains.kotlin.idea.codeinsight.api.applicable.inspections.AbstractKotlinApplicableInspectionWithContext import org.jetbrains.kotlin.idea.codeinsight.api.applicators.KotlinApplicabilityRange import org.jetbrains.kotlin.idea.codeinsights.impl.base.applicators.ApplicabilityRanges -import org.jetbrains.kotlin.psi.KtExpression -import org.jetbrains.kotlin.psi.KtPsiFactory -import org.jetbrains.kotlin.psi.KtStringTemplateExpression -import org.jetbrains.kotlin.psi.createExpressionByPattern +import org.jetbrains.kotlin.psi.* internal class RemoveSingleExpressionStringTemplateInspection : - AbstractKotlinApplicableInspectionWithContext( - KtStringTemplateExpression::class - ) { + AbstractKotlinApplicableInspectionWithContext() { + override fun buildVisitor(holder: ProblemsHolder, isOnTheFly: Boolean, session: LocalInspectionToolSession): PsiElementVisitor { + return object : KtVisitorVoid() { + override fun visitStringTemplateExpression(expression: KtStringTemplateExpression) { + visitTargetElement(expression, holder, isOnTheFly) + } + } + } class Context(val isString: Boolean) override fun getProblemDescription(element: KtStringTemplateExpression, context: Context): String = diff --git a/plugins/kotlin/code-insight/inspections-k2/src/org/jetbrains/kotlin/idea/k2/codeinsight/inspections/RemoveToStringInStringTemplateInspection.kt b/plugins/kotlin/code-insight/inspections-k2/src/org/jetbrains/kotlin/idea/k2/codeinsight/inspections/RemoveToStringInStringTemplateInspection.kt index 806285143c88..e853c1b03f70 100644 --- a/plugins/kotlin/code-insight/inspections-k2/src/org/jetbrains/kotlin/idea/k2/codeinsight/inspections/RemoveToStringInStringTemplateInspection.kt +++ b/plugins/kotlin/code-insight/inspections-k2/src/org/jetbrains/kotlin/idea/k2/codeinsight/inspections/RemoveToStringInStringTemplateInspection.kt @@ -2,16 +2,21 @@ package org.jetbrains.kotlin.idea.k2.codeinsight.inspections import com.intellij.codeInspection.CleanupLocalInspectionTool +import com.intellij.codeInspection.LocalInspectionToolSession +import com.intellij.codeInspection.ProblemsHolder import com.intellij.openapi.editor.Editor import com.intellij.openapi.project.Project +import com.intellij.psi.PsiElementVisitor import com.intellij.refactoring.suggested.startOffset import org.jetbrains.kotlin.analysis.api.KtAnalysisSession import org.jetbrains.kotlin.analysis.api.calls.successfulFunctionCallOrNull import org.jetbrains.kotlin.analysis.api.calls.symbol import org.jetbrains.kotlin.idea.base.resources.KotlinBundle import org.jetbrains.kotlin.idea.codeinsight.api.applicable.inspections.AbstractKotlinApplicableInspection -import org.jetbrains.kotlin.idea.codeinsight.api.applicators.* -import org.jetbrains.kotlin.name.* +import org.jetbrains.kotlin.idea.codeinsight.api.applicators.KotlinApplicabilityRange +import org.jetbrains.kotlin.idea.codeinsight.api.applicators.applicabilityRanges +import org.jetbrains.kotlin.name.CallableId +import org.jetbrains.kotlin.name.StandardClassIds import org.jetbrains.kotlin.psi.* import org.jetbrains.kotlin.psi.psiUtil.canPlaceAfterSimpleNameEntry import org.jetbrains.kotlin.util.OperatorNameConventions @@ -19,9 +24,16 @@ import org.jetbrains.kotlin.util.OperatorNameConventions private val TO_STRING_CALLABLE_ID = CallableId(StandardClassIds.Any, OperatorNameConventions.TO_STRING) internal class RemoveToStringInStringTemplateInspection : - AbstractKotlinApplicableInspection(KtDotQualifiedExpression::class), + AbstractKotlinApplicableInspection(), CleanupLocalInspectionTool { + override fun buildVisitor(holder: ProblemsHolder, isOnTheFly: Boolean, session: LocalInspectionToolSession): PsiElementVisitor { + return object : KtVisitorVoid() { + override fun visitDotQualifiedExpression(expression: KtDotQualifiedExpression) { + visitTargetElement(expression, holder, isOnTheFly) + } + } + } override fun getProblemDescription(element: KtDotQualifiedExpression): String = KotlinBundle.message("remove.to.string.fix.text") override fun getActionFamilyName(): String = KotlinBundle.message("remove.to.string.fix.text") diff --git a/plugins/kotlin/code-insight/inspections-k2/src/org/jetbrains/kotlin/idea/k2/codeinsight/inspections/ReplaceGetOrSetInspection.kt b/plugins/kotlin/code-insight/inspections-k2/src/org/jetbrains/kotlin/idea/k2/codeinsight/inspections/ReplaceGetOrSetInspection.kt index 1b0cda83b3b7..56e7ce354cdc 100644 --- a/plugins/kotlin/code-insight/inspections-k2/src/org/jetbrains/kotlin/idea/k2/codeinsight/inspections/ReplaceGetOrSetInspection.kt +++ b/plugins/kotlin/code-insight/inspections-k2/src/org/jetbrains/kotlin/idea/k2/codeinsight/inspections/ReplaceGetOrSetInspection.kt @@ -1,18 +1,20 @@ // Copyright 2000-2022 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license. package org.jetbrains.kotlin.idea.k2.codeinsight.inspections +import com.intellij.codeInspection.LocalInspectionToolSession import com.intellij.codeInspection.ProblemHighlightType import com.intellij.codeInspection.ProblemHighlightType.GENERIC_ERROR_OR_WARNING import com.intellij.codeInspection.ProblemHighlightType.INFORMATION +import com.intellij.codeInspection.ProblemsHolder import com.intellij.openapi.editor.Editor import com.intellij.openapi.project.Project +import com.intellij.psi.PsiElementVisitor import org.jetbrains.kotlin.analysis.api.KtAnalysisSession import org.jetbrains.kotlin.analysis.api.calls.KtSimpleFunctionCall import org.jetbrains.kotlin.analysis.api.calls.successfulCallOrNull import org.jetbrains.kotlin.analysis.api.calls.symbol import org.jetbrains.kotlin.analysis.api.symbols.KtCallableSymbol import org.jetbrains.kotlin.analysis.api.symbols.KtFunctionSymbol -import org.jetbrains.kotlin.analysis.api.symbols.KtVariableLikeSymbol import org.jetbrains.kotlin.analysis.api.symbols.psiSafe import org.jetbrains.kotlin.idea.base.psi.textRangeIn import org.jetbrains.kotlin.idea.base.resources.KotlinBundle @@ -24,14 +26,20 @@ import org.jetbrains.kotlin.name.Name import org.jetbrains.kotlin.psi.KtDotQualifiedExpression import org.jetbrains.kotlin.psi.KtNamedFunction import org.jetbrains.kotlin.psi.KtSuperExpression +import org.jetbrains.kotlin.psi.KtVisitorVoid import org.jetbrains.kotlin.psi.psiUtil.getPossiblyQualifiedCallExpression import org.jetbrains.kotlin.util.OperatorNameConventions internal class ReplaceGetOrSetInspection : - AbstractKotlinApplicableInspectionWithContext( - KtDotQualifiedExpression::class - ) { + AbstractKotlinApplicableInspectionWithContext() { + override fun buildVisitor(holder: ProblemsHolder, isOnTheFly: Boolean, session: LocalInspectionToolSession): PsiElementVisitor { + return object : KtVisitorVoid() { + override fun visitDotQualifiedExpression(expression: KtDotQualifiedExpression) { + visitTargetElement(expression, holder, isOnTheFly) + } + } + } class Context(val calleeName: Name, val problemHighlightType: ProblemHighlightType) override fun getProblemDescription(element: KtDotQualifiedExpression, context: Context): String = diff --git a/plugins/kotlin/code-insight/inspections-k2/src/org/jetbrains/kotlin/idea/k2/codeinsight/inspections/UnusedSymbolInspection.kt b/plugins/kotlin/code-insight/inspections-k2/src/org/jetbrains/kotlin/idea/k2/codeinsight/inspections/UnusedSymbolInspection.kt index 938d458dd3bd..ae3701474088 100644 --- a/plugins/kotlin/code-insight/inspections-k2/src/org/jetbrains/kotlin/idea/k2/codeinsight/inspections/UnusedSymbolInspection.kt +++ b/plugins/kotlin/code-insight/inspections-k2/src/org/jetbrains/kotlin/idea/k2/codeinsight/inspections/UnusedSymbolInspection.kt @@ -3,7 +3,8 @@ package org.jetbrains.kotlin.idea.k2.codeinsight.inspections import com.intellij.codeInsight.daemon.impl.analysis.HighlightUtil import com.intellij.codeInsight.daemon.impl.analysis.JavaHighlightUtil -import org.jetbrains.kotlin.idea.highlighting.SafeDeleteFix +import com.intellij.codeInspection.LocalInspectionTool +import com.intellij.codeInspection.LocalInspectionToolSession import com.intellij.codeInspection.LocalQuickFix import com.intellij.codeInspection.ProblemsHolder import com.intellij.codeInspection.deadCode.UnusedDeclarationInspection @@ -51,9 +52,9 @@ import org.jetbrains.kotlin.idea.base.psi.mustHaveNonEmptyPrimaryConstructor import org.jetbrains.kotlin.idea.base.searching.usages.KotlinFindUsagesHandlerFactory import org.jetbrains.kotlin.idea.base.searching.usages.handlers.KotlinFindClassUsagesHandler import org.jetbrains.kotlin.idea.base.util.projectScope -import org.jetbrains.kotlin.idea.codeinsight.api.inspections.KotlinSingleElementInspection import org.jetbrains.kotlin.idea.codeinsight.utils.* import org.jetbrains.kotlin.idea.core.script.configuration.DefaultScriptingSupport +import org.jetbrains.kotlin.idea.highlighting.SafeDeleteFix import org.jetbrains.kotlin.idea.inspections.describe import org.jetbrains.kotlin.idea.references.mainReference import org.jetbrains.kotlin.idea.search.findScriptsWithUsages @@ -71,7 +72,7 @@ import org.jetbrains.kotlin.psi.psiUtil.* /** * Current inspection does nothing */ -internal class UnusedSymbolInspection : KotlinSingleElementInspection(KtNamedDeclaration::class), UnfairLocalInspectionTool { +internal class UnusedSymbolInspection : LocalInspectionTool(), UnfairLocalInspectionTool { // TODO: Having parity between Java and Kotlin might be a good idea once we replace the global Kotlin inspection with a UAST-based one. private val javaInspection = UnusedDeclarationInspection() @@ -712,11 +713,15 @@ internal class UnusedSymbolInspection : KotlinSingleElementInspection(KtNamedFunction::class), + AbstractKotlinApplicableInspectionWithContext(), CleanupLocalInspectionTool { + override fun buildVisitor(holder: ProblemsHolder, isOnTheFly: Boolean, session: LocalInspectionToolSession): PsiElementVisitor { + return object : KtVisitorVoid() { + override fun visitNamedFunction(function: KtNamedFunction) { + visitTargetElement(function, holder, isOnTheFly) + } + } + } override fun getProblemDescription(element: KtNamedFunction, context: TypeInfo): String = KotlinBundle.message("inspection.redundant.unit.return.type.display.name") diff --git a/plugins/kotlin/code-insight/inspections-k2/src/org/jetbrains/kotlin/idea/k2/codeinsight/inspections/diagnosticBased/UnusedVariableInspection.kt b/plugins/kotlin/code-insight/inspections-k2/src/org/jetbrains/kotlin/idea/k2/codeinsight/inspections/diagnosticBased/UnusedVariableInspection.kt index b67a60a939f1..7476549195ad 100644 --- a/plugins/kotlin/code-insight/inspections-k2/src/org/jetbrains/kotlin/idea/k2/codeinsight/inspections/diagnosticBased/UnusedVariableInspection.kt +++ b/plugins/kotlin/code-insight/inspections-k2/src/org/jetbrains/kotlin/idea/k2/codeinsight/inspections/diagnosticBased/UnusedVariableInspection.kt @@ -2,23 +2,33 @@ package org.jetbrains.kotlin.idea.k2.codeinsight.inspections.diagnosticBased +import com.intellij.codeInspection.LocalInspectionToolSession +import com.intellij.codeInspection.ProblemsHolder import com.intellij.openapi.editor.Editor import com.intellij.openapi.project.Project +import com.intellij.psi.PsiElementVisitor import org.jetbrains.kotlin.analysis.api.KtAnalysisSession +import org.jetbrains.kotlin.analysis.api.components.KtDiagnosticCheckerFilter import org.jetbrains.kotlin.analysis.api.fir.diagnostics.KtFirDiagnostic import org.jetbrains.kotlin.idea.base.resources.KotlinBundle import org.jetbrains.kotlin.idea.codeinsight.api.applicable.inspections.AbstractKotlinApplicableDiagnosticInspection +import org.jetbrains.kotlin.idea.codeinsight.api.applicable.inspections.AbstractKotlinApplicableInspection import org.jetbrains.kotlin.idea.codeinsight.utils.isExplicitTypeReferenceNeededForTypeInference import org.jetbrains.kotlin.idea.codeinsight.utils.removeProperty import org.jetbrains.kotlin.idea.codeinsights.impl.base.applicators.ApplicabilityRanges import org.jetbrains.kotlin.psi.KtNamedDeclaration import org.jetbrains.kotlin.psi.KtProperty +import org.jetbrains.kotlin.psi.KtVisitorVoid -internal class UnusedVariableInspection : - AbstractKotlinApplicableDiagnosticInspection( - KtNamedDeclaration::class, - ) { - +internal class UnusedVariableInspection + : AbstractKotlinApplicableInspection(), AbstractKotlinApplicableDiagnosticInspection { + override fun buildVisitor(holder: ProblemsHolder, isOnTheFly: Boolean, session: LocalInspectionToolSession): PsiElementVisitor { + return object : KtVisitorVoid() { + override fun visitNamedDeclaration(declaration: KtNamedDeclaration) { + visitTargetElement(declaration, holder, isOnTheFly) + } + } + } override fun getProblemDescription(element: KtNamedDeclaration): String = KotlinBundle.message("inspection.kotlin.unused.variable.display.name") @@ -32,10 +42,18 @@ internal class UnusedVariableInspection : override fun getApplicabilityRange() = ApplicabilityRanges.DECLARATION_NAME context(KtAnalysisSession) - override fun isApplicableByDiagnostic(element: KtNamedDeclaration, diagnostic: KtFirDiagnostic.UnusedVariable): Boolean { + fun isApplicableByDiagnostic(element: KtNamedDeclaration, diagnostic: KtFirDiagnostic.UnusedVariable): Boolean { val ktProperty = diagnostic.psi as? KtProperty ?: return false return !ktProperty.isExplicitTypeReferenceNeededForTypeInference() } + context(KtAnalysisSession) + override fun isApplicableByAnalyze(element: KtNamedDeclaration): Boolean { + val diagnostics = element.getDiagnostics(KtDiagnosticCheckerFilter.ONLY_EXTENDED_CHECKERS) + val suitableDiagnostics = diagnostics.filterIsInstance(getDiagnosticType().java) + val diagnostic = suitableDiagnostics.firstOrNull() ?: return false + return isApplicableByDiagnostic(element, diagnostic) + } + override fun apply(element: KtNamedDeclaration, project: Project, editor: Editor?) { val property = element as? KtProperty ?: return diff --git a/plugins/kotlin/code-insight/inspections-k2/src/org/jetbrains/kotlin/idea/k2/codeinsight/inspections/expressions/KotlinDoubleNegationInspection.kt b/plugins/kotlin/code-insight/inspections-k2/src/org/jetbrains/kotlin/idea/k2/codeinsight/inspections/expressions/KotlinDoubleNegationInspection.kt index 3861700ce36f..76e031556e99 100644 --- a/plugins/kotlin/code-insight/inspections-k2/src/org/jetbrains/kotlin/idea/k2/codeinsight/inspections/expressions/KotlinDoubleNegationInspection.kt +++ b/plugins/kotlin/code-insight/inspections-k2/src/org/jetbrains/kotlin/idea/k2/codeinsight/inspections/expressions/KotlinDoubleNegationInspection.kt @@ -1,9 +1,12 @@ // Copyright 2000-2022 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license. package org.jetbrains.kotlin.idea.k2.codeinsight.inspections.expressions +import com.intellij.codeInspection.LocalInspectionToolSession +import com.intellij.codeInspection.ProblemsHolder import com.intellij.openapi.editor.Editor import com.intellij.openapi.project.Project import com.intellij.psi.PsiElement +import com.intellij.psi.PsiElementVisitor import org.jetbrains.kotlin.analysis.api.KtAnalysisSession import org.jetbrains.kotlin.idea.base.resources.KotlinBundle import org.jetbrains.kotlin.idea.codeinsight.api.applicable.inspections.AbstractKotlinApplicableInspection @@ -12,8 +15,16 @@ import org.jetbrains.kotlin.idea.codeinsights.impl.base.applicators.Applicabilit import org.jetbrains.kotlin.lexer.KtTokens import org.jetbrains.kotlin.psi.KtParenthesizedExpression import org.jetbrains.kotlin.psi.KtPrefixExpression +import org.jetbrains.kotlin.psi.KtVisitorVoid -internal class KotlinDoubleNegationInspection : AbstractKotlinApplicableInspection(KtPrefixExpression::class) { +internal class KotlinDoubleNegationInspection : AbstractKotlinApplicableInspection() { + override fun buildVisitor(holder: ProblemsHolder, isOnTheFly: Boolean, session: LocalInspectionToolSession): PsiElementVisitor { + return object : KtVisitorVoid() { + override fun visitPrefixExpression(expression: KtPrefixExpression) { + visitTargetElement(expression, holder, isOnTheFly) + } + } + } override fun getProblemDescription(element: KtPrefixExpression): String = KotlinBundle.message("inspection.kotlin.double.negation.display.name") diff --git a/plugins/kotlin/code-insight/inspections-k2/src/org/jetbrains/kotlin/idea/k2/codeinsight/inspections/expressions/ReplaceCallWithBinaryOperatorInspection.kt b/plugins/kotlin/code-insight/inspections-k2/src/org/jetbrains/kotlin/idea/k2/codeinsight/inspections/expressions/ReplaceCallWithBinaryOperatorInspection.kt index c27b0736dfb3..f3edfcdf5789 100644 --- a/plugins/kotlin/code-insight/inspections-k2/src/org/jetbrains/kotlin/idea/k2/codeinsight/inspections/expressions/ReplaceCallWithBinaryOperatorInspection.kt +++ b/plugins/kotlin/code-insight/inspections-k2/src/org/jetbrains/kotlin/idea/k2/codeinsight/inspections/expressions/ReplaceCallWithBinaryOperatorInspection.kt @@ -3,9 +3,12 @@ package org.jetbrains.kotlin.idea.k2.codeinsight.inspections.expressions import com.intellij.codeInsight.intention.FileModifier +import com.intellij.codeInspection.LocalInspectionToolSession import com.intellij.codeInspection.ProblemHighlightType +import com.intellij.codeInspection.ProblemsHolder import com.intellij.openapi.editor.Editor import com.intellij.openapi.project.Project +import com.intellij.psi.PsiElementVisitor import org.jetbrains.kotlin.analysis.api.KtAnalysisSession import org.jetbrains.kotlin.analysis.api.analyze import org.jetbrains.kotlin.analysis.api.calls.KtSimpleFunctionCall @@ -29,10 +32,15 @@ import org.jetbrains.kotlin.types.expressions.OperatorConventions import org.jetbrains.kotlin.util.OperatorNameConventions internal class ReplaceCallWithBinaryOperatorInspection : - AbstractKotlinApplicableInspectionWithContext( - KtDotQualifiedExpression::class - ) { + AbstractKotlinApplicableInspectionWithContext() { + override fun buildVisitor(holder: ProblemsHolder, isOnTheFly: Boolean, session: LocalInspectionToolSession): PsiElementVisitor { + return object : KtVisitorVoid() { + override fun visitDotQualifiedExpression(expression: KtDotQualifiedExpression) { + visitTargetElement(expression, holder, isOnTheFly) + } + } + } @FileModifier.SafeTypeForPreview data class Context(val operation: KtSingleValueToken, val isFloatingPointEquals: Boolean) diff --git a/plugins/kotlin/code-insight/inspections-k2/src/org/jetbrains/kotlin/idea/k2/codeinsight/inspections/expressions/ReplaceCollectionCountWithSizeInspection.kt b/plugins/kotlin/code-insight/inspections-k2/src/org/jetbrains/kotlin/idea/k2/codeinsight/inspections/expressions/ReplaceCollectionCountWithSizeInspection.kt index 95c5c398b689..a7949f701e4e 100644 --- a/plugins/kotlin/code-insight/inspections-k2/src/org/jetbrains/kotlin/idea/k2/codeinsight/inspections/expressions/ReplaceCollectionCountWithSizeInspection.kt +++ b/plugins/kotlin/code-insight/inspections-k2/src/org/jetbrains/kotlin/idea/k2/codeinsight/inspections/expressions/ReplaceCollectionCountWithSizeInspection.kt @@ -1,8 +1,11 @@ // Copyright 2000-2022 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license. package org.jetbrains.kotlin.idea.k2.codeinsight.inspections.expressions +import com.intellij.codeInspection.LocalInspectionToolSession +import com.intellij.codeInspection.ProblemsHolder import com.intellij.openapi.editor.Editor import com.intellij.openapi.project.Project +import com.intellij.psi.PsiElementVisitor import org.jetbrains.kotlin.analysis.api.KtAnalysisSession import org.jetbrains.kotlin.analysis.api.symbols.KtFunctionSymbol import org.jetbrains.kotlin.analysis.api.symbols.receiverType @@ -18,12 +21,21 @@ import org.jetbrains.kotlin.name.Name import org.jetbrains.kotlin.name.StandardClassIds import org.jetbrains.kotlin.psi.KtCallExpression import org.jetbrains.kotlin.psi.KtPsiFactory +import org.jetbrains.kotlin.psi.KtVisitorVoid private val COLLECTION_COUNT_CALLABLE_ID = CallableId(StandardNames.COLLECTIONS_PACKAGE_FQ_NAME, Name.identifier("count")) private val COLLECTION_CLASS_IDS = setOf(StandardClassIds.Collection, StandardClassIds.Array, StandardClassIds.Map) + StandardClassIds.elementTypeByPrimitiveArrayType.keys + StandardClassIds.unsignedArrayTypeByElementType.keys -internal class ReplaceCollectionCountWithSizeInspection : AbstractKotlinApplicableInspection(KtCallExpression::class) { +internal class ReplaceCollectionCountWithSizeInspection : AbstractKotlinApplicableInspection() { + override fun buildVisitor(holder: ProblemsHolder, isOnTheFly: Boolean, session: LocalInspectionToolSession): PsiElementVisitor { + return object : KtVisitorVoid() { + override fun visitCallExpression(expression: KtCallExpression) { + visitTargetElement(expression, holder, isOnTheFly) + } + } + } + override fun getProblemDescription(element: KtCallExpression): String = KotlinBundle.message("inspection.replace.collection.count.with.size.display.name") diff --git a/plugins/kotlin/code-insight/inspections-k2/src/org/jetbrains/kotlin/idea/k2/codeinsight/inspections/expressions/ReplaceSizeCheckInspectionBase.kt b/plugins/kotlin/code-insight/inspections-k2/src/org/jetbrains/kotlin/idea/k2/codeinsight/inspections/expressions/ReplaceSizeCheckInspectionBase.kt index 1f6fb926635a..fed9d0e6bbd5 100644 --- a/plugins/kotlin/code-insight/inspections-k2/src/org/jetbrains/kotlin/idea/k2/codeinsight/inspections/expressions/ReplaceSizeCheckInspectionBase.kt +++ b/plugins/kotlin/code-insight/inspections-k2/src/org/jetbrains/kotlin/idea/k2/codeinsight/inspections/expressions/ReplaceSizeCheckInspectionBase.kt @@ -1,8 +1,11 @@ // Copyright 2000-2022 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license. package org.jetbrains.kotlin.idea.k2.codeinsight.inspections.expressions +import com.intellij.codeInspection.LocalInspectionToolSession +import com.intellij.codeInspection.ProblemsHolder import com.intellij.openapi.editor.Editor import com.intellij.openapi.project.Project +import com.intellij.psi.PsiElementVisitor import org.jetbrains.kotlin.analysis.api.KtAnalysisSession import org.jetbrains.kotlin.analysis.api.calls.* import org.jetbrains.kotlin.idea.codeinsight.api.applicable.inspections.AbstractKotlinApplicableInspectionWithContext @@ -11,16 +14,18 @@ import org.jetbrains.kotlin.name.CallableId import org.jetbrains.kotlin.name.ClassId import org.jetbrains.kotlin.name.Name import org.jetbrains.kotlin.name.StandardClassIds -import org.jetbrains.kotlin.psi.KtBinaryExpression -import org.jetbrains.kotlin.psi.KtDotQualifiedExpression -import org.jetbrains.kotlin.psi.KtExpression -import org.jetbrains.kotlin.psi.KtPsiFactory +import org.jetbrains.kotlin.psi.* internal sealed class ReplaceSizeCheckInspectionBase : - AbstractKotlinApplicableInspectionWithContext( - KtBinaryExpression::class - ) { + AbstractKotlinApplicableInspectionWithContext() { + override fun buildVisitor(holder: ProblemsHolder, isOnTheFly: Boolean, session: LocalInspectionToolSession): PsiElementVisitor { + return object : KtVisitorVoid() { + override fun visitBinaryExpression(expression: KtBinaryExpression) { + visitTargetElement(expression, holder, isOnTheFly) + } + } + } enum class EmptinessCheckMethod(val callString: String) { IS_EMPTY("isEmpty()"), IS_NOT_EMPTY("isNotEmpty()") } diff --git a/plugins/kotlin/code-insight/inspections-k2/src/org/jetbrains/kotlin/idea/k2/codeinsight/inspections/expressions/WhenWithOnlyElseInspection.kt b/plugins/kotlin/code-insight/inspections-k2/src/org/jetbrains/kotlin/idea/k2/codeinsight/inspections/expressions/WhenWithOnlyElseInspection.kt index 4ee1f3cdc9f5..3462ff72d68b 100644 --- a/plugins/kotlin/code-insight/inspections-k2/src/org/jetbrains/kotlin/idea/k2/codeinsight/inspections/expressions/WhenWithOnlyElseInspection.kt +++ b/plugins/kotlin/code-insight/inspections-k2/src/org/jetbrains/kotlin/idea/k2/codeinsight/inspections/expressions/WhenWithOnlyElseInspection.kt @@ -1,10 +1,13 @@ // Copyright 2000-2022 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license. package org.jetbrains.kotlin.idea.k2.codeinsight.inspections.expressions +import com.intellij.codeInspection.LocalInspectionToolSession +import com.intellij.codeInspection.ProblemsHolder import com.intellij.openapi.editor.Editor 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.SmartPsiElementPointer import com.intellij.psi.search.searches.ReferencesSearch import com.intellij.refactoring.suggested.startOffset @@ -15,7 +18,7 @@ import org.jetbrains.kotlin.analysis.api.lifetime.allowAnalysisFromWriteAction import org.jetbrains.kotlin.idea.base.analysis.api.utils.shortenReferencesInRange import org.jetbrains.kotlin.idea.base.resources.KotlinBundle import org.jetbrains.kotlin.idea.codeinsight.api.applicable.inspections.AbstractKotlinApplicableInspectionWithContext -import org.jetbrains.kotlin.idea.codeinsight.api.applicators.* +import org.jetbrains.kotlin.idea.codeinsight.api.applicators.KotlinApplicabilityRange import org.jetbrains.kotlin.idea.codeinsights.impl.base.applicators.ApplicabilityRanges import org.jetbrains.kotlin.psi.* import org.jetbrains.kotlin.psi.psiUtil.createSmartPointer @@ -42,8 +45,15 @@ import org.jetbrains.kotlin.psi.psiUtil.createSmartPointer * contingent on a few complications. See Steps 3.1 and 3.2 below. */ internal class WhenWithOnlyElseInspection - : AbstractKotlinApplicableInspectionWithContext(KtWhenExpression::class) { + : AbstractKotlinApplicableInspectionWithContext() { + override fun buildVisitor(holder: ProblemsHolder, isOnTheFly: Boolean, session: LocalInspectionToolSession): PsiElementVisitor { + return object : KtVisitorVoid() { + override fun visitWhenExpression(expression: KtWhenExpression) { + visitTargetElement(expression, holder, isOnTheFly) + } + } + } data class WhenSubjectVariableInfo( val subjectVariable: SmartPsiElementPointer, val initializer: SmartPsiElementPointer?, diff --git a/plugins/kotlin/code-insight/inspections-shared/src/org/jetbrains/kotlin/idea/codeInsight/inspections/shared/FilterIsInstanceCallWithClassLiteralArgumentInspection.kt b/plugins/kotlin/code-insight/inspections-shared/src/org/jetbrains/kotlin/idea/codeInsight/inspections/shared/FilterIsInstanceCallWithClassLiteralArgumentInspection.kt index 55436f8ff1e4..68530adb2d25 100644 --- a/plugins/kotlin/code-insight/inspections-shared/src/org/jetbrains/kotlin/idea/codeInsight/inspections/shared/FilterIsInstanceCallWithClassLiteralArgumentInspection.kt +++ b/plugins/kotlin/code-insight/inspections-shared/src/org/jetbrains/kotlin/idea/codeInsight/inspections/shared/FilterIsInstanceCallWithClassLiteralArgumentInspection.kt @@ -2,8 +2,11 @@ package org.jetbrains.kotlin.idea.codeInsight.inspections.shared import com.intellij.codeInspection.CleanupLocalInspectionTool +import com.intellij.codeInspection.LocalInspectionToolSession +import com.intellij.codeInspection.ProblemsHolder import com.intellij.openapi.editor.Editor import com.intellij.openapi.project.Project +import com.intellij.psi.PsiElementVisitor import org.jetbrains.kotlin.analysis.api.KtAnalysisSession import org.jetbrains.kotlin.analysis.api.symbols.KtFunctionSymbol import org.jetbrains.kotlin.analysis.api.symbols.KtNamedClassOrObjectSymbol @@ -22,8 +25,15 @@ import org.jetbrains.kotlin.psi.psiUtil.getQualifiedElementSelector private val FILTER_IS_INSTANCE_CALLABLE_ID = CallableId(StandardClassIds.BASE_COLLECTIONS_PACKAGE, Name.identifier("filterIsInstance")) internal class FilterIsInstanceCallWithClassLiteralArgumentInspection : - AbstractKotlinApplicableInspection(KtCallExpression::class), CleanupLocalInspectionTool { + AbstractKotlinApplicableInspection(), CleanupLocalInspectionTool { + override fun buildVisitor(holder: ProblemsHolder, isOnTheFly: Boolean, session: LocalInspectionToolSession): PsiElementVisitor { + return object : KtVisitorVoid() { + override fun visitCallExpression(expression: KtCallExpression) { + visitTargetElement(expression, holder, isOnTheFly) + } + } + } override fun getProblemDescription(element: KtCallExpression): String = KotlinBundle.message("inspection.filter.is.instance.call.with.class.literal.argument.display.name") diff --git a/plugins/kotlin/code-insight/inspections-shared/src/org/jetbrains/kotlin/idea/codeInsight/inspections/shared/RemoveEmptyParenthesesFromLambdaCallInspection.kt b/plugins/kotlin/code-insight/inspections-shared/src/org/jetbrains/kotlin/idea/codeInsight/inspections/shared/RemoveEmptyParenthesesFromLambdaCallInspection.kt index bb85024b8ad9..28bab095e840 100644 --- a/plugins/kotlin/code-insight/inspections-shared/src/org/jetbrains/kotlin/idea/codeInsight/inspections/shared/RemoveEmptyParenthesesFromLambdaCallInspection.kt +++ b/plugins/kotlin/code-insight/inspections-shared/src/org/jetbrains/kotlin/idea/codeInsight/inspections/shared/RemoveEmptyParenthesesFromLambdaCallInspection.kt @@ -2,8 +2,11 @@ package org.jetbrains.kotlin.idea.codeInsight.inspections.shared import com.intellij.codeInspection.CleanupLocalInspectionTool +import com.intellij.codeInspection.LocalInspectionToolSession +import com.intellij.codeInspection.ProblemsHolder import com.intellij.openapi.editor.Editor import com.intellij.openapi.project.Project +import com.intellij.psi.PsiElementVisitor import org.jetbrains.kotlin.analysis.api.KtAnalysisSession import org.jetbrains.kotlin.analysis.api.calls.KtSuccessCallInfo import org.jetbrains.kotlin.idea.base.resources.KotlinBundle @@ -14,9 +17,17 @@ import org.jetbrains.kotlin.idea.codeinsights.impl.base.RemoveEmptyParenthesesFr import org.jetbrains.kotlin.idea.codeinsights.impl.base.applicators.ApplicabilityRanges import org.jetbrains.kotlin.psi.KtCallExpression import org.jetbrains.kotlin.psi.KtValueArgumentList +import org.jetbrains.kotlin.psi.KtVisitorVoid -internal class RemoveEmptyParenthesesFromLambdaCallInspection : AbstractKotlinApplicableInspection(KtValueArgumentList::class), +internal class RemoveEmptyParenthesesFromLambdaCallInspection : AbstractKotlinApplicableInspection(), CleanupLocalInspectionTool { + override fun buildVisitor(holder: ProblemsHolder, isOnTheFly: Boolean, session: LocalInspectionToolSession): PsiElementVisitor { + return object : KtVisitorVoid() { + override fun visitValueArgumentList(list: KtValueArgumentList) { + visitTargetElement(list, holder, isOnTheFly) + } + } + } override fun getProblemDescription(element: KtValueArgumentList): String = KotlinBundle.message("inspection.remove.empty.parentheses.from.lambda.call.display.name") diff --git a/plugins/kotlin/code-insight/intentions-k2/src/org/jetbrains/kotlin/idea/k2/codeinsight/inspections/ConvertToStringTemplateInspection.kt b/plugins/kotlin/code-insight/intentions-k2/src/org/jetbrains/kotlin/idea/k2/codeinsight/inspections/ConvertToStringTemplateInspection.kt index 4ee0584028e3..c1d36c8da96d 100644 --- a/plugins/kotlin/code-insight/intentions-k2/src/org/jetbrains/kotlin/idea/k2/codeinsight/inspections/ConvertToStringTemplateInspection.kt +++ b/plugins/kotlin/code-insight/intentions-k2/src/org/jetbrains/kotlin/idea/k2/codeinsight/inspections/ConvertToStringTemplateInspection.kt @@ -1,8 +1,11 @@ // Copyright 2000-2022 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license. package org.jetbrains.kotlin.idea.k2.codeinsight.inspections +import com.intellij.codeInspection.LocalInspectionToolSession +import com.intellij.codeInspection.ProblemsHolder import com.intellij.openapi.editor.Editor import com.intellij.openapi.project.Project +import com.intellij.psi.PsiElementVisitor import com.intellij.psi.SmartPsiElementPointer import com.intellij.refactoring.suggested.createSmartPointer import org.jetbrains.kotlin.analysis.api.KtAnalysisSession @@ -18,10 +21,16 @@ import org.jetbrains.kotlin.idea.codeinsights.impl.base.isFirstStringPlusExpress import org.jetbrains.kotlin.lexer.KtTokens import org.jetbrains.kotlin.psi.KtBinaryExpression import org.jetbrains.kotlin.psi.KtStringTemplateExpression +import org.jetbrains.kotlin.psi.KtVisitorVoid -internal class ConvertToStringTemplateInspection : AbstractKotlinApplicableInspectionWithContext( - KtBinaryExpression::class -) { +internal class ConvertToStringTemplateInspection : AbstractKotlinApplicableInspectionWithContext() { + override fun buildVisitor(holder: ProblemsHolder, isOnTheFly: Boolean, session: LocalInspectionToolSession): PsiElementVisitor { + return object : KtVisitorVoid() { + override fun visitBinaryExpression(expression: KtBinaryExpression) { + visitTargetElement(expression, holder, isOnTheFly) + } + } + } class Context(val replacement: SmartPsiElementPointer) override fun apply(element: KtBinaryExpression, context: Context, project: Project, editor: Editor?) {