From 56230420f89b75311ba97e09ef4487e0f0bf5915 Mon Sep 17 00:00:00 2001 From: Mikhail Glukhikh Date: Thu, 21 Dec 2017 17:07:16 +0300 Subject: [PATCH] AbstractApplicabilityBasedInspection: move visitor inside base class --- .../AbstractApplicabilityBasedInspection.kt | 14 ++++++++++++-- ...rayEqualityOpWithArraysEqualsInspection.kt | 14 +++----------- .../ReplacePutWithAssignmentInspection.kt | 12 +++--------- ...ReplaceWithOperatorAssignmentInspection.kt | 13 +++---------- .../SimplifyAssertNotNullInspection.kt | 11 +---------- ...mplifyNegatedBinaryExpressionInspection.kt | 14 +++----------- .../UnnecessaryVariableInspection.kt | 15 ++++----------- .../IfThenToSafeAccessInspection.kt | 13 +------------ .../IntroduceWhenSubjectInspection.kt | 12 +----------- ...ReplaceCallWithBinaryOperatorInspection.kt | 13 +++---------- .../ReplaceGetOrSetInspection.kt | 19 +++++++------------ 11 files changed, 41 insertions(+), 109 deletions(-) diff --git a/idea/idea-analysis/src/org/jetbrains/kotlin/idea/inspections/AbstractApplicabilityBasedInspection.kt b/idea/idea-analysis/src/org/jetbrains/kotlin/idea/inspections/AbstractApplicabilityBasedInspection.kt index 22b8df64398..39e431edaec 100644 --- a/idea/idea-analysis/src/org/jetbrains/kotlin/idea/inspections/AbstractApplicabilityBasedInspection.kt +++ b/idea/idea-analysis/src/org/jetbrains/kotlin/idea/inspections/AbstractApplicabilityBasedInspection.kt @@ -23,9 +23,19 @@ import com.intellij.psi.PsiElement import org.jetbrains.kotlin.psi.KtElement import org.jetbrains.kotlin.psi.KtVisitorVoid -abstract class AbstractApplicabilityBasedInspection : AbstractKotlinInspection() { +abstract class AbstractApplicabilityBasedInspection( + val elementType: Class +) : AbstractKotlinInspection() { - abstract override fun buildVisitor(holder: ProblemsHolder, isOnTheFly: Boolean, session: LocalInspectionToolSession): KtVisitorVoid + 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 + visitTargetElement(element as TElement, holder, isOnTheFly) + } + } // This function should be called from visitor built by a derived inspection protected fun visitTargetElement(element: TElement, holder: ProblemsHolder, isOnTheFly: Boolean) { diff --git a/idea/src/org/jetbrains/kotlin/idea/inspections/ReplaceArrayEqualityOpWithArraysEqualsInspection.kt b/idea/src/org/jetbrains/kotlin/idea/inspections/ReplaceArrayEqualityOpWithArraysEqualsInspection.kt index 74780d35263..828d5db9b58 100644 --- a/idea/src/org/jetbrains/kotlin/idea/inspections/ReplaceArrayEqualityOpWithArraysEqualsInspection.kt +++ b/idea/src/org/jetbrains/kotlin/idea/inspections/ReplaceArrayEqualityOpWithArraysEqualsInspection.kt @@ -16,7 +16,6 @@ package org.jetbrains.kotlin.idea.inspections -import com.intellij.codeInspection.* import com.intellij.openapi.editor.Editor import com.intellij.openapi.project.Project import com.intellij.psi.PsiElement @@ -25,11 +24,12 @@ import org.jetbrains.kotlin.idea.intentions.resolvedToArrayType import org.jetbrains.kotlin.lexer.KtTokens import org.jetbrains.kotlin.psi.KtBinaryExpression import org.jetbrains.kotlin.psi.KtPsiFactory -import org.jetbrains.kotlin.psi.KtVisitorVoid import org.jetbrains.kotlin.psi.createExpressionByPattern import org.jetbrains.kotlin.resolve.calls.callUtil.getResolvedCall -class ReplaceArrayEqualityOpWithArraysEqualsInspection : AbstractApplicabilityBasedInspection() { +class ReplaceArrayEqualityOpWithArraysEqualsInspection : AbstractApplicabilityBasedInspection( + KtBinaryExpression::class.java +) { override fun applyTo(element: PsiElement, project: Project, editor: Editor?) { val expression = element as? KtBinaryExpression ?: return val right = expression.right ?: return @@ -57,14 +57,6 @@ class ReplaceArrayEqualityOpWithArraysEqualsInspection : AbstractApplicabilityBa return rightResolvedCall?.resolvedToArrayType() == true && leftResolvedCall?.resolvedToArrayType() == true } - override fun buildVisitor(holder: ProblemsHolder, isOnTheFly: Boolean, session: LocalInspectionToolSession) = - object : KtVisitorVoid() { - override fun visitBinaryExpression(expression: KtBinaryExpression) { - super.visitBinaryExpression(expression) - visitTargetElement(expression, holder, isOnTheFly) - } - } - override fun inspectionText(element: KtBinaryExpression) = "Dangerous array comparison" override val defaultFixText: String diff --git a/idea/src/org/jetbrains/kotlin/idea/inspections/ReplacePutWithAssignmentInspection.kt b/idea/src/org/jetbrains/kotlin/idea/inspections/ReplacePutWithAssignmentInspection.kt index c5b45afb77f..d0937b772d7 100644 --- a/idea/src/org/jetbrains/kotlin/idea/inspections/ReplacePutWithAssignmentInspection.kt +++ b/idea/src/org/jetbrains/kotlin/idea/inspections/ReplacePutWithAssignmentInspection.kt @@ -16,7 +16,6 @@ package org.jetbrains.kotlin.idea.inspections -import com.intellij.codeInspection.* import com.intellij.openapi.editor.Editor import com.intellij.openapi.project.Project import com.intellij.psi.PsiElement @@ -31,14 +30,9 @@ import org.jetbrains.kotlin.resolve.calls.callUtil.getResolvedCall import org.jetbrains.kotlin.resolve.calls.resolvedCallUtil.getExplicitReceiverValue import org.jetbrains.kotlin.resolve.descriptorUtil.isSubclassOf -class ReplacePutWithAssignmentInspection : AbstractApplicabilityBasedInspection() { - override fun buildVisitor(holder: ProblemsHolder, isOnTheFly: Boolean, session: LocalInspectionToolSession): KtVisitorVoid = - object : KtVisitorVoid() { - override fun visitDotQualifiedExpression(expression: KtDotQualifiedExpression) { - super.visitDotQualifiedExpression(expression) - visitTargetElement(expression, holder, isOnTheFly) - } - } +class ReplacePutWithAssignmentInspection : AbstractApplicabilityBasedInspection( + KtDotQualifiedExpression::class.java +) { override fun isApplicable(element: KtDotQualifiedExpression): Boolean { val callExpression = element.callExpression diff --git a/idea/src/org/jetbrains/kotlin/idea/inspections/ReplaceWithOperatorAssignmentInspection.kt b/idea/src/org/jetbrains/kotlin/idea/inspections/ReplaceWithOperatorAssignmentInspection.kt index 1948dc06e8a..770aedc7f12 100644 --- a/idea/src/org/jetbrains/kotlin/idea/inspections/ReplaceWithOperatorAssignmentInspection.kt +++ b/idea/src/org/jetbrains/kotlin/idea/inspections/ReplaceWithOperatorAssignmentInspection.kt @@ -16,8 +16,6 @@ package org.jetbrains.kotlin.idea.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.PsiElement @@ -32,14 +30,9 @@ import org.jetbrains.kotlin.psi.* import org.jetbrains.kotlin.resolve.BindingContext import org.jetbrains.kotlin.resolve.lazy.BodyResolveMode -class ReplaceWithOperatorAssignmentInspection : AbstractApplicabilityBasedInspection() { - override fun buildVisitor(holder: ProblemsHolder, isOnTheFly: Boolean, session: LocalInspectionToolSession): KtVisitorVoid = - object : KtVisitorVoid() { - override fun visitBinaryExpression(expression: KtBinaryExpression) { - super.visitBinaryExpression(expression) - visitTargetElement(expression, holder, isOnTheFly) - } - } +class ReplaceWithOperatorAssignmentInspection : AbstractApplicabilityBasedInspection( + KtBinaryExpression::class.java +) { override fun isApplicable(element: KtBinaryExpression): Boolean { if (element.operationToken != KtTokens.EQ) return false diff --git a/idea/src/org/jetbrains/kotlin/idea/inspections/SimplifyAssertNotNullInspection.kt b/idea/src/org/jetbrains/kotlin/idea/inspections/SimplifyAssertNotNullInspection.kt index e017b75b2dc..fef071551bd 100644 --- a/idea/src/org/jetbrains/kotlin/idea/inspections/SimplifyAssertNotNullInspection.kt +++ b/idea/src/org/jetbrains/kotlin/idea/inspections/SimplifyAssertNotNullInspection.kt @@ -17,8 +17,6 @@ package org.jetbrains.kotlin.idea.inspections import com.intellij.codeInsight.CodeInsightUtilCore -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 @@ -39,14 +37,7 @@ import org.jetbrains.kotlin.resolve.calls.model.isReallySuccess import org.jetbrains.kotlin.resolve.lazy.BodyResolveMode import org.jetbrains.kotlin.utils.addToStdlib.firstIsInstanceOrNull -class SimplifyAssertNotNullInspection : AbstractApplicabilityBasedInspection() { - override fun buildVisitor(holder: ProblemsHolder, isOnTheFly: Boolean, session: LocalInspectionToolSession): KtVisitorVoid = - object : KtVisitorVoid() { - override fun visitCallExpression(expression: KtCallExpression) { - super.visitCallExpression(expression) - visitTargetElement(expression, holder, isOnTheFly) - } - } +class SimplifyAssertNotNullInspection : AbstractApplicabilityBasedInspection(KtCallExpression::class.java) { override fun isApplicable(element: KtCallExpression): Boolean { if ((element.calleeExpression as? KtNameReferenceExpression)?.getReferencedName() != "assert") return false diff --git a/idea/src/org/jetbrains/kotlin/idea/inspections/SimplifyNegatedBinaryExpressionInspection.kt b/idea/src/org/jetbrains/kotlin/idea/inspections/SimplifyNegatedBinaryExpressionInspection.kt index 542c8a7e75f..d9c10d489b0 100644 --- a/idea/src/org/jetbrains/kotlin/idea/inspections/SimplifyNegatedBinaryExpressionInspection.kt +++ b/idea/src/org/jetbrains/kotlin/idea/inspections/SimplifyNegatedBinaryExpressionInspection.kt @@ -16,25 +16,17 @@ package org.jetbrains.kotlin.idea.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.PsiElement import com.intellij.psi.tree.IElementType -import org.jetbrains.kotlin.idea.inspections.AbstractApplicabilityBasedInspection import org.jetbrains.kotlin.lexer.KtSingleValueToken import org.jetbrains.kotlin.lexer.KtTokens import org.jetbrains.kotlin.psi.* -class SimplifyNegatedBinaryExpressionInspection : AbstractApplicabilityBasedInspection() { - override fun buildVisitor(holder: ProblemsHolder, isOnTheFly: Boolean, session: LocalInspectionToolSession): KtVisitorVoid = - object : KtVisitorVoid() { - override fun visitPrefixExpression(expression: KtPrefixExpression) { - super.visitPrefixExpression(expression) - visitTargetElement(expression, holder, isOnTheFly) - } - } +class SimplifyNegatedBinaryExpressionInspection : AbstractApplicabilityBasedInspection( + KtPrefixExpression::class.java +) { private fun IElementType.negate(): KtSingleValueToken? = when (this) { KtTokens.IN_KEYWORD -> KtTokens.NOT_IN diff --git a/idea/src/org/jetbrains/kotlin/idea/inspections/UnnecessaryVariableInspection.kt b/idea/src/org/jetbrains/kotlin/idea/inspections/UnnecessaryVariableInspection.kt index 9a96d2fa755..735a0dd9029 100644 --- a/idea/src/org/jetbrains/kotlin/idea/inspections/UnnecessaryVariableInspection.kt +++ b/idea/src/org/jetbrains/kotlin/idea/inspections/UnnecessaryVariableInspection.kt @@ -16,7 +16,6 @@ package org.jetbrains.kotlin.idea.inspections -import com.intellij.codeInspection.* import com.intellij.openapi.editor.Editor import com.intellij.openapi.project.Project import com.intellij.psi.PsiElement @@ -28,20 +27,14 @@ import org.jetbrains.kotlin.idea.caches.resolve.analyze import org.jetbrains.kotlin.idea.core.NewDeclarationNameValidator import org.jetbrains.kotlin.idea.refactoring.inline.KotlinInlineValHandler import org.jetbrains.kotlin.psi.* -import org.jetbrains.kotlin.psi.psiUtil.* +import org.jetbrains.kotlin.psi.psiUtil.getNextSiblingIgnoringWhitespaceAndComments +import org.jetbrains.kotlin.psi.psiUtil.getParentOfType +import org.jetbrains.kotlin.psi.psiUtil.getStrictParentOfType import org.jetbrains.kotlin.resolve.BindingContext.DECLARATION_TO_DESCRIPTOR import org.jetbrains.kotlin.resolve.BindingContext.REFERENCE_TARGET import org.jetbrains.kotlin.resolve.DescriptorToSourceUtils -class UnnecessaryVariableInspection : AbstractApplicabilityBasedInspection() { - - override fun buildVisitor(holder: ProblemsHolder, isOnTheFly: Boolean, session: LocalInspectionToolSession): KtVisitorVoid = - object : KtVisitorVoid() { - override fun visitProperty(property: KtProperty) { - super.visitProperty(property) - visitTargetElement(property, holder, isOnTheFly) - } - } +class UnnecessaryVariableInspection : AbstractApplicabilityBasedInspection(KtProperty::class.java) { override fun isApplicable(element: KtProperty) = statusFor(element) != null diff --git a/idea/src/org/jetbrains/kotlin/idea/inspections/branchedTransformations/IfThenToSafeAccessInspection.kt b/idea/src/org/jetbrains/kotlin/idea/inspections/branchedTransformations/IfThenToSafeAccessInspection.kt index 429821b532e..ce5a9b761f0 100644 --- a/idea/src/org/jetbrains/kotlin/idea/inspections/branchedTransformations/IfThenToSafeAccessInspection.kt +++ b/idea/src/org/jetbrains/kotlin/idea/inspections/branchedTransformations/IfThenToSafeAccessInspection.kt @@ -16,30 +16,19 @@ package org.jetbrains.kotlin.idea.inspections.branchedTransformations -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.PsiElement import org.jetbrains.kotlin.idea.core.replaced import org.jetbrains.kotlin.idea.inspections.AbstractApplicabilityBasedInspection -import org.jetbrains.kotlin.idea.inspections.IntentionBasedInspection -import org.jetbrains.kotlin.idea.intentions.SelfTargetingOffsetIndependentIntention import org.jetbrains.kotlin.idea.intentions.branchedTransformations.* import org.jetbrains.kotlin.idea.util.application.runWriteAction import org.jetbrains.kotlin.psi.* import org.jetbrains.kotlin.psi.psiUtil.getParentOfType import org.jetbrains.kotlin.resolve.bindingContextUtil.isUsedAsExpression -class IfThenToSafeAccessInspection : AbstractApplicabilityBasedInspection() { - override fun buildVisitor(holder: ProblemsHolder, isOnTheFly: Boolean, session: LocalInspectionToolSession): KtVisitorVoid = - object : KtVisitorVoid() { - override fun visitIfExpression(expression: KtIfExpression) { - super.visitIfExpression(expression) - visitTargetElement(expression, holder, isOnTheFly) - } - } +class IfThenToSafeAccessInspection : AbstractApplicabilityBasedInspection(KtIfExpression::class.java) { override fun isApplicable(element: KtIfExpression): Boolean { val ifThenToSelectData = element.buildSelectTransformationData() ?: return false diff --git a/idea/src/org/jetbrains/kotlin/idea/inspections/branchedTransformations/IntroduceWhenSubjectInspection.kt b/idea/src/org/jetbrains/kotlin/idea/inspections/branchedTransformations/IntroduceWhenSubjectInspection.kt index 1db16937140..bd5fc72b34f 100644 --- a/idea/src/org/jetbrains/kotlin/idea/inspections/branchedTransformations/IntroduceWhenSubjectInspection.kt +++ b/idea/src/org/jetbrains/kotlin/idea/inspections/branchedTransformations/IntroduceWhenSubjectInspection.kt @@ -16,26 +16,16 @@ package org.jetbrains.kotlin.idea.inspections.branchedTransformations -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 org.jetbrains.kotlin.idea.inspections.AbstractApplicabilityBasedInspection import org.jetbrains.kotlin.idea.intentions.branchedTransformations.getSubjectToIntroduce import org.jetbrains.kotlin.idea.intentions.branchedTransformations.introduceSubject -import org.jetbrains.kotlin.psi.KtVisitorVoid import org.jetbrains.kotlin.psi.KtWhenExpression import org.jetbrains.kotlin.psi.psiUtil.getParentOfType -class IntroduceWhenSubjectInspection : AbstractApplicabilityBasedInspection() { - override fun buildVisitor(holder: ProblemsHolder, isOnTheFly: Boolean, session: LocalInspectionToolSession): KtVisitorVoid = - object : KtVisitorVoid() { - override fun visitWhenExpression(expression: KtWhenExpression) { - super.visitWhenExpression(expression) - visitTargetElement(expression, holder, isOnTheFly) - } - } +class IntroduceWhenSubjectInspection : AbstractApplicabilityBasedInspection(KtWhenExpression::class.java) { override fun isApplicable(element: KtWhenExpression) = element.getSubjectToIntroduce() != null diff --git a/idea/src/org/jetbrains/kotlin/idea/inspections/conventionNameCalls/ReplaceCallWithBinaryOperatorInspection.kt b/idea/src/org/jetbrains/kotlin/idea/inspections/conventionNameCalls/ReplaceCallWithBinaryOperatorInspection.kt index c4faee8cde4..b91f43f9cf6 100644 --- a/idea/src/org/jetbrains/kotlin/idea/inspections/conventionNameCalls/ReplaceCallWithBinaryOperatorInspection.kt +++ b/idea/src/org/jetbrains/kotlin/idea/inspections/conventionNameCalls/ReplaceCallWithBinaryOperatorInspection.kt @@ -16,9 +16,7 @@ package org.jetbrains.kotlin.idea.inspections.conventionNameCalls -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.PsiElement @@ -39,14 +37,9 @@ import org.jetbrains.kotlin.resolve.lazy.BodyResolveMode import org.jetbrains.kotlin.types.expressions.OperatorConventions import org.jetbrains.kotlin.util.OperatorNameConventions -class ReplaceCallWithBinaryOperatorInspection : AbstractApplicabilityBasedInspection() { - override fun buildVisitor(holder: ProblemsHolder, isOnTheFly: Boolean, session: LocalInspectionToolSession): KtVisitorVoid = - object : KtVisitorVoid() { - override fun visitDotQualifiedExpression(expression: KtDotQualifiedExpression) { - super.visitDotQualifiedExpression(expression) - visitTargetElement(expression, holder, isOnTheFly) - } - } +class ReplaceCallWithBinaryOperatorInspection : AbstractApplicabilityBasedInspection( + KtDotQualifiedExpression::class.java +) { private fun IElementType.inverted(): KtSingleValueToken? = when (this) { KtTokens.LT -> KtTokens.GT diff --git a/idea/src/org/jetbrains/kotlin/idea/inspections/conventionNameCalls/ReplaceGetOrSetInspection.kt b/idea/src/org/jetbrains/kotlin/idea/inspections/conventionNameCalls/ReplaceGetOrSetInspection.kt index 0bf218989c1..479aabd519e 100644 --- a/idea/src/org/jetbrains/kotlin/idea/inspections/conventionNameCalls/ReplaceGetOrSetInspection.kt +++ b/idea/src/org/jetbrains/kotlin/idea/inspections/conventionNameCalls/ReplaceGetOrSetInspection.kt @@ -16,9 +16,7 @@ package org.jetbrains.kotlin.idea.inspections.conventionNameCalls -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.PsiElement @@ -29,7 +27,10 @@ import org.jetbrains.kotlin.idea.intentions.callExpression import org.jetbrains.kotlin.idea.intentions.isReceiverExpressionWithValue import org.jetbrains.kotlin.idea.intentions.toResolvedCall import org.jetbrains.kotlin.load.java.descriptors.JavaClassDescriptor -import org.jetbrains.kotlin.psi.* +import org.jetbrains.kotlin.psi.KtArrayAccessExpression +import org.jetbrains.kotlin.psi.KtDotQualifiedExpression +import org.jetbrains.kotlin.psi.KtPsiFactory +import org.jetbrains.kotlin.psi.buildExpression import org.jetbrains.kotlin.psi.psiUtil.getChildOfType import org.jetbrains.kotlin.psi.psiUtil.startOffset import org.jetbrains.kotlin.resolve.bindingContextUtil.isUsedAsExpression @@ -39,7 +40,9 @@ import org.jetbrains.kotlin.resolve.lazy.BodyResolveMode import org.jetbrains.kotlin.util.OperatorNameConventions import org.jetbrains.kotlin.util.isValidOperator -class ReplaceGetOrSetInspection : AbstractApplicabilityBasedInspection() { +class ReplaceGetOrSetInspection : AbstractApplicabilityBasedInspection( + KtDotQualifiedExpression::class.java +) { private fun FunctionDescriptor.isExplicitOperator(): Boolean { return if (overriddenDescriptors.isEmpty()) containingDeclaration !is JavaClassDescriptor && isOperator @@ -47,14 +50,6 @@ class ReplaceGetOrSetInspection : AbstractApplicabilityBasedInspection