From b7c4248524f7f395ac0c5b205a05bac54cce5117 Mon Sep 17 00:00:00 2001 From: Toshiaki Kameyama Date: Wed, 29 Aug 2018 10:59:53 +0900 Subject: [PATCH] "Nested lambda has shadowed implicit parameter": add quickfix to rename shadowing 'it' --- ...mbdaShadowedImplicitParameterInspection.kt | 28 +++++++++++++------ .../implicit.kt | 2 ++ .../implicit.kt.after | 2 ++ .../implicit2.kt | 2 ++ .../implicit2.kt.after | 2 ++ .../implicit3.kt | 12 ++++++++ .../implicit3.kt.after | 12 ++++++++ .../implicitGrandParent.kt | 2 ++ .../implicitGrandParent.kt.after | 2 ++ .../LocalInspectionTestGenerated.java | 5 ++++ 10 files changed, 61 insertions(+), 8 deletions(-) create mode 100644 idea/testData/inspectionsLocal/nestedLambdaShadowedImplicitParameter/implicit3.kt create mode 100644 idea/testData/inspectionsLocal/nestedLambdaShadowedImplicitParameter/implicit3.kt.after diff --git a/idea/src/org/jetbrains/kotlin/idea/inspections/NestedLambdaShadowedImplicitParameterInspection.kt b/idea/src/org/jetbrains/kotlin/idea/inspections/NestedLambdaShadowedImplicitParameterInspection.kt index df657d882de..7528e17e2b5 100644 --- a/idea/src/org/jetbrains/kotlin/idea/inspections/NestedLambdaShadowedImplicitParameterInspection.kt +++ b/idea/src/org/jetbrains/kotlin/idea/inspections/NestedLambdaShadowedImplicitParameterInspection.kt @@ -13,6 +13,7 @@ import com.intellij.openapi.project.Project import com.intellij.psi.PsiDocumentManager import com.intellij.psi.PsiElementVisitor import org.jetbrains.kotlin.idea.caches.resolve.analyze +import org.jetbrains.kotlin.idea.intentions.ReplaceItWithExplicitFunctionLiteralParamIntention import org.jetbrains.kotlin.idea.refactoring.rename.KotlinVariableInplaceRenameHandler import org.jetbrains.kotlin.psi.* import org.jetbrains.kotlin.psi.psiUtil.* @@ -35,12 +36,13 @@ class NestedLambdaShadowedImplicitParameterInspection : AbstractKotlinInspection implicitParameterReference, "Implicit parameter 'it' of enclosing lambda is shadowed", ProblemHighlightType.GENERIC_ERROR_OR_WARNING, - AddExplicitParameterNameFix() + AddExplicitParameterToOuterLambdaFix(), + RenameImplicitParameterFix() ) }) } - private class AddExplicitParameterNameFix : LocalQuickFix { + private class AddExplicitParameterToOuterLambdaFix : LocalQuickFix { override fun getName() = "Add explicit parameter name to outer lambda" override fun getFamilyName() = name @@ -52,12 +54,22 @@ class NestedLambdaShadowedImplicitParameterInspection : AbstractKotlinInspection val parameter = parentLambda.functionLiteral.getOrCreateParameterList().addParameterBefore( KtPsiFactory(project).createLambdaParameterList("it").parameters.first(), null ) - val editor = parentLambda.findExistingEditor() - if (editor != null) { - PsiDocumentManager.getInstance(project).doPostponedOperationsAndUnblockDocument(editor.document) - editor.caretModel.moveToOffset(parameter.startOffset) - KotlinVariableInplaceRenameHandler().doRename(parameter, editor, null) - } + val editor = parentLambda.findExistingEditor() ?: return + PsiDocumentManager.getInstance(project).doPostponedOperationsAndUnblockDocument(editor.document) + editor.caretModel.moveToOffset(parameter.startOffset) + KotlinVariableInplaceRenameHandler().doRename(parameter, editor, null) + } + } + + private class RenameImplicitParameterFix : LocalQuickFix { + override fun getName() = "Rename 'it'" + + override fun getFamilyName() = name + + override fun applyFix(project: Project, descriptor: ProblemDescriptor) { + val implicitParameterReference = descriptor.psiElement as? KtNameReferenceExpression ?: return + val editor = implicitParameterReference.findExistingEditor() ?: return + ReplaceItWithExplicitFunctionLiteralParamIntention().applyTo(implicitParameterReference, editor) } } } diff --git a/idea/testData/inspectionsLocal/nestedLambdaShadowedImplicitParameter/implicit.kt b/idea/testData/inspectionsLocal/nestedLambdaShadowedImplicitParameter/implicit.kt index 8da29aecc02..e2cf50fa0aa 100644 --- a/idea/testData/inspectionsLocal/nestedLambdaShadowedImplicitParameter/implicit.kt +++ b/idea/testData/inspectionsLocal/nestedLambdaShadowedImplicitParameter/implicit.kt @@ -1,3 +1,5 @@ +// FIX: Add explicit parameter name to outer lambda + fun foo(f: (String) -> Unit) {} fun bar(s: String) {} diff --git a/idea/testData/inspectionsLocal/nestedLambdaShadowedImplicitParameter/implicit.kt.after b/idea/testData/inspectionsLocal/nestedLambdaShadowedImplicitParameter/implicit.kt.after index 8fd147795bb..87f0b18cc34 100644 --- a/idea/testData/inspectionsLocal/nestedLambdaShadowedImplicitParameter/implicit.kt.after +++ b/idea/testData/inspectionsLocal/nestedLambdaShadowedImplicitParameter/implicit.kt.after @@ -1,3 +1,5 @@ +// FIX: Add explicit parameter name to outer lambda + fun foo(f: (String) -> Unit) {} fun bar(s: String) {} diff --git a/idea/testData/inspectionsLocal/nestedLambdaShadowedImplicitParameter/implicit2.kt b/idea/testData/inspectionsLocal/nestedLambdaShadowedImplicitParameter/implicit2.kt index f94e40b23a7..6722acf8b3d 100644 --- a/idea/testData/inspectionsLocal/nestedLambdaShadowedImplicitParameter/implicit2.kt +++ b/idea/testData/inspectionsLocal/nestedLambdaShadowedImplicitParameter/implicit2.kt @@ -1,3 +1,5 @@ +// FIX: Add explicit parameter name to outer lambda + fun foo(f: (String) -> Unit) {} fun bar(f: (Int) -> Unit) {} diff --git a/idea/testData/inspectionsLocal/nestedLambdaShadowedImplicitParameter/implicit2.kt.after b/idea/testData/inspectionsLocal/nestedLambdaShadowedImplicitParameter/implicit2.kt.after index e1ddac140f1..273d654d793 100644 --- a/idea/testData/inspectionsLocal/nestedLambdaShadowedImplicitParameter/implicit2.kt.after +++ b/idea/testData/inspectionsLocal/nestedLambdaShadowedImplicitParameter/implicit2.kt.after @@ -1,3 +1,5 @@ +// FIX: Add explicit parameter name to outer lambda + fun foo(f: (String) -> Unit) {} fun bar(f: (Int) -> Unit) {} diff --git a/idea/testData/inspectionsLocal/nestedLambdaShadowedImplicitParameter/implicit3.kt b/idea/testData/inspectionsLocal/nestedLambdaShadowedImplicitParameter/implicit3.kt new file mode 100644 index 00000000000..be366e980ca --- /dev/null +++ b/idea/testData/inspectionsLocal/nestedLambdaShadowedImplicitParameter/implicit3.kt @@ -0,0 +1,12 @@ +// FIX: Rename 'it' + +fun foo(f: (String) -> Unit) {} +fun bar(s: String) {} + +fun test() { + foo { + foo { + bar(it) + } + } +} \ No newline at end of file diff --git a/idea/testData/inspectionsLocal/nestedLambdaShadowedImplicitParameter/implicit3.kt.after b/idea/testData/inspectionsLocal/nestedLambdaShadowedImplicitParameter/implicit3.kt.after new file mode 100644 index 00000000000..21eb0d5f99d --- /dev/null +++ b/idea/testData/inspectionsLocal/nestedLambdaShadowedImplicitParameter/implicit3.kt.after @@ -0,0 +1,12 @@ +// FIX: Rename 'it' + +fun foo(f: (String) -> Unit) {} +fun bar(s: String) {} + +fun test() { + foo { + foo { it1 -> + bar(it1) + } + } +} \ No newline at end of file diff --git a/idea/testData/inspectionsLocal/nestedLambdaShadowedImplicitParameter/implicitGrandParent.kt b/idea/testData/inspectionsLocal/nestedLambdaShadowedImplicitParameter/implicitGrandParent.kt index f1e93725819..b1fb5240806 100644 --- a/idea/testData/inspectionsLocal/nestedLambdaShadowedImplicitParameter/implicitGrandParent.kt +++ b/idea/testData/inspectionsLocal/nestedLambdaShadowedImplicitParameter/implicitGrandParent.kt @@ -1,3 +1,5 @@ +// FIX: Add explicit parameter name to outer lambda + fun foo(f: (String) -> Unit) {} fun bar(s: String) {} diff --git a/idea/testData/inspectionsLocal/nestedLambdaShadowedImplicitParameter/implicitGrandParent.kt.after b/idea/testData/inspectionsLocal/nestedLambdaShadowedImplicitParameter/implicitGrandParent.kt.after index 1195f7c7f6d..25c9b6e361c 100644 --- a/idea/testData/inspectionsLocal/nestedLambdaShadowedImplicitParameter/implicitGrandParent.kt.after +++ b/idea/testData/inspectionsLocal/nestedLambdaShadowedImplicitParameter/implicitGrandParent.kt.after @@ -1,3 +1,5 @@ +// FIX: Add explicit parameter name to outer lambda + fun foo(f: (String) -> Unit) {} fun bar(s: String) {} diff --git a/idea/tests/org/jetbrains/kotlin/idea/inspections/LocalInspectionTestGenerated.java b/idea/tests/org/jetbrains/kotlin/idea/inspections/LocalInspectionTestGenerated.java index 9e048aa852e..f61a3b66dc7 100644 --- a/idea/tests/org/jetbrains/kotlin/idea/inspections/LocalInspectionTestGenerated.java +++ b/idea/tests/org/jetbrains/kotlin/idea/inspections/LocalInspectionTestGenerated.java @@ -3466,6 +3466,11 @@ public class LocalInspectionTestGenerated extends AbstractLocalInspectionTest { runTest("idea/testData/inspectionsLocal/nestedLambdaShadowedImplicitParameter/implicit2.kt"); } + @TestMetadata("implicit3.kt") + public void testImplicit3() throws Exception { + runTest("idea/testData/inspectionsLocal/nestedLambdaShadowedImplicitParameter/implicit3.kt"); + } + @TestMetadata("implicitGrandParent.kt") public void testImplicitGrandParent() throws Exception { runTest("idea/testData/inspectionsLocal/nestedLambdaShadowedImplicitParameter/implicitGrandParent.kt");