From 3f7aab6fae0f69d7b350ab072b89efd562d8d036 Mon Sep 17 00:00:00 2001 From: Toshiaki Kameyama Date: Wed, 26 Aug 2020 20:13:01 +0900 Subject: [PATCH] Redundant 'asSequence' call: don't report when reciever type is Map #KT-41338 Fixed --- .../inspections/collections/RedundantAsSequenceInspection.kt | 4 ++++ .../inspectionsLocal/collections/redundantAsSequence/map.kt | 5 +++++ .../idea/inspections/LocalInspectionTestGenerated.java | 5 +++++ 3 files changed, 14 insertions(+) create mode 100644 idea/testData/inspectionsLocal/collections/redundantAsSequence/map.kt diff --git a/idea/src/org/jetbrains/kotlin/idea/inspections/collections/RedundantAsSequenceInspection.kt b/idea/src/org/jetbrains/kotlin/idea/inspections/collections/RedundantAsSequenceInspection.kt index 8ded0684c11..de5fc1332e3 100644 --- a/idea/src/org/jetbrains/kotlin/idea/inspections/collections/RedundantAsSequenceInspection.kt +++ b/idea/src/org/jetbrains/kotlin/idea/inspections/collections/RedundantAsSequenceInspection.kt @@ -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 diff --git a/idea/testData/inspectionsLocal/collections/redundantAsSequence/map.kt b/idea/testData/inspectionsLocal/collections/redundantAsSequence/map.kt new file mode 100644 index 00000000000..0764327c04b --- /dev/null +++ b/idea/testData/inspectionsLocal/collections/redundantAsSequence/map.kt @@ -0,0 +1,5 @@ +// PROBLEM: none +// WITH_RUNTIME +fun test(map: Map): Map.Entry? { + return map.asSequence().firstOrNull() +} \ No newline at end of file diff --git a/idea/tests/org/jetbrains/kotlin/idea/inspections/LocalInspectionTestGenerated.java b/idea/tests/org/jetbrains/kotlin/idea/inspections/LocalInspectionTestGenerated.java index 1b12bc20d83..dea52d2fb57 100644 --- a/idea/tests/org/jetbrains/kotlin/idea/inspections/LocalInspectionTestGenerated.java +++ b/idea/tests/org/jetbrains/kotlin/idea/inspections/LocalInspectionTestGenerated.java @@ -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");