From 1b16ff6c82c2234824a405a458ebd2e3d1d7f4ef Mon Sep 17 00:00:00 2001 From: Valentin Kipyatkov Date: Fri, 17 Jun 2016 18:09:07 +0300 Subject: [PATCH] KT-11975 Invert if-condition intention does not simplify "is" expresssion #KT-11975 Fixed --- .../jetbrains/kotlin/idea/intentions/Utils.kt | 9 ++++++++- .../intentions/invertIfCondition/in.kt | 5 +++++ .../intentions/invertIfCondition/in.kt.after | 4 ++++ .../intentions/invertIfCondition/is.kt | 5 +++++ .../intentions/invertIfCondition/is.kt.after | 4 ++++ .../intentions/invertIfCondition/notIs.kt | 5 +++++ .../invertIfCondition/notIs.kt.after | 4 ++++ .../intentions/IntentionTestGenerated.java | 18 ++++++++++++++++++ 8 files changed, 53 insertions(+), 1 deletion(-) create mode 100644 idea/testData/intentions/invertIfCondition/in.kt create mode 100644 idea/testData/intentions/invertIfCondition/in.kt.after create mode 100644 idea/testData/intentions/invertIfCondition/is.kt create mode 100644 idea/testData/intentions/invertIfCondition/is.kt.after create mode 100644 idea/testData/intentions/invertIfCondition/notIs.kt create mode 100644 idea/testData/intentions/invertIfCondition/notIs.kt.after diff --git a/idea/src/org/jetbrains/kotlin/idea/intentions/Utils.kt b/idea/src/org/jetbrains/kotlin/idea/intentions/Utils.kt index ee386847c5f..dbba0e53b75 100644 --- a/idea/src/org/jetbrains/kotlin/idea/intentions/Utils.kt +++ b/idea/src/org/jetbrains/kotlin/idea/intentions/Utils.kt @@ -23,9 +23,9 @@ import org.jetbrains.kotlin.descriptors.CallableDescriptor import org.jetbrains.kotlin.descriptors.ValueParameterDescriptor import org.jetbrains.kotlin.idea.caches.resolve.analyze import org.jetbrains.kotlin.idea.caches.resolve.analyzeAndGetResult +import org.jetbrains.kotlin.idea.core.ShortenReferences import org.jetbrains.kotlin.idea.references.mainReference import org.jetbrains.kotlin.idea.util.IdeDescriptorRenderers -import org.jetbrains.kotlin.idea.core.ShortenReferences import org.jetbrains.kotlin.lexer.KtTokens import org.jetbrains.kotlin.psi.* import org.jetbrains.kotlin.psi.typeRefHelpers.setReceiverTypeReference @@ -164,6 +164,13 @@ private fun KtExpression.specialNegation(): KtExpression? { return factory.createExpressionByPattern("$0 $1 $2", left, getNegatedOperatorText(operator), right) } + is KtIsExpression -> { + return factory.createExpressionByPattern("$0 $1 $2", + leftHandSide, + if (isNegated) "is" else "!is", + typeReference ?: return null) + } + is KtConstantExpression -> { return when (text) { "true" -> factory.createExpression("false") diff --git a/idea/testData/intentions/invertIfCondition/in.kt b/idea/testData/intentions/invertIfCondition/in.kt new file mode 100644 index 00000000000..cf30f42cd47 --- /dev/null +++ b/idea/testData/intentions/invertIfCondition/in.kt @@ -0,0 +1,5 @@ +fun f(p: Any, set: Set) { + if (p in set) { + //TODO + } +} \ No newline at end of file diff --git a/idea/testData/intentions/invertIfCondition/in.kt.after b/idea/testData/intentions/invertIfCondition/in.kt.after new file mode 100644 index 00000000000..48eed336699 --- /dev/null +++ b/idea/testData/intentions/invertIfCondition/in.kt.after @@ -0,0 +1,4 @@ +fun f(p: Any, set: Set) { + if (p !in set) return + //TODO +} \ No newline at end of file diff --git a/idea/testData/intentions/invertIfCondition/is.kt b/idea/testData/intentions/invertIfCondition/is.kt new file mode 100644 index 00000000000..8c7274da19e --- /dev/null +++ b/idea/testData/intentions/invertIfCondition/is.kt @@ -0,0 +1,5 @@ +fun f(p: Any) { + if (p is String) { + //TODO + } +} \ No newline at end of file diff --git a/idea/testData/intentions/invertIfCondition/is.kt.after b/idea/testData/intentions/invertIfCondition/is.kt.after new file mode 100644 index 00000000000..437253f4c09 --- /dev/null +++ b/idea/testData/intentions/invertIfCondition/is.kt.after @@ -0,0 +1,4 @@ +fun f(p: Any) { + if (p !is String) return + //TODO +} \ No newline at end of file diff --git a/idea/testData/intentions/invertIfCondition/notIs.kt b/idea/testData/intentions/invertIfCondition/notIs.kt new file mode 100644 index 00000000000..c57d5853221 --- /dev/null +++ b/idea/testData/intentions/invertIfCondition/notIs.kt @@ -0,0 +1,5 @@ +fun f(p: Any) { + if (p !is String) { + //TODO + } +} \ No newline at end of file diff --git a/idea/testData/intentions/invertIfCondition/notIs.kt.after b/idea/testData/intentions/invertIfCondition/notIs.kt.after new file mode 100644 index 00000000000..93067b6c3b8 --- /dev/null +++ b/idea/testData/intentions/invertIfCondition/notIs.kt.after @@ -0,0 +1,4 @@ +fun f(p: Any) { + if (p is String) return + //TODO +} \ No newline at end of file diff --git a/idea/tests/org/jetbrains/kotlin/idea/intentions/IntentionTestGenerated.java b/idea/tests/org/jetbrains/kotlin/idea/intentions/IntentionTestGenerated.java index d1a9497d448..bcb760eea47 100644 --- a/idea/tests/org/jetbrains/kotlin/idea/intentions/IntentionTestGenerated.java +++ b/idea/tests/org/jetbrains/kotlin/idea/intentions/IntentionTestGenerated.java @@ -6381,12 +6381,24 @@ public class IntentionTestGenerated extends AbstractIntentionTest { doTest(fileName); } + @TestMetadata("in.kt") + public void testIn() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("idea/testData/intentions/invertIfCondition/in.kt"); + doTest(fileName); + } + @TestMetadata("invertableOperator.kt") public void testInvertableOperator() throws Exception { String fileName = KotlinTestUtils.navigationMetadata("idea/testData/intentions/invertIfCondition/invertableOperator.kt"); doTest(fileName); } + @TestMetadata("is.kt") + public void testIs() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("idea/testData/intentions/invertIfCondition/is.kt"); + doTest(fileName); + } + @TestMetadata("lastStatement1.kt") public void testLastStatement1() throws Exception { String fileName = KotlinTestUtils.navigationMetadata("idea/testData/intentions/invertIfCondition/lastStatement1.kt"); @@ -6453,6 +6465,12 @@ public class IntentionTestGenerated extends AbstractIntentionTest { doTest(fileName); } + @TestMetadata("notIs.kt") + public void testNotIs() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("idea/testData/intentions/invertIfCondition/notIs.kt"); + doTest(fileName); + } + @TestMetadata("returnIfExpression.kt") public void testReturnIfExpression() throws Exception { String fileName = KotlinTestUtils.navigationMetadata("idea/testData/intentions/invertIfCondition/returnIfExpression.kt");