From 825d1d8b3529c9c2e67bb273b8cb1edc727bad00 Mon Sep 17 00:00:00 2001 From: Toshiaki Kameyama Date: Thu, 8 Nov 2018 16:20:23 +0900 Subject: [PATCH] Extract 'isToString()' function to Utils --- ...emoveToStringInStringTemplateInspection.kt | 36 ++++++++----------- ...aceToStringWithStringTemplateInspection.kt | 19 +++------- .../jetbrains/kotlin/idea/intentions/Utils.kt | 13 +++++-- 3 files changed, 29 insertions(+), 39 deletions(-) diff --git a/idea/src/org/jetbrains/kotlin/idea/inspections/RemoveToStringInStringTemplateInspection.kt b/idea/src/org/jetbrains/kotlin/idea/inspections/RemoveToStringInStringTemplateInspection.kt index 2f933675974..e3a03fdc2cf 100644 --- a/idea/src/org/jetbrains/kotlin/idea/inspections/RemoveToStringInStringTemplateInspection.kt +++ b/idea/src/org/jetbrains/kotlin/idea/inspections/RemoveToStringInStringTemplateInspection.kt @@ -8,36 +8,28 @@ package org.jetbrains.kotlin.idea.inspections import com.intellij.codeInsight.FileModificationService import com.intellij.codeInspection.* import com.intellij.openapi.project.Project -import org.jetbrains.kotlin.descriptors.CallableMemberDescriptor -import org.jetbrains.kotlin.idea.core.getDeepestSuperDeclarations -import org.jetbrains.kotlin.idea.intentions.toResolvedCall +import org.jetbrains.kotlin.idea.intentions.isToString import org.jetbrains.kotlin.psi.* import org.jetbrains.kotlin.psi.psiUtil.canPlaceAfterSimpleNameEntry -import org.jetbrains.kotlin.resolve.descriptorUtil.fqNameUnsafe -import org.jetbrains.kotlin.resolve.lazy.BodyResolveMode class RemoveToStringInStringTemplateInspection : AbstractKotlinInspection(), CleanupLocalInspectionTool { override fun buildVisitor(holder: ProblemsHolder, isOnTheFly: Boolean, session: LocalInspectionToolSession) = - dotQualifiedExpressionVisitor(fun(expression) { - if (expression.parent !is KtBlockStringTemplateEntry) return - if (expression.receiverExpression is KtSuperExpression) return - val selectorExpression = expression.selectorExpression ?: return - if (!expression.isToString()) return + dotQualifiedExpressionVisitor(fun(expression) { + if (expression.parent !is KtBlockStringTemplateEntry) return + if (expression.receiverExpression is KtSuperExpression) return + val selectorExpression = expression.selectorExpression ?: return + if (!expression.isToString()) return - holder.registerProblem(selectorExpression, - "Redundant 'toString()' call in string template", - ProblemHighlightType.LIKE_UNUSED_SYMBOL, - RemoveToStringFix()) - }) + holder.registerProblem( + selectorExpression, + "Redundant 'toString()' call in string template", + ProblemHighlightType.LIKE_UNUSED_SYMBOL, + RemoveToStringFix() + ) + }) } -private fun KtDotQualifiedExpression.isToString(): Boolean { - val resolvedCall = toResolvedCall(BodyResolveMode.PARTIAL) ?: return false - val callableDescriptor = resolvedCall.resultingDescriptor as? CallableMemberDescriptor ?: return false - return callableDescriptor.getDeepestSuperDeclarations().any { it.fqNameUnsafe.asString() == "kotlin.Any.toString" } -} - -class RemoveToStringFix: LocalQuickFix { +class RemoveToStringFix : LocalQuickFix { override fun getName() = "Remove 'toString()' call" override fun getFamilyName() = name diff --git a/idea/src/org/jetbrains/kotlin/idea/inspections/ReplaceToStringWithStringTemplateInspection.kt b/idea/src/org/jetbrains/kotlin/idea/inspections/ReplaceToStringWithStringTemplateInspection.kt index 89e4ae6980d..d583c8e49e6 100644 --- a/idea/src/org/jetbrains/kotlin/idea/inspections/ReplaceToStringWithStringTemplateInspection.kt +++ b/idea/src/org/jetbrains/kotlin/idea/inspections/ReplaceToStringWithStringTemplateInspection.kt @@ -8,14 +8,12 @@ package org.jetbrains.kotlin.idea.inspections import com.intellij.openapi.editor.Editor import com.intellij.openapi.project.Project import com.intellij.psi.PsiElement -import org.jetbrains.kotlin.descriptors.CallableMemberDescriptor +import org.jetbrains.kotlin.idea.intentions.isToString +import org.jetbrains.kotlin.psi.KtBlockStringTemplateEntry import org.jetbrains.kotlin.psi.KtDotQualifiedExpression -import org.jetbrains.kotlin.idea.core.getDeepestSuperDeclarations -import org.jetbrains.kotlin.idea.intentions.toResolvedCall -import org.jetbrains.kotlin.psi.* +import org.jetbrains.kotlin.psi.KtPsiFactory +import org.jetbrains.kotlin.psi.KtReferenceExpression import org.jetbrains.kotlin.psi.psiUtil.getParentOfType -import org.jetbrains.kotlin.resolve.descriptorUtil.fqNameUnsafe -import org.jetbrains.kotlin.resolve.lazy.BodyResolveMode class ReplaceToStringWithStringTemplateInspection : AbstractApplicabilityBasedInspection( KtDotQualifiedExpression::class.java @@ -37,13 +35,4 @@ class ReplaceToStringWithStringTemplateInspection : AbstractApplicabilityBasedIn override fun inspectionTarget(element: KtDotQualifiedExpression) = element override val defaultFixText = "Replace 'toString' with string template" - - private fun KtDotQualifiedExpression.isToString(): Boolean { - val callExpression = selectorExpression as? KtCallExpression ?: return false - val referenceExpression = callExpression.calleeExpression as? KtNameReferenceExpression ?: return false - if (referenceExpression.getReferencedName() != "toString") return false - val resolvedCall = toResolvedCall(BodyResolveMode.PARTIAL) ?: return false - val callableDescriptor = resolvedCall.resultingDescriptor as? CallableMemberDescriptor ?: return false - return callableDescriptor.getDeepestSuperDeclarations().any { it.fqNameUnsafe.asString() == "kotlin.Any.toString" } - } } \ No newline at end of file diff --git a/idea/src/org/jetbrains/kotlin/idea/intentions/Utils.kt b/idea/src/org/jetbrains/kotlin/idea/intentions/Utils.kt index 6cbdd770205..8a02ca94751 100644 --- a/idea/src/org/jetbrains/kotlin/idea/intentions/Utils.kt +++ b/idea/src/org/jetbrains/kotlin/idea/intentions/Utils.kt @@ -22,6 +22,7 @@ import org.jetbrains.kotlin.builtins.KotlinBuiltIns import org.jetbrains.kotlin.descriptors.* import org.jetbrains.kotlin.idea.caches.resolve.analyze import org.jetbrains.kotlin.idea.caches.resolve.resolveToCall +import org.jetbrains.kotlin.idea.core.getDeepestSuperDeclarations import org.jetbrains.kotlin.idea.core.replaced import org.jetbrains.kotlin.idea.core.setType import org.jetbrains.kotlin.idea.references.mainReference @@ -41,7 +42,6 @@ import org.jetbrains.kotlin.resolve.source.getPsi import org.jetbrains.kotlin.types.KotlinType import org.jetbrains.kotlin.types.isFlexible import org.jetbrains.kotlin.types.typeUtil.isUnit -import java.lang.IllegalArgumentException fun KtContainerNode.description(): String? { when (node.elementType) { @@ -320,4 +320,13 @@ fun KtDeclaration.isFinalizeMethod(descriptor: DeclarationDescriptor? = null): B return function.name == "finalize" && function.valueParameters.isEmpty() && ((descriptor ?: function.descriptor) as? FunctionDescriptor)?.returnType?.isUnit() == true -} \ No newline at end of file +} + +fun KtDotQualifiedExpression.isToString(): Boolean { + val callExpression = selectorExpression as? KtCallExpression ?: return false + val referenceExpression = callExpression.calleeExpression as? KtNameReferenceExpression ?: return false + if (referenceExpression.getReferencedName() != "toString") return false + val resolvedCall = toResolvedCall(BodyResolveMode.PARTIAL) ?: return false + val callableDescriptor = resolvedCall.resultingDescriptor as? CallableMemberDescriptor ?: return false + return callableDescriptor.getDeepestSuperDeclarations().any { it.fqNameUnsafe.asString() == "kotlin.Any.toString" } +}