mirror of
https://gitflic.ru/project/openide/openide.git
synced 2026-03-22 15:19:59 +07:00
remove KotlinSingleElementInspection because it enumerated all PSI elements unnecessarily; use KtElementVisitor instead
GitOrigin-RevId: 573f1e59d63342b4519a3bfb915b45e2ef3143ba
This commit is contained in:
committed by
intellij-monorepo-bot
parent
4e16e994b0
commit
6570ca8f92
@@ -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
|
||||
}
|
||||
|
||||
@@ -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()
|
||||
}
|
||||
@@ -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)
|
||||
}
|
||||
}
|
||||
@@ -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
|
||||
*/
|
||||
|
||||
@@ -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 {
|
||||
|
||||
@@ -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
|
||||
*/
|
||||
|
||||
@@ -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)
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -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 =
|
||||
|
||||
@@ -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 ?: "???"
|
||||
)
|
||||
|
||||
@@ -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")
|
||||
|
||||
|
||||
@@ -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")
|
||||
|
||||
|
||||
@@ -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")
|
||||
|
||||
|
||||
@@ -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 =
|
||||
|
||||
@@ -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")
|
||||
|
||||
|
||||
@@ -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 =
|
||||
|
||||
@@ -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())
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -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")
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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")
|
||||
|
||||
|
||||
@@ -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)
|
||||
|
||||
|
||||
@@ -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")
|
||||
|
||||
|
||||
@@ -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()")
|
||||
}
|
||||
|
||||
@@ -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>?,
|
||||
|
||||
@@ -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")
|
||||
|
||||
|
||||
@@ -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")
|
||||
|
||||
|
||||
@@ -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?) {
|
||||
|
||||
Reference in New Issue
Block a user