diff --git a/idea/src/org/jetbrains/kotlin/idea/inspections/NestedLambdaShadowedImplicitParameterInspection.kt b/idea/src/org/jetbrains/kotlin/idea/inspections/NestedLambdaShadowedImplicitParameterInspection.kt index 6c913eb8ad1..df657d882de 100644 --- a/idea/src/org/jetbrains/kotlin/idea/inspections/NestedLambdaShadowedImplicitParameterInspection.kt +++ b/idea/src/org/jetbrains/kotlin/idea/inspections/NestedLambdaShadowedImplicitParameterInspection.kt @@ -28,12 +28,11 @@ class NestedLambdaShadowedImplicitParameterInspection : AbstractKotlinInspection val context = lambda.analyze(BodyResolveMode.PARTIAL) val implicitParameter = lambda.functionDescriptor(context)?.valueParameters?.singleOrNull() ?: return if (lambda.getParentImplicitParameterLambda(context) == null) return - if (lambda.findDescendantOfType { - it.text == "it" && it.getResolvedCall(context)?.resultingDescriptor == implicitParameter - } == null) return - val callee = lambda.getStrictParentOfType()?.calleeExpression ?: return + val implicitParameterReference = lambda.findDescendantOfType { + it.text == "it" && it.getResolvedCall(context)?.resultingDescriptor == implicitParameter + } ?: return holder.registerProblem( - callee, + implicitParameterReference, "Implicit parameter 'it' of enclosing lambda is shadowed", ProblemHighlightType.GENERIC_ERROR_OR_WARNING, AddExplicitParameterNameFix() @@ -47,7 +46,9 @@ class NestedLambdaShadowedImplicitParameterInspection : AbstractKotlinInspection override fun getFamilyName() = name override fun applyFix(project: Project, descriptor: ProblemDescriptor) { - val parentLambda = (descriptor.psiElement as? KtExpression)?.getParentImplicitParameterLambda() ?: return + val implicitParameterReference = descriptor.psiElement as? KtNameReferenceExpression ?: return + val lambda = implicitParameterReference.getStrictParentOfType() ?: return + val parentLambda = lambda.getParentImplicitParameterLambda() ?: return val parameter = parentLambda.functionLiteral.getOrCreateParameterList().addParameterBefore( KtPsiFactory(project).createLambdaParameterList("it").parameters.first(), null ) diff --git a/idea/testData/inspectionsLocal/nestedLambdaShadowedImplicitParameter/explicit.kt b/idea/testData/inspectionsLocal/nestedLambdaShadowedImplicitParameter/explicit.kt index 982611dcbb0..558c53eab1c 100644 --- a/idea/testData/inspectionsLocal/nestedLambdaShadowedImplicitParameter/explicit.kt +++ b/idea/testData/inspectionsLocal/nestedLambdaShadowedImplicitParameter/explicit.kt @@ -1,10 +1,12 @@ // PROBLEM: none fun foo(f: (String) -> Unit) {} +fun bar(s: String) {} fun test() { foo { - foo { s -> + foo { s -> + bar(it) } } } \ No newline at end of file diff --git a/idea/testData/inspectionsLocal/nestedLambdaShadowedImplicitParameter/explicitParent.kt b/idea/testData/inspectionsLocal/nestedLambdaShadowedImplicitParameter/explicitParent.kt index 61929df729b..08fbf486ebb 100644 --- a/idea/testData/inspectionsLocal/nestedLambdaShadowedImplicitParameter/explicitParent.kt +++ b/idea/testData/inspectionsLocal/nestedLambdaShadowedImplicitParameter/explicitParent.kt @@ -1,10 +1,12 @@ // PROBLEM: none fun foo(f: (String) -> Unit) {} +fun bar(s: String) {} fun test() { foo { s -> - foo { + foo { + bar(it) } } } \ No newline at end of file diff --git a/idea/testData/inspectionsLocal/nestedLambdaShadowedImplicitParameter/implicit.kt b/idea/testData/inspectionsLocal/nestedLambdaShadowedImplicitParameter/implicit.kt index e5009739958..8da29aecc02 100644 --- a/idea/testData/inspectionsLocal/nestedLambdaShadowedImplicitParameter/implicit.kt +++ b/idea/testData/inspectionsLocal/nestedLambdaShadowedImplicitParameter/implicit.kt @@ -3,8 +3,8 @@ fun bar(s: String) {} fun test() { foo { - foo { - bar(it) + foo { + bar(it) } } } \ No newline at end of file diff --git a/idea/testData/inspectionsLocal/nestedLambdaShadowedImplicitParameter/implicit2.kt b/idea/testData/inspectionsLocal/nestedLambdaShadowedImplicitParameter/implicit2.kt index ab341eb653e..f94e40b23a7 100644 --- a/idea/testData/inspectionsLocal/nestedLambdaShadowedImplicitParameter/implicit2.kt +++ b/idea/testData/inspectionsLocal/nestedLambdaShadowedImplicitParameter/implicit2.kt @@ -4,8 +4,8 @@ fun bar(f: (Int) -> Unit) {} fun test() { foo { val s: String = it - bar { - val i: Int = it + bar { + val i: Int = it } } } \ No newline at end of file diff --git a/idea/testData/inspectionsLocal/nestedLambdaShadowedImplicitParameter/implicitGrandParent.kt b/idea/testData/inspectionsLocal/nestedLambdaShadowedImplicitParameter/implicitGrandParent.kt index ee40cd2e182..f1e93725819 100644 --- a/idea/testData/inspectionsLocal/nestedLambdaShadowedImplicitParameter/implicitGrandParent.kt +++ b/idea/testData/inspectionsLocal/nestedLambdaShadowedImplicitParameter/implicitGrandParent.kt @@ -4,8 +4,8 @@ fun bar(s: String) {} fun test() { foo { foo { s -> - foo { - bar(it) + foo { + bar(it) } } } diff --git a/idea/testData/inspectionsLocal/nestedLambdaShadowedImplicitParameter/notUseParameter.kt b/idea/testData/inspectionsLocal/nestedLambdaShadowedImplicitParameter/notUseParameter.kt index 4c88e4f1842..65de6363c0e 100644 --- a/idea/testData/inspectionsLocal/nestedLambdaShadowedImplicitParameter/notUseParameter.kt +++ b/idea/testData/inspectionsLocal/nestedLambdaShadowedImplicitParameter/notUseParameter.kt @@ -1,10 +1,12 @@ // PROBLEM: none fun foo(f: (String) -> Unit) {} +fun bar(s: String) {} fun test() { foo { - foo { + foo { + bar("") } } } \ No newline at end of file diff --git a/idea/testData/inspectionsLocal/nestedLambdaShadowedImplicitParameter/receiver.kt b/idea/testData/inspectionsLocal/nestedLambdaShadowedImplicitParameter/receiver.kt index 867d84cea0f..f8f8c5cb8d8 100644 --- a/idea/testData/inspectionsLocal/nestedLambdaShadowedImplicitParameter/receiver.kt +++ b/idea/testData/inspectionsLocal/nestedLambdaShadowedImplicitParameter/receiver.kt @@ -2,10 +2,12 @@ fun foo(f: (String) -> Unit) {} fun bar(f: String.() -> Unit) {} +fun baz(s: String) {} fun test() { foo { bar { + baz(it) } } } \ No newline at end of file diff --git a/idea/testData/inspectionsLocal/nestedLambdaShadowedImplicitParameter/receiverParent.kt b/idea/testData/inspectionsLocal/nestedLambdaShadowedImplicitParameter/receiverParent.kt index b57560c9b1c..4a0ce85559c 100644 --- a/idea/testData/inspectionsLocal/nestedLambdaShadowedImplicitParameter/receiverParent.kt +++ b/idea/testData/inspectionsLocal/nestedLambdaShadowedImplicitParameter/receiverParent.kt @@ -2,10 +2,12 @@ fun foo(f: (String) -> Unit) {} fun bar(f: String.() -> Unit) {} +fun baz(s: String) {} fun test() { bar { - foo { + foo { + baz(it) } } } \ No newline at end of file