any() and other find operations to work with checks for not null and is instance
This commit is contained in:
+4
-4
@@ -20,7 +20,7 @@ import org.jetbrains.kotlin.descriptors.VariableDescriptor
|
|||||||
import org.jetbrains.kotlin.idea.caches.resolve.resolveToDescriptor
|
import org.jetbrains.kotlin.idea.caches.resolve.resolveToDescriptor
|
||||||
import org.jetbrains.kotlin.idea.intentions.branchedTransformations.isNullExpression
|
import org.jetbrains.kotlin.idea.intentions.branchedTransformations.isNullExpression
|
||||||
import org.jetbrains.kotlin.idea.intentions.loopToCallChain.*
|
import org.jetbrains.kotlin.idea.intentions.loopToCallChain.*
|
||||||
import org.jetbrains.kotlin.idea.intentions.loopToCallChain.sequence.FilterTransformation
|
import org.jetbrains.kotlin.idea.intentions.loopToCallChain.sequence.FilterTransformationBase
|
||||||
import org.jetbrains.kotlin.idea.intentions.negate
|
import org.jetbrains.kotlin.idea.intentions.negate
|
||||||
import org.jetbrains.kotlin.lexer.KtTokens
|
import org.jetbrains.kotlin.lexer.KtTokens
|
||||||
import org.jetbrains.kotlin.psi.*
|
import org.jetbrains.kotlin.psi.*
|
||||||
@@ -61,7 +61,7 @@ object FindTransformationMatcher : TransformationMatcher {
|
|||||||
return matchWithFilterBefore(state, null)
|
return matchWithFilterBefore(state, null)
|
||||||
}
|
}
|
||||||
|
|
||||||
fun matchWithFilterBefore(state: MatchingState, filterTransformation: FilterTransformation?): TransformationMatch.Result? {
|
fun matchWithFilterBefore(state: MatchingState, filterTransformation: FilterTransformationBase?): TransformationMatch.Result? {
|
||||||
matchReturn(state, filterTransformation)?.let { return it }
|
matchReturn(state, filterTransformation)?.let { return it }
|
||||||
|
|
||||||
when (state.statements.size) {
|
when (state.statements.size) {
|
||||||
@@ -98,7 +98,7 @@ object FindTransformationMatcher : TransformationMatcher {
|
|||||||
return TransformationMatch.Result(transformation)
|
return TransformationMatch.Result(transformation)
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun matchReturn(state: MatchingState, filterTransformation: FilterTransformation?): TransformationMatch.Result? {
|
private fun matchReturn(state: MatchingState, filterTransformation: FilterTransformationBase?): TransformationMatch.Result? {
|
||||||
val returnInLoop = state.statements.singleOrNull() as? KtReturnExpression ?: return null
|
val returnInLoop = state.statements.singleOrNull() as? KtReturnExpression ?: return null
|
||||||
val returnAfterLoop = state.outerLoop.nextStatement() as? KtReturnExpression ?: return null
|
val returnAfterLoop = state.outerLoop.nextStatement() as? KtReturnExpression ?: return null
|
||||||
if (returnInLoop.getLabelName() != returnAfterLoop.getLabelName()) return null
|
if (returnInLoop.getLabelName() != returnAfterLoop.getLabelName()) return null
|
||||||
@@ -216,7 +216,7 @@ object FindTransformationMatcher : TransformationMatcher {
|
|||||||
loop: KtForExpression,
|
loop: KtForExpression,
|
||||||
inputVariable: KtCallableDeclaration,
|
inputVariable: KtCallableDeclaration,
|
||||||
indexVariable: KtCallableDeclaration?,
|
indexVariable: KtCallableDeclaration?,
|
||||||
filterTransformation: FilterTransformation?,
|
filterTransformation: FilterTransformationBase?,
|
||||||
valueIfFound: KtExpression,
|
valueIfFound: KtExpression,
|
||||||
valueIfNotFound: KtExpression,
|
valueIfNotFound: KtExpression,
|
||||||
findFirst: Boolean
|
findFirst: Boolean
|
||||||
|
|||||||
+3
@@ -80,6 +80,9 @@ abstract class FilterTransformationBase : SequenceTransformation {
|
|||||||
currentState = nextState
|
currentState = nextState
|
||||||
}
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
if (transformation is FilterTransformationBase) {
|
||||||
FindTransformationMatcher.matchWithFilterBefore(currentState, transformation)
|
FindTransformationMatcher.matchWithFilterBefore(currentState, transformation)
|
||||||
?.let { return it }
|
?.let { return it }
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -0,0 +1,9 @@
|
|||||||
|
// WITH_RUNTIME
|
||||||
|
// INTENTION_TEXT: "Replace with 'any{}'"
|
||||||
|
// IS_APPLICABLE_2: false
|
||||||
|
fun foo(list: List<Any?>): Boolean {
|
||||||
|
<caret>for (a in list) {
|
||||||
|
if (a != null) return true
|
||||||
|
}
|
||||||
|
return false
|
||||||
|
}
|
||||||
@@ -0,0 +1,6 @@
|
|||||||
|
// WITH_RUNTIME
|
||||||
|
// INTENTION_TEXT: "Replace with 'any{}'"
|
||||||
|
// IS_APPLICABLE_2: false
|
||||||
|
fun foo(list: List<Any?>): Boolean {
|
||||||
|
<caret>return list.any { it != null }
|
||||||
|
}
|
||||||
@@ -121,6 +121,12 @@ public class IntentionTest2Generated extends AbstractIntentionTest2 {
|
|||||||
KotlinTestUtils.assertAllTestsPresentByMetadata(this.getClass(), new File("idea/testData/intentions/loopToCallChain/any"), Pattern.compile("^([\\w\\-_]+)\\.kt$"), true);
|
KotlinTestUtils.assertAllTestsPresentByMetadata(this.getClass(), new File("idea/testData/intentions/loopToCallChain/any"), Pattern.compile("^([\\w\\-_]+)\\.kt$"), true);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@TestMetadata("anyNotNull.kt")
|
||||||
|
public void testAnyNotNull() throws Exception {
|
||||||
|
String fileName = KotlinTestUtils.navigationMetadata("idea/testData/intentions/loopToCallChain/any/anyNotNull.kt");
|
||||||
|
doTest(fileName);
|
||||||
|
}
|
||||||
|
|
||||||
@TestMetadata("ifAssign.kt")
|
@TestMetadata("ifAssign.kt")
|
||||||
public void testIfAssign() throws Exception {
|
public void testIfAssign() throws Exception {
|
||||||
String fileName = KotlinTestUtils.navigationMetadata("idea/testData/intentions/loopToCallChain/any/ifAssign.kt");
|
String fileName = KotlinTestUtils.navigationMetadata("idea/testData/intentions/loopToCallChain/any/ifAssign.kt");
|
||||||
|
|||||||
@@ -8029,6 +8029,12 @@ public class IntentionTestGenerated extends AbstractIntentionTest {
|
|||||||
KotlinTestUtils.assertAllTestsPresentByMetadata(this.getClass(), new File("idea/testData/intentions/loopToCallChain/any"), Pattern.compile("^([\\w\\-_]+)\\.kt$"), true);
|
KotlinTestUtils.assertAllTestsPresentByMetadata(this.getClass(), new File("idea/testData/intentions/loopToCallChain/any"), Pattern.compile("^([\\w\\-_]+)\\.kt$"), true);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@TestMetadata("anyNotNull.kt")
|
||||||
|
public void testAnyNotNull() throws Exception {
|
||||||
|
String fileName = KotlinTestUtils.navigationMetadata("idea/testData/intentions/loopToCallChain/any/anyNotNull.kt");
|
||||||
|
doTest(fileName);
|
||||||
|
}
|
||||||
|
|
||||||
@TestMetadata("ifAssign.kt")
|
@TestMetadata("ifAssign.kt")
|
||||||
public void testIfAssign() throws Exception {
|
public void testIfAssign() throws Exception {
|
||||||
String fileName = KotlinTestUtils.navigationMetadata("idea/testData/intentions/loopToCallChain/any/ifAssign.kt");
|
String fileName = KotlinTestUtils.navigationMetadata("idea/testData/intentions/loopToCallChain/any/ifAssign.kt");
|
||||||
|
|||||||
Reference in New Issue
Block a user