KT-14209 for loop to stdlib: sum is not recognized if before was check for type
#KT-14209 Fixed
This commit is contained in:
+8
-1
@@ -24,6 +24,7 @@ import org.jetbrains.kotlin.idea.intentions.loopToCallChain.*
|
|||||||
import org.jetbrains.kotlin.idea.intentions.loopToCallChain.sequence.MapTransformation
|
import org.jetbrains.kotlin.idea.intentions.loopToCallChain.sequence.MapTransformation
|
||||||
import org.jetbrains.kotlin.lexer.KtTokens
|
import org.jetbrains.kotlin.lexer.KtTokens
|
||||||
import org.jetbrains.kotlin.psi.*
|
import org.jetbrains.kotlin.psi.*
|
||||||
|
import org.jetbrains.kotlin.resolve.BindingContext
|
||||||
import org.jetbrains.kotlin.resolve.lazy.BodyResolveMode
|
import org.jetbrains.kotlin.resolve.lazy.BodyResolveMode
|
||||||
import org.jetbrains.kotlin.types.KotlinType
|
import org.jetbrains.kotlin.types.KotlinType
|
||||||
|
|
||||||
@@ -66,7 +67,7 @@ abstract class SumTransformationBase(
|
|||||||
|
|
||||||
val value = statement.right ?: return null
|
val value = statement.right ?: return null
|
||||||
|
|
||||||
val valueType = value.analyze(BodyResolveMode.PARTIAL).getType(value)?.toSupportedType() ?: return null
|
val valueType = value.typeWithSmartCast()?.toSupportedType() ?: return null
|
||||||
val sumType = (variableInitialization.variable.resolveToDescriptorIfAny() as? VariableDescriptor)?.type?.toSupportedType() ?: return null
|
val sumType = (variableInitialization.variable.resolveToDescriptorIfAny() as? VariableDescriptor)?.type?.toSupportedType() ?: return null
|
||||||
|
|
||||||
val conversionFunctionName = when (sumType) {
|
val conversionFunctionName = when (sumType) {
|
||||||
@@ -140,6 +141,12 @@ abstract class SumTransformationBase(
|
|||||||
else -> null
|
else -> null
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private fun KtExpression.typeWithSmartCast(): KotlinType? {
|
||||||
|
val bindingContext = analyze(BodyResolveMode.PARTIAL)
|
||||||
|
return bindingContext[BindingContext.SMARTCAST, this]?.defaultType
|
||||||
|
?: bindingContext.getType(this)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -0,0 +1,9 @@
|
|||||||
|
// WITH_RUNTIME
|
||||||
|
// INTENTION_TEXT: "Replace with 'filterIsInstance<>().sum()'"
|
||||||
|
// INTENTION_TEXT_2: "Replace with 'asSequence().filterIsInstance<>().sum()'"
|
||||||
|
fun foo(list: List<Any>){
|
||||||
|
var result = 0
|
||||||
|
<caret>for (l in list)
|
||||||
|
if (l is Int)
|
||||||
|
result += l
|
||||||
|
}
|
||||||
@@ -0,0 +1,8 @@
|
|||||||
|
// WITH_RUNTIME
|
||||||
|
// INTENTION_TEXT: "Replace with 'filterIsInstance<>().sum()'"
|
||||||
|
// INTENTION_TEXT_2: "Replace with 'asSequence().filterIsInstance<>().sum()'"
|
||||||
|
fun foo(list: List<Any>){
|
||||||
|
val <caret>result = list
|
||||||
|
.filterIsInstance<Int>()
|
||||||
|
.sum()
|
||||||
|
}
|
||||||
@@ -0,0 +1,9 @@
|
|||||||
|
// WITH_RUNTIME
|
||||||
|
// INTENTION_TEXT: "Replace with 'filterIsInstance<>().sum()'"
|
||||||
|
// INTENTION_TEXT_2: "Replace with 'asSequence().filterIsInstance<>().sum()'"
|
||||||
|
fun foo(list: List<Any>){
|
||||||
|
val <caret>result = list
|
||||||
|
.asSequence()
|
||||||
|
.filterIsInstance<Int>()
|
||||||
|
.sum()
|
||||||
|
}
|
||||||
@@ -0,0 +1,9 @@
|
|||||||
|
// WITH_RUNTIME
|
||||||
|
// INTENTION_TEXT: "Replace with 'filterNotNull().sum()'"
|
||||||
|
// INTENTION_TEXT_2: "Replace with 'asSequence().filterNotNull().sum()'"
|
||||||
|
fun foo(list: List<Int?>){
|
||||||
|
var result = 0
|
||||||
|
<caret>for (l in list)
|
||||||
|
if (l != null)
|
||||||
|
result += l
|
||||||
|
}
|
||||||
@@ -0,0 +1,8 @@
|
|||||||
|
// WITH_RUNTIME
|
||||||
|
// INTENTION_TEXT: "Replace with 'filterNotNull().sum()'"
|
||||||
|
// INTENTION_TEXT_2: "Replace with 'asSequence().filterNotNull().sum()'"
|
||||||
|
fun foo(list: List<Int?>){
|
||||||
|
val <caret>result = list
|
||||||
|
.filterNotNull()
|
||||||
|
.sum()
|
||||||
|
}
|
||||||
@@ -0,0 +1,9 @@
|
|||||||
|
// WITH_RUNTIME
|
||||||
|
// INTENTION_TEXT: "Replace with 'filterNotNull().sum()'"
|
||||||
|
// INTENTION_TEXT_2: "Replace with 'asSequence().filterNotNull().sum()'"
|
||||||
|
fun foo(list: List<Int?>){
|
||||||
|
val <caret>result = list
|
||||||
|
.asSequence()
|
||||||
|
.filterNotNull()
|
||||||
|
.sum()
|
||||||
|
}
|
||||||
@@ -1267,6 +1267,18 @@ public class IntentionTest2Generated extends AbstractIntentionTest2 {
|
|||||||
doTest(fileName);
|
doTest(fileName);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@TestMetadata("smartCast.kt")
|
||||||
|
public void testSmartCast() throws Exception {
|
||||||
|
String fileName = KotlinTestUtils.navigationMetadata("idea/testData/intentions/loopToCallChain/sum/smartCast.kt");
|
||||||
|
doTest(fileName);
|
||||||
|
}
|
||||||
|
|
||||||
|
@TestMetadata("smartCastNotNull.kt")
|
||||||
|
public void testSmartCastNotNull() throws Exception {
|
||||||
|
String fileName = KotlinTestUtils.navigationMetadata("idea/testData/intentions/loopToCallChain/sum/smartCastNotNull.kt");
|
||||||
|
doTest(fileName);
|
||||||
|
}
|
||||||
|
|
||||||
@TestMetadata("sumByDouble.kt")
|
@TestMetadata("sumByDouble.kt")
|
||||||
public void testSumByDouble() throws Exception {
|
public void testSumByDouble() throws Exception {
|
||||||
String fileName = KotlinTestUtils.navigationMetadata("idea/testData/intentions/loopToCallChain/sum/sumByDouble.kt");
|
String fileName = KotlinTestUtils.navigationMetadata("idea/testData/intentions/loopToCallChain/sum/sumByDouble.kt");
|
||||||
|
|||||||
@@ -9175,6 +9175,18 @@ public class IntentionTestGenerated extends AbstractIntentionTest {
|
|||||||
doTest(fileName);
|
doTest(fileName);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@TestMetadata("smartCast.kt")
|
||||||
|
public void testSmartCast() throws Exception {
|
||||||
|
String fileName = KotlinTestUtils.navigationMetadata("idea/testData/intentions/loopToCallChain/sum/smartCast.kt");
|
||||||
|
doTest(fileName);
|
||||||
|
}
|
||||||
|
|
||||||
|
@TestMetadata("smartCastNotNull.kt")
|
||||||
|
public void testSmartCastNotNull() throws Exception {
|
||||||
|
String fileName = KotlinTestUtils.navigationMetadata("idea/testData/intentions/loopToCallChain/sum/smartCastNotNull.kt");
|
||||||
|
doTest(fileName);
|
||||||
|
}
|
||||||
|
|
||||||
@TestMetadata("sumByDouble.kt")
|
@TestMetadata("sumByDouble.kt")
|
||||||
public void testSumByDouble() throws Exception {
|
public void testSumByDouble() throws Exception {
|
||||||
String fileName = KotlinTestUtils.navigationMetadata("idea/testData/intentions/loopToCallChain/sum/sumByDouble.kt");
|
String fileName = KotlinTestUtils.navigationMetadata("idea/testData/intentions/loopToCallChain/sum/sumByDouble.kt");
|
||||||
|
|||||||
Reference in New Issue
Block a user