Recognize CharSequence and Arrays as iterable too

This commit is contained in:
Vitaliy.Bibaev
2017-11-22 14:24:58 +03:00
committed by Yan Zhulanow
parent 338e06ff21
commit c5ede40262
@@ -5,6 +5,8 @@ import com.intellij.debugger.streams.kotlin.psi.KotlinPsiUtil
import com.intellij.debugger.streams.kotlin.psi.previousCall import com.intellij.debugger.streams.kotlin.psi.previousCall
import com.intellij.debugger.streams.kotlin.psi.receiverType import com.intellij.debugger.streams.kotlin.psi.receiverType
import org.jetbrains.kotlin.psi.KtCallExpression import org.jetbrains.kotlin.psi.KtCallExpression
import org.jetbrains.kotlin.types.KotlinType
import org.jetbrains.kotlin.types.typeUtil.supertypes
/** /**
* @author Vitaliy.Bibaev * @author Vitaliy.Bibaev
@@ -13,12 +15,15 @@ class KotlinCollectionChainBuilder
: KotlinChainBuilderBase(KotlinChainTransformerImpl(KotlinCollectionsTypeExtractor())) { : KotlinChainBuilderBase(KotlinChainTransformerImpl(KotlinCollectionsTypeExtractor())) {
private companion object { private companion object {
// TODO: Avoid enumeration of all available types // TODO: Avoid enumeration of all available types
val SUPPORTED_RECEIVERS = setOf("kotlin.collections.List", "kotlin.collections.Set") val SUPPORTED_RECEIVERS = setOf("kotlin.collections.Iterable", "kotlin.CharSequence", "kotlin.Array",
"kotlin.BooleanArray", "kotlin.ByteArray", "kotlin.ShortArray", "kotlin.CharArray", "kotlin.IntArray",
"kotlin.LongArray", "kotlin.DoubleArray", "kotlin.FloatArray")
} }
private fun isCollectionTransformationCall(expression: KtCallExpression): Boolean { private fun isCollectionTransformationCall(expression: KtCallExpression): Boolean {
val receiverType = expression.receiverType() ?: return false val receiverType = expression.receiverType() ?: return false
return SUPPORTED_RECEIVERS.contains(KotlinPsiUtil.getTypeWithoutTypeParameters(receiverType)) if (isTypeSuitable(receiverType)) return true
return receiverType.supertypes().any { isTypeSuitable(it) }
} }
override val existenceChecker: ExistenceChecker = object : ExistenceChecker() { override val existenceChecker: ExistenceChecker = object : ExistenceChecker() {
@@ -64,4 +69,7 @@ class KotlinCollectionChainBuilder
return result return result
} }
} }
private fun isTypeSuitable(type: KotlinType): Boolean =
SUPPORTED_RECEIVERS.contains(KotlinPsiUtil.getTypeWithoutTypeParameters(type))
} }