diff --git a/idea/idea-core/src/org/jetbrains/kotlin/idea/core/IterableTypesDetection.kt b/idea/idea-core/src/org/jetbrains/kotlin/idea/core/IterableTypesDetection.kt index 41eec20996d..9d6298b379f 100644 --- a/idea/idea-core/src/org/jetbrains/kotlin/idea/core/IterableTypesDetection.kt +++ b/idea/idea-core/src/org/jetbrains/kotlin/idea/core/IterableTypesDetection.kt @@ -31,6 +31,7 @@ import org.jetbrains.kotlin.types.KotlinType import org.jetbrains.kotlin.types.TypeUtils import org.jetbrains.kotlin.types.expressions.ExpressionTypingContext import org.jetbrains.kotlin.types.expressions.ForLoopConventionsChecker +import org.jetbrains.kotlin.util.isValidOperator import java.util.* public class IterableTypesDetection( @@ -49,8 +50,8 @@ public class IterableTypesDetection( private val typesWithExtensionIterator: Collection = scope .collectFunctions(iteratorName, NoLookupLocation.FROM_IDE) - .mapNotNull { it.extensionReceiverParameter } - .map { it.type } + .filter { it.isValidOperator() } + .mapNotNull { it.extensionReceiverParameter?.type } override fun isIterable(type: FuzzyType, loopVarType: KotlinType?): Boolean { val elementType = elementType(type) ?: return false diff --git a/idea/testData/intentions/iterateExpression/nonOperatorIterator.kt b/idea/testData/intentions/iterateExpression/nonOperatorIterator.kt new file mode 100644 index 00000000000..1fa803d72c3 --- /dev/null +++ b/idea/testData/intentions/iterateExpression/nonOperatorIterator.kt @@ -0,0 +1,9 @@ +// WITH_RUNTIME +// IS_APPLICABLE: false +class T { + fun T.iterator(): Iterator = listOf().iterator() +} + +fun test() { + T() +} \ No newline at end of file diff --git a/idea/testData/intentions/iterateExpression/nonOperatotExtensionIterator.kt b/idea/testData/intentions/iterateExpression/nonOperatotExtensionIterator.kt new file mode 100644 index 00000000000..7bbe69301ae --- /dev/null +++ b/idea/testData/intentions/iterateExpression/nonOperatotExtensionIterator.kt @@ -0,0 +1,9 @@ +// WITH_RUNTIME +// IS_APPLICABLE: false +class T + +fun T.iterator(): Iterator = listOf().iterator() + +fun test() { + T() +} \ No newline at end of file diff --git a/idea/tests/org/jetbrains/kotlin/idea/intentions/IntentionTestGenerated.java b/idea/tests/org/jetbrains/kotlin/idea/intentions/IntentionTestGenerated.java index c682aebaa06..ba75bec9888 100644 --- a/idea/tests/org/jetbrains/kotlin/idea/intentions/IntentionTestGenerated.java +++ b/idea/tests/org/jetbrains/kotlin/idea/intentions/IntentionTestGenerated.java @@ -5859,6 +5859,18 @@ public class IntentionTestGenerated extends AbstractIntentionTest { doTest(fileName); } + @TestMetadata("nonOperatorIterator.kt") + public void testNonOperatorIterator() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("idea/testData/intentions/iterateExpression/nonOperatorIterator.kt"); + doTest(fileName); + } + + @TestMetadata("nonOperatotExtensionIterator.kt") + public void testNonOperatotExtensionIterator() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("idea/testData/intentions/iterateExpression/nonOperatotExtensionIterator.kt"); + doTest(fileName); + } + @TestMetadata("simple.kt") public void testSimple() throws Exception { String fileName = KotlinTestUtils.navigationMetadata("idea/testData/intentions/iterateExpression/simple.kt");