remove KotlinSingleElementInspection because it enumerated all PSI elements unnecessarily; use KtElementVisitor instead

GitOrigin-RevId: 573f1e59d63342b4519a3bfb915b45e2ef3143ba
This commit is contained in:
Alexey Kudravtsev
2023-08-10 19:37:38 +02:00
committed by intellij-monorepo-bot
parent 4e16e994b0
commit 6570ca8f92
26 changed files with 270 additions and 158 deletions

View File

@@ -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<ELEMENT : KtElement, DIAGNOSTIC : KtDiagnosticWithPsi<ELEMENT>>(
elementType: KClass<ELEMENT>,
) : AbstractKotlinApplicableInspection<ELEMENT>(elementType), AbstractKotlinApplicableDiagnosticInspectionBase<ELEMENT, DIAGNOSTIC> {
interface AbstractKotlinApplicableDiagnosticInspection<
ELEMENT : KtElement,
DIAGNOSTIC : KtDiagnosticWithPsi<ELEMENT>
> : KotlinApplicableToolBase<ELEMENT> {
/**
* 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<DIAGNOSTIC>
context(KtAnalysisSession)
final override fun isApplicableByAnalyze(element: ELEMENT): Boolean {
val diagnostic = this.getDiagnostic(element) ?: return false
return isApplicableByDiagnostic(element, diagnostic)
}
}
override fun isApplicableByPsi(element: ELEMENT): Boolean = true
}

View File

@@ -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<ELEMENT>
> : KotlinApplicableToolBase<ELEMENT> {
/**
* The type of the [KtDiagnosticWithPsi] which should be filtered for.
*/
fun getDiagnosticType(): KClass<DIAGNOSTIC>
override fun isApplicableByPsi(element: ELEMENT): Boolean = true
}
context(KtAnalysisSession)
internal fun <
ELEMENT : KtElement,
DIAGNOSTIC : KtDiagnosticWithPsi<ELEMENT>
> AbstractKotlinApplicableDiagnosticInspectionBase<ELEMENT, DIAGNOSTIC>.getDiagnostic(element: ELEMENT): DIAGNOSTIC? {
val diagnostics = element.getDiagnostics(KtDiagnosticCheckerFilter.ONLY_EXTENDED_CHECKERS)
val suitableDiagnostics = diagnostics.filterIsInstance(getDiagnosticType().java)
return suitableDiagnostics.firstOrNull()
}

View File

@@ -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<ELEMENT : KtElement, DIAGNOSTIC : KtDiagnosticWithPsi<ELEMENT>, CONTEXT>(
elementType: KClass<ELEMENT>,
) : AbstractKotlinApplicableInspectionWithContext<ELEMENT, CONTEXT>(elementType), AbstractKotlinApplicableDiagnosticInspectionBase<ELEMENT, DIAGNOSTIC> {
abstract class AbstractKotlinApplicableDiagnosticInspectionWithContext<ELEMENT : KtElement, DIAGNOSTIC : KtDiagnosticWithPsi<ELEMENT>, CONTEXT>
: AbstractKotlinApplicableInspectionWithContext<ELEMENT, CONTEXT>(), AbstractKotlinApplicableDiagnosticInspection<ELEMENT, DIAGNOSTIC> {
/**
* Provides some context for [apply] given some [element] and [diagnostic].
*
@@ -22,7 +21,9 @@ abstract class AbstractKotlinApplicableDiagnosticInspectionWithContext<ELEMENT :
context(KtAnalysisSession)
final override fun prepareContext(element: ELEMENT): CONTEXT? {
val diagnostic = this.getDiagnostic(element) ?: return null
val diagnostics = element.getDiagnostics(KtDiagnosticCheckerFilter.ONLY_EXTENDED_CHECKERS)
val suitableDiagnostics = diagnostics.filterIsInstance(this.getDiagnosticType().java)
val diagnostic = suitableDiagnostics.firstOrNull() ?: return null
return prepareContextByDiagnostic(element, diagnostic)
}
}

View File

@@ -10,7 +10,6 @@ import org.jetbrains.kotlin.idea.codeinsight.api.applicable.KotlinApplicableTool
import org.jetbrains.kotlin.idea.codeinsight.api.applicable.isApplicableWithAnalyze
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
@@ -19,9 +18,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 AbstractKotlinApplicableInspection<ELEMENT : KtElement>(
elementType: KClass<ELEMENT>,
) : AbstractKotlinApplicableInspectionBase<ELEMENT>(elementType), KotlinApplicableTool<ELEMENT> {
abstract class AbstractKotlinApplicableInspection<ELEMENT : KtElement> : AbstractKotlinApplicableInspectionBase<ELEMENT>(), KotlinApplicableTool<ELEMENT> {
/**
* @see com.intellij.codeInspection.CommonProblemDescriptor.getDescriptionTemplate
*/

View File

@@ -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<ELEMENT : KtElement>(
elementType: KClass<ELEMENT>,
) : KotlinSingleElementInspection<ELEMENT>(elementType), KotlinApplicableToolBase<ELEMENT> {
abstract class AbstractKotlinApplicableInspectionBase<ELEMENT : KtElement> : LocalInspectionTool(), KotlinApplicableToolBase<ELEMENT> {
/**
* 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<ELEMENT : KtElement>(
*/
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<ELEMENT : KtElement>(
)
}
}
abstract override fun buildVisitor(holder: ProblemsHolder, isOnTheFly: Boolean, session: LocalInspectionToolSession): PsiElementVisitor
}
internal abstract class AbstractKotlinApplicableInspectionQuickFix<ELEMENT : KtElement> : LocalQuickFix, ReportingClassSubstitutor {

View File

@@ -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<ELEMENT : KtElement, CONTEXT>(
elementType: KClass<ELEMENT>,
) : AbstractKotlinApplicableInspectionBase<ELEMENT>(elementType), KotlinApplicableToolWithContext<ELEMENT, CONTEXT> {
abstract class AbstractKotlinApplicableInspectionWithContext<ELEMENT : KtElement, CONTEXT> : AbstractKotlinApplicableInspectionBase<ELEMENT>(), KotlinApplicableToolWithContext<ELEMENT, CONTEXT> {
/**
* @see com.intellij.codeInspection.CommonProblemDescriptor.getDescriptionTemplate
*/

View File

@@ -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<ELEMENT : KtElement>(
val elementType: KClass<ELEMENT>,
) : 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)
}
}
}

View File

@@ -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<DIAGNOSTIC : KtDiagnosticWithPsi<KtModifierListOwner>>(
private val modifierSet: TokenSet,
) : AbstractKotlinApplicableDiagnosticInspectionWithContext<KtModifierListOwner, DIAGNOSTIC, RedundantModifierInspectionBase.ModifierContext>(
KtModifierListOwner::class
),
) : AbstractKotlinApplicableDiagnosticInspectionWithContext<KtModifierListOwner, DIAGNOSTIC, RedundantModifierInspectionBase.ModifierContext>(),
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 =

View File

@@ -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, MovePropertyToConstructorInfo>(KtProperty::class) {
: AbstractKotlinApplicableInspectionWithContext<KtProperty, MovePropertyToConstructorInfo>() {
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 ?: "???"
)

View File

@@ -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, ImplicitReceiverInfo>(KtExpression::class) {
AbstractKotlinApplicableInspectionWithContext<KtExpression, ImplicitReceiverInfo>() {
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")

View File

@@ -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>(KtBinaryExpression::class) {
internal class NullableBooleanElvisInspection : AbstractKotlinApplicableInspection<KtBinaryExpression>() {
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")

View File

@@ -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>(KtBinaryExpression::class) {
internal class RedundantElvisReturnNullInspection : AbstractKotlinApplicableInspection<KtBinaryExpression>() {
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")

View File

@@ -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, RemoveSingleExpressionStringTemplateInspection.Context>(
KtStringTemplateExpression::class
) {
AbstractKotlinApplicableInspectionWithContext<KtStringTemplateExpression, RemoveSingleExpressionStringTemplateInspection.Context>() {
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 =

View File

@@ -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>(KtDotQualifiedExpression::class),
AbstractKotlinApplicableInspection<KtDotQualifiedExpression>(),
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")

View File

@@ -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, ReplaceGetOrSetInspection.Context>(
KtDotQualifiedExpression::class
) {
AbstractKotlinApplicableInspectionWithContext<KtDotQualifiedExpression, ReplaceGetOrSetInspection.Context>() {
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 =

View File

@@ -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>(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<KtNamedDec
return listOf(SafeDeleteFix(element))
}
override fun visitTargetElement(element: KtNamedDeclaration, holder: ProblemsHolder, isOnTheFly: Boolean) {
if (isOnTheFly) return
val message = element.describe()?.let { KotlinBaseHighlightingBundle.message("inspection.message.never.used", it) } ?: return
if (!isApplicableByPsi(element)) return
val psiToReportProblem = analyze(element) { getPsiToReportProblem(element) } ?: return
holder.registerProblem(psiToReportProblem, message, *createQuickFixes(element).toTypedArray())
override fun buildVisitor(holder: ProblemsHolder, isOnTheFly: Boolean, session: LocalInspectionToolSession): PsiElementVisitor {
return object: KtVisitorVoid() {
override fun visitNamedDeclaration(element: KtNamedDeclaration) {
if (isOnTheFly) return
val message = element.describe()?.let { KotlinBaseHighlightingBundle.message("inspection.message.never.used", it) } ?: return
if (!isApplicableByPsi(element)) return
val psiToReportProblem = analyze(element) { getPsiToReportProblem(element) } ?: return
holder.registerProblem(psiToReportProblem, message, *createQuickFixes(element).toTypedArray())
}
}
}
}

View File

@@ -3,8 +3,11 @@
package org.jetbrains.kotlin.idea.k2.codeinsight.inspections.declarations
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.idea.base.resources.KotlinBundle
import org.jetbrains.kotlin.idea.codeinsight.api.applicable.inspections.AbstractKotlinApplicableInspectionWithContext
@@ -12,11 +15,19 @@ import org.jetbrains.kotlin.idea.codeinsights.impl.base.CallableReturnTypeUpdate
import org.jetbrains.kotlin.idea.codeinsights.impl.base.CallableReturnTypeUpdaterUtils.updateType
import org.jetbrains.kotlin.idea.codeinsights.impl.base.applicators.ApplicabilityRanges
import org.jetbrains.kotlin.psi.KtNamedFunction
import org.jetbrains.kotlin.psi.KtVisitorVoid
internal class RedundantUnitReturnTypeInspection :
AbstractKotlinApplicableInspectionWithContext<KtNamedFunction, TypeInfo>(KtNamedFunction::class),
AbstractKotlinApplicableInspectionWithContext<KtNamedFunction, TypeInfo>(),
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")

View File

@@ -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, KtFirDiagnostic.UnusedVariable>(
KtNamedDeclaration::class,
) {
internal class UnusedVariableInspection
: AbstractKotlinApplicableInspection<KtNamedDeclaration>(), AbstractKotlinApplicableDiagnosticInspection<KtNamedDeclaration, KtFirDiagnostic.UnusedVariable> {
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

View File

@@ -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>(KtPrefixExpression::class) {
internal class KotlinDoubleNegationInspection : AbstractKotlinApplicableInspection<KtPrefixExpression>() {
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")

View File

@@ -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, ReplaceCallWithBinaryOperatorInspection.Context>(
KtDotQualifiedExpression::class
) {
AbstractKotlinApplicableInspectionWithContext<KtDotQualifiedExpression, ReplaceCallWithBinaryOperatorInspection.Context>() {
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)

View File

@@ -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>(KtCallExpression::class) {
internal class ReplaceCollectionCountWithSizeInspection : AbstractKotlinApplicableInspection<KtCallExpression>() {
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")

View File

@@ -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, ReplaceSizeCheckInspectionBase.ReplacementInfo>(
KtBinaryExpression::class
) {
AbstractKotlinApplicableInspectionWithContext<KtBinaryExpression, ReplaceSizeCheckInspectionBase.ReplacementInfo>() {
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()")
}

View File

@@ -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, WhenWithOnlyElseInspection.Context>(KtWhenExpression::class) {
: AbstractKotlinApplicableInspectionWithContext<KtWhenExpression, WhenWithOnlyElseInspection.Context>() {
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<KtProperty>,
val initializer: SmartPsiElementPointer<KtExpression>?,

View File

@@ -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>(KtCallExpression::class), CleanupLocalInspectionTool {
AbstractKotlinApplicableInspection<KtCallExpression>(), 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")

View File

@@ -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>(KtValueArgumentList::class),
internal class RemoveEmptyParenthesesFromLambdaCallInspection : AbstractKotlinApplicableInspection<KtValueArgumentList>(),
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")

View File

@@ -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, ConvertToStringTemplateInspection.Context>(
KtBinaryExpression::class
) {
internal class ConvertToStringTemplateInspection : AbstractKotlinApplicableInspectionWithContext<KtBinaryExpression, ConvertToStringTemplateInspection.Context>() {
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<KtStringTemplateExpression>)
override fun apply(element: KtBinaryExpression, context: Context, project: Project, editor: Editor?) {