Redundant 'asSequence' call: don't report when reciever type is Map

#KT-41338 Fixed
This commit is contained in:
Toshiaki Kameyama
2020-08-26 20:13:01 +09:00
committed by Vladimir Dolzhenko
parent 78493395c3
commit 3f7aab6fae
3 changed files with 14 additions and 0 deletions
@@ -9,6 +9,7 @@ import com.intellij.codeInspection.LocalQuickFix
import com.intellij.codeInspection.ProblemDescriptor
import com.intellij.codeInspection.ProblemsHolder
import com.intellij.openapi.project.Project
import org.jetbrains.kotlin.builtins.DefaultBuiltIns
import org.jetbrains.kotlin.idea.KotlinBundle
import org.jetbrains.kotlin.idea.caches.resolve.analyze
import org.jetbrains.kotlin.idea.core.replaced
@@ -21,6 +22,7 @@ import org.jetbrains.kotlin.psi.*
import org.jetbrains.kotlin.psi.psiUtil.getQualifiedExpressionForReceiver
import org.jetbrains.kotlin.resolve.BindingContext
import org.jetbrains.kotlin.resolve.calls.callUtil.getResolvedCall
import org.jetbrains.kotlin.resolve.calls.callUtil.getType
import org.jetbrains.kotlin.resolve.lazy.BodyResolveMode
class RedundantAsSequenceInspection : AbstractKotlinInspection() {
@@ -36,6 +38,8 @@ class RedundantAsSequenceInspection : AbstractKotlinInspection() {
val parentCall = qualified.getQualifiedExpressionForReceiver()?.callExpression ?: return
val context = qualified.analyze(BodyResolveMode.PARTIAL)
val receiverType = qualified.receiverExpression.getType(context) ?: return
if (!receiverType.isIterable(DefaultBuiltIns.Instance)) return
if (call.getResolvedCall(context)?.isCalling(asSequenceFqName) != true) return
if (!parentCall.isTermination(context)) return
@@ -0,0 +1,5 @@
// PROBLEM: none
// WITH_RUNTIME
fun test(map: Map<String, Int>): Map.Entry<String, Int>? {
return map.<caret>asSequence().firstOrNull()
}
@@ -1626,6 +1626,11 @@ public class LocalInspectionTestGenerated extends AbstractLocalInspectionTest {
runTest("idea/testData/inspectionsLocal/collections/redundantAsSequence/hasLineBreak.kt");
}
@TestMetadata("map.kt")
public void testMap() throws Exception {
runTest("idea/testData/inspectionsLocal/collections/redundantAsSequence/map.kt");
}
@TestMetadata("notTermination.kt")
public void testNotTermination() throws Exception {
runTest("idea/testData/inspectionsLocal/collections/redundantAsSequence/notTermination.kt");