diff --git a/idea/src/org/jetbrains/kotlin/idea/inspections/collections/RenameUselessCallFix.kt b/idea/src/org/jetbrains/kotlin/idea/inspections/collections/RenameUselessCallFix.kt index 87d467c3f3c..1b1f4eff3fb 100644 --- a/idea/src/org/jetbrains/kotlin/idea/inspections/collections/RenameUselessCallFix.kt +++ b/idea/src/org/jetbrains/kotlin/idea/inspections/collections/RenameUselessCallFix.kt @@ -20,9 +20,8 @@ import com.intellij.codeInspection.LocalQuickFix import com.intellij.codeInspection.ProblemDescriptor import com.intellij.openapi.project.Project import org.jetbrains.kotlin.idea.core.replaced -import org.jetbrains.kotlin.psi.KtCallExpression -import org.jetbrains.kotlin.psi.KtPsiFactory -import org.jetbrains.kotlin.psi.KtQualifiedExpression +import org.jetbrains.kotlin.psi.* +import org.jetbrains.kotlin.psi.psiUtil.forEachDescendantOfType class RenameUselessCallFix(val newName: String) : LocalQuickFix { override fun getName() = "Change call to '$newName'" @@ -35,6 +34,24 @@ class RenameUselessCallFix(val newName: String) : LocalQuickFix { val selectorCallExpression = it.selectorExpression as? KtCallExpression val calleeExpression = selectorCallExpression?.calleeExpression ?: return calleeExpression.replaced(factory.createExpression(newName)) + selectorCallExpression.renameGivenReturnLabels(factory, calleeExpression.text, newName) + } + } + + private fun KtCallExpression.renameGivenReturnLabels(factory: KtPsiFactory, labelName: String, newName: String) { + val lambdaExpression = lambdaArguments.firstOrNull()?.getLambdaExpression() ?: return + val bodyExpression = lambdaExpression.bodyExpression ?: return + + bodyExpression.forEachDescendantOfType { + if (it.getLabelName() != labelName) return@forEachDescendantOfType + + it.replaced( + factory.createExpressionByPattern( + "return@$0 $1", + newName, + it.returnedExpression ?: "" + ) + ) } } } \ No newline at end of file diff --git a/idea/testData/inspectionsLocal/collections/uselessCallOnCollection/MapNotNullWithLambda2.kt b/idea/testData/inspectionsLocal/collections/uselessCallOnCollection/MapNotNullWithLambda2.kt new file mode 100644 index 00000000000..418d63154ef --- /dev/null +++ b/idea/testData/inspectionsLocal/collections/uselessCallOnCollection/MapNotNullWithLambda2.kt @@ -0,0 +1,8 @@ +// WITH_RUNTIME +// FIX: Change call to 'map' + +fun foo(c: Collection) { + c.mapNotNull { + return@mapNotNull "" + } +} \ No newline at end of file diff --git a/idea/testData/inspectionsLocal/collections/uselessCallOnCollection/MapNotNullWithLambda2.kt.after b/idea/testData/inspectionsLocal/collections/uselessCallOnCollection/MapNotNullWithLambda2.kt.after new file mode 100644 index 00000000000..03f8dbae28e --- /dev/null +++ b/idea/testData/inspectionsLocal/collections/uselessCallOnCollection/MapNotNullWithLambda2.kt.after @@ -0,0 +1,8 @@ +// WITH_RUNTIME +// FIX: Change call to 'map' + +fun foo(c: Collection) { + c.map { + return@map "" + } +} \ No newline at end of file diff --git a/idea/testData/inspectionsLocal/collections/uselessCallOnCollection/MapNotNullWithLambda3.kt b/idea/testData/inspectionsLocal/collections/uselessCallOnCollection/MapNotNullWithLambda3.kt new file mode 100644 index 00000000000..3dc2c2d1b74 --- /dev/null +++ b/idea/testData/inspectionsLocal/collections/uselessCallOnCollection/MapNotNullWithLambda3.kt @@ -0,0 +1,10 @@ +// WITH_RUNTIME +// FIX: Change call to 'map' + +fun foo(c: Collection, f: Boolean) { + c.mapNotNull { + if (f) { + return@mapNotNull + } + } +} \ No newline at end of file diff --git a/idea/testData/inspectionsLocal/collections/uselessCallOnCollection/MapNotNullWithLambda3.kt.after b/idea/testData/inspectionsLocal/collections/uselessCallOnCollection/MapNotNullWithLambda3.kt.after new file mode 100644 index 00000000000..66c83faf69f --- /dev/null +++ b/idea/testData/inspectionsLocal/collections/uselessCallOnCollection/MapNotNullWithLambda3.kt.after @@ -0,0 +1,10 @@ +// WITH_RUNTIME +// FIX: Change call to 'map' + +fun foo(c: Collection, f: Boolean) { + c.map { + if (f) { + return@map + } + } +} \ No newline at end of file diff --git a/idea/testData/inspectionsLocal/collections/uselessCallOnCollection/MapNotNullWithLambda4.kt b/idea/testData/inspectionsLocal/collections/uselessCallOnCollection/MapNotNullWithLambda4.kt new file mode 100644 index 00000000000..2ea7780c8a0 --- /dev/null +++ b/idea/testData/inspectionsLocal/collections/uselessCallOnCollection/MapNotNullWithLambda4.kt @@ -0,0 +1,8 @@ +// WITH_RUNTIME +// FIX: Change call to 'map' + +fun foo(c: Collection) { + c.mapNotNull label@{ + return@label "" + } +} \ No newline at end of file diff --git a/idea/testData/inspectionsLocal/collections/uselessCallOnCollection/MapNotNullWithLambda4.kt.after b/idea/testData/inspectionsLocal/collections/uselessCallOnCollection/MapNotNullWithLambda4.kt.after new file mode 100644 index 00000000000..85692a74c24 --- /dev/null +++ b/idea/testData/inspectionsLocal/collections/uselessCallOnCollection/MapNotNullWithLambda4.kt.after @@ -0,0 +1,8 @@ +// WITH_RUNTIME +// FIX: Change call to 'map' + +fun foo(c: Collection) { + c.map label@{ + return@label "" + } +} \ 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 a78aad621af..300f4949a9d 100644 --- a/idea/tests/org/jetbrains/kotlin/idea/inspections/LocalInspectionTestGenerated.java +++ b/idea/tests/org/jetbrains/kotlin/idea/inspections/LocalInspectionTestGenerated.java @@ -1294,6 +1294,21 @@ public class LocalInspectionTestGenerated extends AbstractLocalInspectionTest { runTest("idea/testData/inspectionsLocal/collections/uselessCallOnCollection/MapNotNullWithLambda.kt"); } + @TestMetadata("MapNotNullWithLambda2.kt") + public void testMapNotNullWithLambda2() throws Exception { + runTest("idea/testData/inspectionsLocal/collections/uselessCallOnCollection/MapNotNullWithLambda2.kt"); + } + + @TestMetadata("MapNotNullWithLambda3.kt") + public void testMapNotNullWithLambda3() throws Exception { + runTest("idea/testData/inspectionsLocal/collections/uselessCallOnCollection/MapNotNullWithLambda3.kt"); + } + + @TestMetadata("MapNotNullWithLambda4.kt") + public void testMapNotNullWithLambda4() throws Exception { + runTest("idea/testData/inspectionsLocal/collections/uselessCallOnCollection/MapNotNullWithLambda4.kt"); + } + @TestMetadata("MapNotNullWithLambdaFake.kt") public void testMapNotNullWithLambdaFake() throws Exception { runTest("idea/testData/inspectionsLocal/collections/uselessCallOnCollection/MapNotNullWithLambdaFake.kt");