From 35ed689b9f36a04af1658bdd9528712b1d593da1 Mon Sep 17 00:00:00 2001 From: Valentin Kipyatkov Date: Fri, 14 Oct 2016 16:58:40 +0300 Subject: [PATCH] any() and other find operations to work with checks for not null and is instance --- .../loopToCallChain/result/FindTransformationMatcher.kt | 8 ++++---- .../loopToCallChain/sequence/FilterTransformation.kt | 3 +++ .../intentions/loopToCallChain/any/anyNotNull.kt | 9 +++++++++ .../intentions/loopToCallChain/any/anyNotNull.kt.after | 6 ++++++ .../kotlin/idea/intentions/IntentionTest2Generated.java | 6 ++++++ .../kotlin/idea/intentions/IntentionTestGenerated.java | 6 ++++++ 6 files changed, 34 insertions(+), 4 deletions(-) create mode 100644 idea/testData/intentions/loopToCallChain/any/anyNotNull.kt create mode 100644 idea/testData/intentions/loopToCallChain/any/anyNotNull.kt.after diff --git a/idea/src/org/jetbrains/kotlin/idea/intentions/loopToCallChain/result/FindTransformationMatcher.kt b/idea/src/org/jetbrains/kotlin/idea/intentions/loopToCallChain/result/FindTransformationMatcher.kt index 631cef084ab..fae975b1208 100644 --- a/idea/src/org/jetbrains/kotlin/idea/intentions/loopToCallChain/result/FindTransformationMatcher.kt +++ b/idea/src/org/jetbrains/kotlin/idea/intentions/loopToCallChain/result/FindTransformationMatcher.kt @@ -20,7 +20,7 @@ import org.jetbrains.kotlin.descriptors.VariableDescriptor import org.jetbrains.kotlin.idea.caches.resolve.resolveToDescriptor import org.jetbrains.kotlin.idea.intentions.branchedTransformations.isNullExpression 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.lexer.KtTokens import org.jetbrains.kotlin.psi.* @@ -61,7 +61,7 @@ object FindTransformationMatcher : TransformationMatcher { 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 } when (state.statements.size) { @@ -98,7 +98,7 @@ object FindTransformationMatcher : TransformationMatcher { 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 returnAfterLoop = state.outerLoop.nextStatement() as? KtReturnExpression ?: return null if (returnInLoop.getLabelName() != returnAfterLoop.getLabelName()) return null @@ -216,7 +216,7 @@ object FindTransformationMatcher : TransformationMatcher { loop: KtForExpression, inputVariable: KtCallableDeclaration, indexVariable: KtCallableDeclaration?, - filterTransformation: FilterTransformation?, + filterTransformation: FilterTransformationBase?, valueIfFound: KtExpression, valueIfNotFound: KtExpression, findFirst: Boolean diff --git a/idea/src/org/jetbrains/kotlin/idea/intentions/loopToCallChain/sequence/FilterTransformation.kt b/idea/src/org/jetbrains/kotlin/idea/intentions/loopToCallChain/sequence/FilterTransformation.kt index dab393968ba..070fdee09d1 100644 --- a/idea/src/org/jetbrains/kotlin/idea/intentions/loopToCallChain/sequence/FilterTransformation.kt +++ b/idea/src/org/jetbrains/kotlin/idea/intentions/loopToCallChain/sequence/FilterTransformation.kt @@ -80,6 +80,9 @@ abstract class FilterTransformationBase : SequenceTransformation { currentState = nextState } + } + + if (transformation is FilterTransformationBase) { FindTransformationMatcher.matchWithFilterBefore(currentState, transformation) ?.let { return it } } diff --git a/idea/testData/intentions/loopToCallChain/any/anyNotNull.kt b/idea/testData/intentions/loopToCallChain/any/anyNotNull.kt new file mode 100644 index 00000000000..9f07c42f895 --- /dev/null +++ b/idea/testData/intentions/loopToCallChain/any/anyNotNull.kt @@ -0,0 +1,9 @@ +// WITH_RUNTIME +// INTENTION_TEXT: "Replace with 'any{}'" +// IS_APPLICABLE_2: false +fun foo(list: List): Boolean { + for (a in list) { + if (a != null) return true + } + return false +} \ No newline at end of file diff --git a/idea/testData/intentions/loopToCallChain/any/anyNotNull.kt.after b/idea/testData/intentions/loopToCallChain/any/anyNotNull.kt.after new file mode 100644 index 00000000000..9151fcdee41 --- /dev/null +++ b/idea/testData/intentions/loopToCallChain/any/anyNotNull.kt.after @@ -0,0 +1,6 @@ +// WITH_RUNTIME +// INTENTION_TEXT: "Replace with 'any{}'" +// IS_APPLICABLE_2: false +fun foo(list: List): Boolean { + return list.any { it != null } +} \ No newline at end of file diff --git a/idea/tests/org/jetbrains/kotlin/idea/intentions/IntentionTest2Generated.java b/idea/tests/org/jetbrains/kotlin/idea/intentions/IntentionTest2Generated.java index 43e64c177bb..71f6cd62989 100644 --- a/idea/tests/org/jetbrains/kotlin/idea/intentions/IntentionTest2Generated.java +++ b/idea/tests/org/jetbrains/kotlin/idea/intentions/IntentionTest2Generated.java @@ -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); } + @TestMetadata("anyNotNull.kt") + public void testAnyNotNull() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("idea/testData/intentions/loopToCallChain/any/anyNotNull.kt"); + doTest(fileName); + } + @TestMetadata("ifAssign.kt") public void testIfAssign() throws Exception { String fileName = KotlinTestUtils.navigationMetadata("idea/testData/intentions/loopToCallChain/any/ifAssign.kt"); diff --git a/idea/tests/org/jetbrains/kotlin/idea/intentions/IntentionTestGenerated.java b/idea/tests/org/jetbrains/kotlin/idea/intentions/IntentionTestGenerated.java index 44f4d95a980..7104f632414 100644 --- a/idea/tests/org/jetbrains/kotlin/idea/intentions/IntentionTestGenerated.java +++ b/idea/tests/org/jetbrains/kotlin/idea/intentions/IntentionTestGenerated.java @@ -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); } + @TestMetadata("anyNotNull.kt") + public void testAnyNotNull() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("idea/testData/intentions/loopToCallChain/any/anyNotNull.kt"); + doTest(fileName); + } + @TestMetadata("ifAssign.kt") public void testIfAssign() throws Exception { String fileName = KotlinTestUtils.navigationMetadata("idea/testData/intentions/loopToCallChain/any/ifAssign.kt");