From f22133be7ec0fdd52a967947fb2caf2b4c470f1d Mon Sep 17 00:00:00 2001 From: Toshiaki Kameyama Date: Tue, 9 Oct 2018 05:46:52 +0300 Subject: [PATCH] Call chain into sequence refactoring: introduce & use isIterable Related to KT-26650 --- .../ConvertCallChainIntoSequenceInspection.kt | 6 +----- .../kotlin/idea/inspections/collections/FunctionUtils.kt | 9 +++++++++ 2 files changed, 10 insertions(+), 5 deletions(-) diff --git a/idea/src/org/jetbrains/kotlin/idea/inspections/collections/ConvertCallChainIntoSequenceInspection.kt b/idea/src/org/jetbrains/kotlin/idea/inspections/collections/ConvertCallChainIntoSequenceInspection.kt index e240d618633..a6b45cf906a 100644 --- a/idea/src/org/jetbrains/kotlin/idea/inspections/collections/ConvertCallChainIntoSequenceInspection.kt +++ b/idea/src/org/jetbrains/kotlin/idea/inspections/collections/ConvertCallChainIntoSequenceInspection.kt @@ -16,7 +16,6 @@ import com.intellij.openapi.ui.LabeledComponent import com.intellij.psi.PsiWhiteSpace import com.intellij.ui.EditorTextField import org.jetbrains.kotlin.builtins.DefaultBuiltIns -import org.jetbrains.kotlin.descriptors.ClassDescriptor import org.jetbrains.kotlin.idea.caches.resolve.analyze import org.jetbrains.kotlin.idea.core.replaced import org.jetbrains.kotlin.idea.inspections.AbstractKotlinInspection @@ -28,11 +27,8 @@ import org.jetbrains.kotlin.psi.psiUtil.* import org.jetbrains.kotlin.resolve.BindingContext import org.jetbrains.kotlin.resolve.calls.callUtil.getResolvedCall import org.jetbrains.kotlin.resolve.calls.resolvedCallUtil.getImplicitReceiverValue -import org.jetbrains.kotlin.resolve.descriptorUtil.fqNameSafe -import org.jetbrains.kotlin.resolve.descriptorUtil.isSubclassOf import org.jetbrains.kotlin.resolve.lazy.BodyResolveMode import org.jetbrains.kotlin.resolve.scopes.receivers.ImplicitReceiver -import org.jetbrains.kotlin.types.KotlinType import java.awt.BorderLayout import javax.swing.JPanel @@ -154,7 +150,7 @@ private fun KtQualifiedExpression.findCallChain(): CallChain? { val receiverType = (lastCall.getQualifiedExpressionForSelector())?.receiverExpression?.getResolvedCall(context)?.resultingDescriptor?.returnType ?: lastCall.implicitReceiver(context)?.type - if (receiverType?.isMap(DefaultBuiltIns.Instance) == true) return null + if (receiverType?.isIterable(DefaultBuiltIns.Instance) != true) return null val firstCall = calls.first() val qualified = firstCall.getQualifiedExpressionForSelector() ?: firstCall.getQualifiedExpressionForReceiver() ?: return null diff --git a/idea/src/org/jetbrains/kotlin/idea/inspections/collections/FunctionUtils.kt b/idea/src/org/jetbrains/kotlin/idea/inspections/collections/FunctionUtils.kt index 441a0112ead..d35dec1e307 100644 --- a/idea/src/org/jetbrains/kotlin/idea/inspections/collections/FunctionUtils.kt +++ b/idea/src/org/jetbrains/kotlin/idea/inspections/collections/FunctionUtils.kt @@ -39,6 +39,15 @@ fun KotlinType?.isMap(builtIns: KotlinBuiltIns): Boolean { return classDescriptor.name.asString().endsWith("Map") && classDescriptor.isSubclassOf(builtIns.map) } +fun KotlinType?.isIterable(builtIns: KotlinBuiltIns): Boolean { + val classDescriptor = this?.constructor?.declarationDescriptor as? ClassDescriptor ?: return false + val className = classDescriptor.name.asString() + // First two lines are just to make things faster + return className.endsWith("List") && classDescriptor.isSubclassOf(builtIns.list) + || className.endsWith("Set") && classDescriptor.isSubclassOf(builtIns.set) + || classDescriptor.isSubclassOf(builtIns.iterable) +} + fun KtCallExpression.isCalling(fqName: FqName, context: BindingContext = analyze(BodyResolveMode.PARTIAL)): Boolean { val function = fqName.asString().takeLastWhile { it != '.' } if (calleeExpression?.text != function) return false