From 7800f42840774a788daf16d94eb0d7606f358463 Mon Sep 17 00:00:00 2001 From: Toshiaki Kameyama Date: Tue, 21 Aug 2018 11:41:08 +0900 Subject: [PATCH] "Nested lambda has shadowed implicit parameter": Do not report if 'it' paramerter is not used #KT-26268 Fixed --- ...tedLambdaShadowedImplicitParameterInspection.kt | 14 ++++++++------ .../implicit.kt | 2 ++ .../implicit.kt.after | 2 ++ .../implicitGrandParent.kt | 2 ++ .../implicitGrandParent.kt.after | 2 ++ .../notUseParameter.kt | 10 ++++++++++ .../inspections/LocalInspectionTestGenerated.java | 5 +++++ 7 files changed, 31 insertions(+), 6 deletions(-) create mode 100644 idea/testData/inspectionsLocal/nestedLambdaShadowedImplicitParameter/notUseParameter.kt diff --git a/idea/src/org/jetbrains/kotlin/idea/inspections/NestedLambdaShadowedImplicitParameterInspection.kt b/idea/src/org/jetbrains/kotlin/idea/inspections/NestedLambdaShadowedImplicitParameterInspection.kt index 885c1b8fedb..6c913eb8ad1 100644 --- a/idea/src/org/jetbrains/kotlin/idea/inspections/NestedLambdaShadowedImplicitParameterInspection.kt +++ b/idea/src/org/jetbrains/kotlin/idea/inspections/NestedLambdaShadowedImplicitParameterInspection.kt @@ -15,20 +15,22 @@ import com.intellij.psi.PsiElementVisitor import org.jetbrains.kotlin.idea.caches.resolve.analyze import org.jetbrains.kotlin.idea.refactoring.rename.KotlinVariableInplaceRenameHandler import org.jetbrains.kotlin.psi.* -import org.jetbrains.kotlin.psi.psiUtil.getOrCreateParameterList -import org.jetbrains.kotlin.psi.psiUtil.getParentOfTypesAndPredicate -import org.jetbrains.kotlin.psi.psiUtil.getStrictParentOfType -import org.jetbrains.kotlin.psi.psiUtil.startOffset +import org.jetbrains.kotlin.psi.psiUtil.* import org.jetbrains.kotlin.resolve.BindingContext +import org.jetbrains.kotlin.resolve.calls.callUtil.getResolvedCall import org.jetbrains.kotlin.resolve.lazy.BodyResolveMode class NestedLambdaShadowedImplicitParameterInspection : AbstractKotlinInspection() { override fun buildVisitor(holder: ProblemsHolder, isOnTheFly: Boolean): PsiElementVisitor { return lambdaExpressionVisitor(fun(lambda: KtLambdaExpression) { - val context: BindingContext by lazy { lambda.analyze(BodyResolveMode.PARTIAL) } - if (lambda.valueParameters.isNotEmpty() || lambda.functionDescriptor(context)?.valueParameters?.size != 1) return + if (lambda.valueParameters.isNotEmpty()) return + 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 holder.registerProblem( callee, diff --git a/idea/testData/inspectionsLocal/nestedLambdaShadowedImplicitParameter/implicit.kt b/idea/testData/inspectionsLocal/nestedLambdaShadowedImplicitParameter/implicit.kt index 95c4b2481c2..e5009739958 100644 --- a/idea/testData/inspectionsLocal/nestedLambdaShadowedImplicitParameter/implicit.kt +++ b/idea/testData/inspectionsLocal/nestedLambdaShadowedImplicitParameter/implicit.kt @@ -1,8 +1,10 @@ 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/implicit.kt.after b/idea/testData/inspectionsLocal/nestedLambdaShadowedImplicitParameter/implicit.kt.after index d24a6946976..8fd147795bb 100644 --- a/idea/testData/inspectionsLocal/nestedLambdaShadowedImplicitParameter/implicit.kt.after +++ b/idea/testData/inspectionsLocal/nestedLambdaShadowedImplicitParameter/implicit.kt.after @@ -1,8 +1,10 @@ fun foo(f: (String) -> Unit) {} +fun bar(s: String) {} fun test() { foo { it -> foo { + bar(it) } } } \ No newline at end of file diff --git a/idea/testData/inspectionsLocal/nestedLambdaShadowedImplicitParameter/implicitGrandParent.kt b/idea/testData/inspectionsLocal/nestedLambdaShadowedImplicitParameter/implicitGrandParent.kt index d984282f16e..ee40cd2e182 100644 --- a/idea/testData/inspectionsLocal/nestedLambdaShadowedImplicitParameter/implicitGrandParent.kt +++ b/idea/testData/inspectionsLocal/nestedLambdaShadowedImplicitParameter/implicitGrandParent.kt @@ -1,9 +1,11 @@ fun foo(f: (String) -> Unit) {} +fun bar(s: String) {} fun test() { foo { foo { s -> foo { + bar(it) } } } diff --git a/idea/testData/inspectionsLocal/nestedLambdaShadowedImplicitParameter/implicitGrandParent.kt.after b/idea/testData/inspectionsLocal/nestedLambdaShadowedImplicitParameter/implicitGrandParent.kt.after index a4cb5a10b71..1195f7c7f6d 100644 --- a/idea/testData/inspectionsLocal/nestedLambdaShadowedImplicitParameter/implicitGrandParent.kt.after +++ b/idea/testData/inspectionsLocal/nestedLambdaShadowedImplicitParameter/implicitGrandParent.kt.after @@ -1,9 +1,11 @@ fun foo(f: (String) -> Unit) {} +fun bar(s: String) {} fun test() { foo { it -> foo { s -> foo { + bar(it) } } } diff --git a/idea/testData/inspectionsLocal/nestedLambdaShadowedImplicitParameter/notUseParameter.kt b/idea/testData/inspectionsLocal/nestedLambdaShadowedImplicitParameter/notUseParameter.kt new file mode 100644 index 00000000000..4c88e4f1842 --- /dev/null +++ b/idea/testData/inspectionsLocal/nestedLambdaShadowedImplicitParameter/notUseParameter.kt @@ -0,0 +1,10 @@ +// PROBLEM: none + +fun foo(f: (String) -> Unit) {} + +fun test() { + foo { + foo { + } + } +} \ 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 144225396f3..9e048aa852e 100644 --- a/idea/tests/org/jetbrains/kotlin/idea/inspections/LocalInspectionTestGenerated.java +++ b/idea/tests/org/jetbrains/kotlin/idea/inspections/LocalInspectionTestGenerated.java @@ -3471,6 +3471,11 @@ public class LocalInspectionTestGenerated extends AbstractLocalInspectionTest { runTest("idea/testData/inspectionsLocal/nestedLambdaShadowedImplicitParameter/implicitGrandParent.kt"); } + @TestMetadata("notUseParameter.kt") + public void testNotUseParameter() throws Exception { + runTest("idea/testData/inspectionsLocal/nestedLambdaShadowedImplicitParameter/notUseParameter.kt"); + } + @TestMetadata("receiver.kt") public void testReceiver() throws Exception { runTest("idea/testData/inspectionsLocal/nestedLambdaShadowedImplicitParameter/receiver.kt");