Redundant 'asSequence' call: don't report when reciever type is Map
#KT-41338 Fixed
This commit is contained in:
committed by
Vladimir Dolzhenko
parent
78493395c3
commit
3f7aab6fae
+4
@@ -9,6 +9,7 @@ import com.intellij.codeInspection.LocalQuickFix
|
|||||||
import com.intellij.codeInspection.ProblemDescriptor
|
import com.intellij.codeInspection.ProblemDescriptor
|
||||||
import com.intellij.codeInspection.ProblemsHolder
|
import com.intellij.codeInspection.ProblemsHolder
|
||||||
import com.intellij.openapi.project.Project
|
import com.intellij.openapi.project.Project
|
||||||
|
import org.jetbrains.kotlin.builtins.DefaultBuiltIns
|
||||||
import org.jetbrains.kotlin.idea.KotlinBundle
|
import org.jetbrains.kotlin.idea.KotlinBundle
|
||||||
import org.jetbrains.kotlin.idea.caches.resolve.analyze
|
import org.jetbrains.kotlin.idea.caches.resolve.analyze
|
||||||
import org.jetbrains.kotlin.idea.core.replaced
|
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.psi.psiUtil.getQualifiedExpressionForReceiver
|
||||||
import org.jetbrains.kotlin.resolve.BindingContext
|
import org.jetbrains.kotlin.resolve.BindingContext
|
||||||
import org.jetbrains.kotlin.resolve.calls.callUtil.getResolvedCall
|
import org.jetbrains.kotlin.resolve.calls.callUtil.getResolvedCall
|
||||||
|
import org.jetbrains.kotlin.resolve.calls.callUtil.getType
|
||||||
import org.jetbrains.kotlin.resolve.lazy.BodyResolveMode
|
import org.jetbrains.kotlin.resolve.lazy.BodyResolveMode
|
||||||
|
|
||||||
class RedundantAsSequenceInspection : AbstractKotlinInspection() {
|
class RedundantAsSequenceInspection : AbstractKotlinInspection() {
|
||||||
@@ -36,6 +38,8 @@ class RedundantAsSequenceInspection : AbstractKotlinInspection() {
|
|||||||
val parentCall = qualified.getQualifiedExpressionForReceiver()?.callExpression ?: return
|
val parentCall = qualified.getQualifiedExpressionForReceiver()?.callExpression ?: return
|
||||||
|
|
||||||
val context = qualified.analyze(BodyResolveMode.PARTIAL)
|
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 (call.getResolvedCall(context)?.isCalling(asSequenceFqName) != true) return
|
||||||
if (!parentCall.isTermination(context)) 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()
|
||||||
|
}
|
||||||
+5
@@ -1626,6 +1626,11 @@ public class LocalInspectionTestGenerated extends AbstractLocalInspectionTest {
|
|||||||
runTest("idea/testData/inspectionsLocal/collections/redundantAsSequence/hasLineBreak.kt");
|
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")
|
@TestMetadata("notTermination.kt")
|
||||||
public void testNotTermination() throws Exception {
|
public void testNotTermination() throws Exception {
|
||||||
runTest("idea/testData/inspectionsLocal/collections/redundantAsSequence/notTermination.kt");
|
runTest("idea/testData/inspectionsLocal/collections/redundantAsSequence/notTermination.kt");
|
||||||
|
|||||||
Reference in New Issue
Block a user