JavaMapForEachInspection: do not report when lambda parameter is destructuring declaration

#KT-34511 Fixed
This commit is contained in:
Toshiaki Kameyama
2019-11-29 14:04:43 +09:00
committed by Mikhail Glukhikh
parent 8857827dce
commit afc680d5c9
3 changed files with 17 additions and 1 deletions
@@ -32,7 +32,8 @@ class JavaMapForEachInspection : AbstractApplicabilityBasedInspection<KtDotQuali
if (calleeExpression.text != "forEach") return false
val lambda = callExpression.lambda() ?: return false
if (lambda.valueParameters.size != 2) return false
val lambdaParameters = lambda.valueParameters
if (lambdaParameters.size != 2 || lambdaParameters.any { it.destructuringDeclaration != null }) return false
val context = element.analyze(BodyResolveMode.PARTIAL)
if (!element.receiverExpression.getType(context).isMap(DefaultBuiltIns.Instance)) return false
@@ -0,0 +1,10 @@
// PROBLEM: none
// RUNTIME_WITH_FULL_JDK
fun test(map: Map<Int, String>) {
val mapOfPairs = mapOf<Pair<Int, Int>, Int>()
mapOfPairs.<caret>forEach { (first, second), value ->
println(first)
println(second)
println(value)
}
}
@@ -5066,6 +5066,11 @@ public class LocalInspectionTestGenerated extends AbstractLocalInspectionTest {
KotlinTestUtils.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("idea/testData/inspectionsLocal/javaMapForEach"), Pattern.compile("^([\\w\\-_]+)\\.(kt|kts)$"), null, true);
}
@TestMetadata("destructuringDeclaration.kt")
public void testDestructuringDeclaration() throws Exception {
runTest("idea/testData/inspectionsLocal/javaMapForEach/destructuringDeclaration.kt");
}
@TestMetadata("java.kt")
public void testJava() throws Exception {
runTest("idea/testData/inspectionsLocal/javaMapForEach/java.kt");