From 0b57d8eb4930d7112fff5cf53d2ee6a32a5cdba6 Mon Sep 17 00:00:00 2001 From: shiraji Date: Fri, 28 Oct 2016 00:33:16 +0900 Subject: [PATCH] Do not use "Remove redundant '.let' call" when receiver is used #KT-14390 Fixed --- .../ReplaceSingleLineLetIntention.kt | 17 ++++++++--- .../multipleReceiver.kt | 6 ++++ .../multipleReceiver2.kt | 6 ++++ .../multipleReceiver3.kt | 6 ++++ .../receiverWithLambda.kt | 6 ++++ .../receiverWithLambda2.kt | 9 ++++++ .../intentions/IntentionTestGenerated.java | 30 +++++++++++++++++++ 7 files changed, 76 insertions(+), 4 deletions(-) create mode 100644 idea/testData/intentions/replaceSingleLineLetIntention/multipleReceiver.kt create mode 100644 idea/testData/intentions/replaceSingleLineLetIntention/multipleReceiver2.kt create mode 100644 idea/testData/intentions/replaceSingleLineLetIntention/multipleReceiver3.kt create mode 100644 idea/testData/intentions/replaceSingleLineLetIntention/receiverWithLambda.kt create mode 100644 idea/testData/intentions/replaceSingleLineLetIntention/receiverWithLambda2.kt diff --git a/idea/src/org/jetbrains/kotlin/idea/intentions/ReplaceSingleLineLetIntention.kt b/idea/src/org/jetbrains/kotlin/idea/intentions/ReplaceSingleLineLetIntention.kt index 9234f07e092..8bba28a66f6 100644 --- a/idea/src/org/jetbrains/kotlin/idea/intentions/ReplaceSingleLineLetIntention.kt +++ b/idea/src/org/jetbrains/kotlin/idea/intentions/ReplaceSingleLineLetIntention.kt @@ -17,12 +17,10 @@ package org.jetbrains.kotlin.idea.intentions import com.intellij.openapi.editor.Editor -import org.jetbrains.kotlin.idea.caches.resolve.analyze import org.jetbrains.kotlin.idea.inspections.IntentionBasedInspection import org.jetbrains.kotlin.lexer.KtTokens import org.jetbrains.kotlin.psi.* -import org.jetbrains.kotlin.resolve.calls.callUtil.getResolvedCall -import org.jetbrains.kotlin.resolve.descriptorUtil.fqNameUnsafe +import org.jetbrains.kotlin.psi.psiUtil.anyDescendantOfType class ReplaceSingleLineLetInspection : IntentionBasedInspection(ReplaceSingleLineLetIntention::class) { override fun inspectionTarget(element: KtCallExpression) = element.calleeExpression @@ -66,6 +64,9 @@ class ReplaceSingleLineLetIntention : SelfTargetingOffsetIndependentIntention()) return false + } return !dotQualifiedExpression.receiverUsedAsArgument(parameterName) } @@ -79,7 +80,15 @@ class ReplaceSingleLineLetIntention : SelfTargetingOffsetIndependentIntention { + it.getLeftMostReceiverExpression().text == receiverName || + it.receiverUsedAsArgument(receiverName) + } } \ No newline at end of file diff --git a/idea/testData/intentions/replaceSingleLineLetIntention/multipleReceiver.kt b/idea/testData/intentions/replaceSingleLineLetIntention/multipleReceiver.kt new file mode 100644 index 00000000000..0dcf2055ab7 --- /dev/null +++ b/idea/testData/intentions/replaceSingleLineLetIntention/multipleReceiver.kt @@ -0,0 +1,6 @@ +// WITH_RUNTIME +// IS_APPLICABLE: false + +fun baz(foo: String) { + foo.let { it.substringAfterLast(it.capitalize()) } +} diff --git a/idea/testData/intentions/replaceSingleLineLetIntention/multipleReceiver2.kt b/idea/testData/intentions/replaceSingleLineLetIntention/multipleReceiver2.kt new file mode 100644 index 00000000000..7ad515f49e7 --- /dev/null +++ b/idea/testData/intentions/replaceSingleLineLetIntention/multipleReceiver2.kt @@ -0,0 +1,6 @@ +// WITH_RUNTIME +// IS_APPLICABLE: false + +fun baz(foo: String) { + foo.let { it.substringAfterLast("".equals(it).toString()) } +} diff --git a/idea/testData/intentions/replaceSingleLineLetIntention/multipleReceiver3.kt b/idea/testData/intentions/replaceSingleLineLetIntention/multipleReceiver3.kt new file mode 100644 index 00000000000..0d87447d99e --- /dev/null +++ b/idea/testData/intentions/replaceSingleLineLetIntention/multipleReceiver3.kt @@ -0,0 +1,6 @@ +// WITH_RUNTIME +// IS_APPLICABLE: false + +fun baz(foo: String) { + foo.let { it.substring(0, it.length) } +} diff --git a/idea/testData/intentions/replaceSingleLineLetIntention/receiverWithLambda.kt b/idea/testData/intentions/replaceSingleLineLetIntention/receiverWithLambda.kt new file mode 100644 index 00000000000..d483a3f7c3e --- /dev/null +++ b/idea/testData/intentions/replaceSingleLineLetIntention/receiverWithLambda.kt @@ -0,0 +1,6 @@ +// WITH_RUNTIME +// IS_APPLICABLE: false + +fun baz(foo: String) { + foo.let { it.indexOfLast { c -> c == it[0] } } +} \ No newline at end of file diff --git a/idea/testData/intentions/replaceSingleLineLetIntention/receiverWithLambda2.kt b/idea/testData/intentions/replaceSingleLineLetIntention/receiverWithLambda2.kt new file mode 100644 index 00000000000..6416ef63873 --- /dev/null +++ b/idea/testData/intentions/replaceSingleLineLetIntention/receiverWithLambda2.kt @@ -0,0 +1,9 @@ +// WITH_RUNTIME +// IS_APPLICABLE: false +// This should be reported. However, in order to avoid too complecate logic, the intention ignore this case. + +import java.util.* + +fun baz2(foo: List) { + foo.let { it.binarySearch("", Comparator { o1, o2 -> 0 }) } +} \ 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 9e4b9386034..04cc4284843 100644 --- a/idea/tests/org/jetbrains/kotlin/idea/intentions/IntentionTestGenerated.java +++ b/idea/tests/org/jetbrains/kotlin/idea/intentions/IntentionTestGenerated.java @@ -11768,6 +11768,36 @@ public class IntentionTestGenerated extends AbstractIntentionTest { doTest(fileName); } + @TestMetadata("multipleReceiver.kt") + public void testMultipleReceiver() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("idea/testData/intentions/replaceSingleLineLetIntention/multipleReceiver.kt"); + doTest(fileName); + } + + @TestMetadata("multipleReceiver2.kt") + public void testMultipleReceiver2() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("idea/testData/intentions/replaceSingleLineLetIntention/multipleReceiver2.kt"); + doTest(fileName); + } + + @TestMetadata("multipleReceiver3.kt") + public void testMultipleReceiver3() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("idea/testData/intentions/replaceSingleLineLetIntention/multipleReceiver3.kt"); + doTest(fileName); + } + + @TestMetadata("receiverWithLambda.kt") + public void testReceiverWithLambda() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("idea/testData/intentions/replaceSingleLineLetIntention/receiverWithLambda.kt"); + doTest(fileName); + } + + @TestMetadata("receiverWithLambda2.kt") + public void testReceiverWithLambda2() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("idea/testData/intentions/replaceSingleLineLetIntention/receiverWithLambda2.kt"); + doTest(fileName); + } + @TestMetadata("sameLets.kt") public void testSameLets() throws Exception { String fileName = KotlinTestUtils.navigationMetadata("idea/testData/intentions/replaceSingleLineLetIntention/sameLets.kt");