From cdef811c55a8aa441b36791fca7d5d44e2457a7c Mon Sep 17 00:00:00 2001 From: Mikhail Glukhikh Date: Thu, 27 Dec 2018 14:16:36 +0300 Subject: [PATCH] Do not report "redundant arrow" with parameters without expected type #KT-29049 Fixed Part of KT-29005 --- .../idea/inspections/RedundantLambdaArrowInspection.kt | 7 +++++++ .../redundantLambdaArrow/noExpectedType.kt | 5 +++++ .../idea/inspections/LocalInspectionTestGenerated.java | 5 +++++ 3 files changed, 17 insertions(+) create mode 100644 idea/testData/inspectionsLocal/redundantLambdaArrow/noExpectedType.kt diff --git a/idea/src/org/jetbrains/kotlin/idea/inspections/RedundantLambdaArrowInspection.kt b/idea/src/org/jetbrains/kotlin/idea/inspections/RedundantLambdaArrowInspection.kt index 5cf793380c5..7d89a0336f7 100644 --- a/idea/src/org/jetbrains/kotlin/idea/inspections/RedundantLambdaArrowInspection.kt +++ b/idea/src/org/jetbrains/kotlin/idea/inspections/RedundantLambdaArrowInspection.kt @@ -14,10 +14,12 @@ import com.intellij.openapi.project.Project import com.intellij.openapi.util.TextRange import com.intellij.psi.PsiElementVisitor import org.jetbrains.kotlin.KtNodeTypes +import org.jetbrains.kotlin.idea.caches.resolve.analyze import org.jetbrains.kotlin.psi.* import org.jetbrains.kotlin.psi.psiUtil.endOffset import org.jetbrains.kotlin.psi.psiUtil.getStrictParentOfType import org.jetbrains.kotlin.psi.psiUtil.startOffset +import org.jetbrains.kotlin.resolve.BindingContext import org.jetbrains.kotlin.resolve.calls.util.isSingleUnderscore class RedundantLambdaArrowInspection : AbstractKotlinInspection() { @@ -42,6 +44,11 @@ class RedundantLambdaArrowInspection : AbstractKotlinInspection() { if (callee != null && callee.getReferencedName() == "forEach" && singleParameter?.name != "it") return } + if (parameters.isNotEmpty()) { + val context = lambdaExpression.analyze() + if (context[BindingContext.EXPECTED_EXPRESSION_TYPE, lambdaExpression] == null) return + } + val startOffset = functionLiteral.startOffset holder.registerProblem( holder.manager.createProblemDescriptor( diff --git a/idea/testData/inspectionsLocal/redundantLambdaArrow/noExpectedType.kt b/idea/testData/inspectionsLocal/redundantLambdaArrow/noExpectedType.kt new file mode 100644 index 00000000000..6680c139887 --- /dev/null +++ b/idea/testData/inspectionsLocal/redundantLambdaArrow/noExpectedType.kt @@ -0,0 +1,5 @@ +// PROBLEM: none + +fun foo(x: Int) = x + +val x = { it: Int -> foo(it) } \ 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 b7bc4bcd650..c078a5d06c5 100644 --- a/idea/tests/org/jetbrains/kotlin/idea/inspections/LocalInspectionTestGenerated.java +++ b/idea/tests/org/jetbrains/kotlin/idea/inspections/LocalInspectionTestGenerated.java @@ -4938,6 +4938,11 @@ public class LocalInspectionTestGenerated extends AbstractLocalInspectionTest { runTest("idea/testData/inspectionsLocal/redundantLambdaArrow/it.kt"); } + @TestMetadata("noExpectedType.kt") + public void testNoExpectedType() throws Exception { + runTest("idea/testData/inspectionsLocal/redundantLambdaArrow/noExpectedType.kt"); + } + @TestMetadata("simple.kt") public void testSimple() throws Exception { runTest("idea/testData/inspectionsLocal/redundantLambdaArrow/simple.kt");