Fix incorrect replacement with 'any' instead of 'all'

#KT-17730 Fixed
This commit is contained in:
Dmitry Jemerov
2017-12-14 17:24:11 +01:00
parent ba4cf4dcc6
commit b775b901cc
11 changed files with 76 additions and 17 deletions
@@ -189,6 +189,11 @@ object FindTransformationMatcher : TransformationMatcher {
} }
} }
private class NegatingFindOpetationGenerator(val generator: FindOperationGenerator) : FindOperationGenerator(generator) {
override fun generate(chainedCallGenerator: ChainedCallGenerator): KtExpression =
generator.generate(chainedCallGenerator).negate()
}
private fun generateChainedCall( private fun generateChainedCall(
stdlibFunName: String, stdlibFunName: String,
chainedCallGenerator: ChainedCallGenerator, chainedCallGenerator: ChainedCallGenerator,
@@ -347,19 +352,11 @@ object FindTransformationMatcher : TransformationMatcher {
val containsArgument = filterExpression.isFilterForContainsOperation(inputVariable, loop) val containsArgument = filterExpression.isFilterForContainsOperation(inputVariable, loop)
if (containsArgument != null) { if (containsArgument != null) {
val generator = SimpleGenerator("contains", inputVariable, null, containsArgument) val generator = SimpleGenerator("contains", inputVariable, null, containsArgument)
return if (negated) { return if (negated) NegatingFindOpetationGenerator(generator) else generator
object : FindOperationGenerator(generator) {
override fun generate(chainedCallGenerator: ChainedCallGenerator): KtExpression =
generator.generate(chainedCallGenerator).negate()
}
}
else {
generator
}
} }
if (filterExpression is KtPrefixExpression && filterExpression.operationToken == KtTokens.EXCL) { if (filterExpression is KtPrefixExpression && filterExpression.operationToken == KtTokens.EXCL && negated) {
return SimpleGenerator(if (negated) "any" else "none", inputVariable, filter.asNegatedExpression(reformat)) return SimpleGenerator("all", inputVariable, filter.asNegatedExpression(reformat))
} }
return SimpleGenerator(if (negated) "none" else "any", inputVariable, filterExpression) return SimpleGenerator(if (negated) "none" else "any", inputVariable, filterExpression)
+1 -1
View File
@@ -1,5 +1,5 @@
// WITH_RUNTIME // WITH_RUNTIME
// INTENTION_TEXT: "Replace with 'any{}'" // INTENTION_TEXT: "Replace with 'all{}'"
// IS_APPLICABLE_2: false // IS_APPLICABLE_2: false
fun foo(): Boolean { fun foo(): Boolean {
val foo = listOf(true, true) val foo = listOf(true, true)
@@ -1,7 +1,7 @@
// WITH_RUNTIME // WITH_RUNTIME
// INTENTION_TEXT: "Replace with 'any{}'" // INTENTION_TEXT: "Replace with 'all{}'"
// IS_APPLICABLE_2: false // IS_APPLICABLE_2: false
fun foo(): Boolean { fun foo(): Boolean {
val foo = listOf(true, true) val foo = listOf(true, true)
return foo.any { it } return foo.all { it }
} }
+1 -1
View File
@@ -1,5 +1,5 @@
// WITH_RUNTIME // WITH_RUNTIME
// INTENTION_TEXT: "Replace with 'any{}'" // INTENTION_TEXT: "Replace with 'all{}'"
// IS_APPLICABLE_2: false // IS_APPLICABLE_2: false
fun foo(): Boolean { fun foo(): Boolean {
val foo = listOf(true, true) val foo = listOf(true, true)
@@ -1,9 +1,9 @@
// WITH_RUNTIME // WITH_RUNTIME
// INTENTION_TEXT: "Replace with 'any{}'" // INTENTION_TEXT: "Replace with 'all{}'"
// IS_APPLICABLE_2: false // IS_APPLICABLE_2: false
fun foo(): Boolean { fun foo(): Boolean {
val foo = listOf(true, true) val foo = listOf(true, true)
return foo.any { f1(it) && f2(it) } return foo.all { f1(it) && f2(it) }
} }
fun f1(b: Boolean): Boolean = TODO() fun f1(b: Boolean): Boolean = TODO()
+12
View File
@@ -0,0 +1,12 @@
// WITH_RUNTIME
// INTENTION_TEXT: "Replace with 'all{}'"
// IS_APPLICABLE_2: false
fun foo(): Boolean {
val list = listOf(1, 2, 3, 4, 5)
<caret>for (e in list) {
if (!(e <= 3)) {
return false
}
}
return true
}
@@ -0,0 +1,7 @@
// WITH_RUNTIME
// INTENTION_TEXT: "Replace with 'all{}'"
// IS_APPLICABLE_2: false
fun foo(): Boolean {
val list = listOf(1, 2, 3, 4, 5)
return list.all { it <= 3 }
}
@@ -0,0 +1,12 @@
// WITH_RUNTIME
// INTENTION_TEXT: "Replace with 'any{}'"
// IS_APPLICABLE_2: false
fun foo(): Boolean {
val list = listOf(1, 2, 3, 4, 5)
<caret>for (e in list) {
if (!(e <= 3)) {
return true
}
}
return false
}
@@ -0,0 +1,7 @@
// WITH_RUNTIME
// INTENTION_TEXT: "Replace with 'any{}'"
// IS_APPLICABLE_2: false
fun foo(): Boolean {
val list = listOf(1, 2, 3, 4, 5)
return list.any { !(it <= 3) }
}
@@ -194,6 +194,18 @@ public class IntentionTest2Generated extends AbstractIntentionTest2 {
doTest(fileName); doTest(fileName);
} }
@TestMetadata("kt17730.kt")
public void testKt17730() throws Exception {
String fileName = KotlinTestUtils.navigationMetadata("idea/testData/intentions/loopToCallChain/any/kt17730.kt");
doTest(fileName);
}
@TestMetadata("kt17730_1.kt")
public void testKt17730_1() throws Exception {
String fileName = KotlinTestUtils.navigationMetadata("idea/testData/intentions/loopToCallChain/any/kt17730_1.kt");
doTest(fileName);
}
@TestMetadata("none.kt") @TestMetadata("none.kt")
public void testNone() throws Exception { public void testNone() throws Exception {
String fileName = KotlinTestUtils.navigationMetadata("idea/testData/intentions/loopToCallChain/any/none.kt"); String fileName = KotlinTestUtils.navigationMetadata("idea/testData/intentions/loopToCallChain/any/none.kt");
@@ -10105,6 +10105,18 @@ public class IntentionTestGenerated extends AbstractIntentionTest {
doTest(fileName); doTest(fileName);
} }
@TestMetadata("kt17730.kt")
public void testKt17730() throws Exception {
String fileName = KotlinTestUtils.navigationMetadata("idea/testData/intentions/loopToCallChain/any/kt17730.kt");
doTest(fileName);
}
@TestMetadata("kt17730_1.kt")
public void testKt17730_1() throws Exception {
String fileName = KotlinTestUtils.navigationMetadata("idea/testData/intentions/loopToCallChain/any/kt17730_1.kt");
doTest(fileName);
}
@TestMetadata("none.kt") @TestMetadata("none.kt")
public void testNone() throws Exception { public void testNone() throws Exception {
String fileName = KotlinTestUtils.navigationMetadata("idea/testData/intentions/loopToCallChain/any/none.kt"); String fileName = KotlinTestUtils.navigationMetadata("idea/testData/intentions/loopToCallChain/any/none.kt");