From 4638a97bbcf402c01eb1ebdc96cb567697fb38f9 Mon Sep 17 00:00:00 2001 From: Toshiaki Kameyama Date: Sun, 26 Jan 2020 23:15:48 +0900 Subject: [PATCH] "Call on collection type may be reduced": fix false positive with mapNotNull, generic lambda block and new inference #KT-32801 Fixed --- .../collections/UselessCallOnCollectionInspection.kt | 5 ++++- .../MapNotNullWithGenericLambda.kt | 11 +++++++++++ .../inspections/LocalInspectionTestGenerated.java | 5 +++++ 3 files changed, 20 insertions(+), 1 deletion(-) create mode 100644 idea/testData/inspectionsLocal/collections/uselessCallOnCollection/MapNotNullWithGenericLambda.kt diff --git a/idea/src/org/jetbrains/kotlin/idea/inspections/collections/UselessCallOnCollectionInspection.kt b/idea/src/org/jetbrains/kotlin/idea/inspections/collections/UselessCallOnCollectionInspection.kt index cfb2795c6ce..e1159491282 100644 --- a/idea/src/org/jetbrains/kotlin/idea/inspections/collections/UselessCallOnCollectionInspection.kt +++ b/idea/src/org/jetbrains/kotlin/idea/inspections/collections/UselessCallOnCollectionInspection.kt @@ -19,6 +19,7 @@ import org.jetbrains.kotlin.resolve.calls.callUtil.getResolvedCall import org.jetbrains.kotlin.resolve.calls.callUtil.getType import org.jetbrains.kotlin.resolve.descriptorUtil.fqNameSafe import org.jetbrains.kotlin.types.KotlinType +import org.jetbrains.kotlin.resolve.calls.inference.model.TypeVariableTypeConstructor import org.jetbrains.kotlin.types.TypeUtils import org.jetbrains.kotlin.types.isFlexible import org.jetbrains.kotlin.types.typeUtil.isSubtypeOf @@ -53,7 +54,9 @@ class UselessCallOnCollectionInspection : AbstractUselessCallInspection() { if (TypeUtils.isNullableType(receiverTypeArgument)) return if (calleeExpression.text != "filterNotNull") { // Also check last argument functional type to have not-null result - if (!resolvedCall.hasLastFunctionalParameterWithResult(context) { !TypeUtils.isNullableType(it) }) return + if (!resolvedCall.hasLastFunctionalParameterWithResult(context) { + !TypeUtils.isNullableType(it) && it.constructor !is TypeVariableTypeConstructor + }) return } } diff --git a/idea/testData/inspectionsLocal/collections/uselessCallOnCollection/MapNotNullWithGenericLambda.kt b/idea/testData/inspectionsLocal/collections/uselessCallOnCollection/MapNotNullWithGenericLambda.kt new file mode 100644 index 00000000000..419e9124db1 --- /dev/null +++ b/idea/testData/inspectionsLocal/collections/uselessCallOnCollection/MapNotNullWithGenericLambda.kt @@ -0,0 +1,11 @@ +// PROBLEM: none +// COMPILER_ARGUMENTS: -XXLanguage:+NewInference +// WITH_RUNTIME + +fun mylet(block: () -> R): R = block() + +val x = listOf(1, 2, 3).mapNotNull { + mylet { + null + } +} \ 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 2fc40321bf9..2d6fb8660e3 100644 --- a/idea/tests/org/jetbrains/kotlin/idea/inspections/LocalInspectionTestGenerated.java +++ b/idea/tests/org/jetbrains/kotlin/idea/inspections/LocalInspectionTestGenerated.java @@ -1990,6 +1990,11 @@ public class LocalInspectionTestGenerated extends AbstractLocalInspectionTest { runTest("idea/testData/inspectionsLocal/collections/uselessCallOnCollection/MapNotNullTo.kt"); } + @TestMetadata("MapNotNullWithGenericLambda.kt") + public void testMapNotNullWithGenericLambda() throws Exception { + runTest("idea/testData/inspectionsLocal/collections/uselessCallOnCollection/MapNotNullWithGenericLambda.kt"); + } + @TestMetadata("MapNotNullWithLambda.kt") public void testMapNotNullWithLambda() throws Exception { runTest("idea/testData/inspectionsLocal/collections/uselessCallOnCollection/MapNotNullWithLambda.kt");