From fba539debffa61420f55b36db34b5cbb0605bc1a Mon Sep 17 00:00:00 2001 From: Toshiaki Kameyama Date: Thu, 30 Aug 2018 15:07:46 +0900 Subject: [PATCH] "Nested lambda has shadowed implicit parameter": minor improvements --- ...mbdaShadowedImplicitParameterInspection.kt | 39 +++++++------------ .../implicit3.kt | 4 +- .../implicit3.kt.after | 4 +- 3 files changed, 19 insertions(+), 28 deletions(-) diff --git a/idea/src/org/jetbrains/kotlin/idea/inspections/NestedLambdaShadowedImplicitParameterInspection.kt b/idea/src/org/jetbrains/kotlin/idea/inspections/NestedLambdaShadowedImplicitParameterInspection.kt index 7528e17e2b5..f1beb1dc6f4 100644 --- a/idea/src/org/jetbrains/kotlin/idea/inspections/NestedLambdaShadowedImplicitParameterInspection.kt +++ b/idea/src/org/jetbrains/kotlin/idea/inspections/NestedLambdaShadowedImplicitParameterInspection.kt @@ -5,10 +5,7 @@ package org.jetbrains.kotlin.idea.inspections -import com.intellij.codeInspection.LocalQuickFix -import com.intellij.codeInspection.ProblemDescriptor -import com.intellij.codeInspection.ProblemHighlightType -import com.intellij.codeInspection.ProblemsHolder +import com.intellij.codeInspection.* import com.intellij.openapi.project.Project import com.intellij.psi.PsiDocumentManager import com.intellij.psi.PsiElementVisitor @@ -29,16 +26,18 @@ class NestedLambdaShadowedImplicitParameterInspection : AbstractKotlinInspection val context = lambda.analyze(BodyResolveMode.PARTIAL) val implicitParameter = lambda.functionDescriptor(context)?.valueParameters?.singleOrNull() ?: return if (lambda.getParentImplicitParameterLambda(context) == null) return - val implicitParameterReference = lambda.findDescendantOfType { - it.text == "it" && it.getResolvedCall(context)?.resultingDescriptor == implicitParameter - } ?: return - holder.registerProblem( - implicitParameterReference, - "Implicit parameter 'it' of enclosing lambda is shadowed", - ProblemHighlightType.GENERIC_ERROR_OR_WARNING, - AddExplicitParameterToOuterLambdaFix(), - RenameImplicitParameterFix() - ) + val containingFile = lambda.containingFile + lambda.forEachDescendantOfType { + if (it.text == "it" && it.getResolvedCall(context)?.resultingDescriptor == implicitParameter) { + holder.registerProblem( + it, + "Implicit parameter 'it' of enclosing lambda is shadowed", + ProblemHighlightType.GENERIC_ERROR_OR_WARNING, + AddExplicitParameterToOuterLambdaFix(), + IntentionWrapper(ReplaceItWithExplicitFunctionLiteralParamIntention(), containingFile) + ) + } + } }) } @@ -60,18 +59,6 @@ class NestedLambdaShadowedImplicitParameterInspection : AbstractKotlinInspection 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) - } - } } private fun KtLambdaExpression.functionDescriptor(context: BindingContext) = context[BindingContext.FUNCTION, functionLiteral] diff --git a/idea/testData/inspectionsLocal/nestedLambdaShadowedImplicitParameter/implicit3.kt b/idea/testData/inspectionsLocal/nestedLambdaShadowedImplicitParameter/implicit3.kt index be366e980ca..2df390be8fa 100644 --- a/idea/testData/inspectionsLocal/nestedLambdaShadowedImplicitParameter/implicit3.kt +++ b/idea/testData/inspectionsLocal/nestedLambdaShadowedImplicitParameter/implicit3.kt @@ -1,4 +1,4 @@ -// FIX: Rename 'it' +// FIX: Replace 'it' with explicit parameter fun foo(f: (String) -> Unit) {} fun bar(s: String) {} @@ -6,6 +6,8 @@ fun bar(s: String) {} fun test() { foo { foo { + bar(it) + bar(it) bar(it) } } diff --git a/idea/testData/inspectionsLocal/nestedLambdaShadowedImplicitParameter/implicit3.kt.after b/idea/testData/inspectionsLocal/nestedLambdaShadowedImplicitParameter/implicit3.kt.after index 21eb0d5f99d..e487afac30e 100644 --- a/idea/testData/inspectionsLocal/nestedLambdaShadowedImplicitParameter/implicit3.kt.after +++ b/idea/testData/inspectionsLocal/nestedLambdaShadowedImplicitParameter/implicit3.kt.after @@ -1,4 +1,4 @@ -// FIX: Rename 'it' +// FIX: Replace 'it' with explicit parameter fun foo(f: (String) -> Unit) {} fun bar(s: String) {} @@ -7,6 +7,8 @@ fun test() { foo { foo { it1 -> bar(it1) + bar(it1) + bar(it1) } } } \ No newline at end of file