diff --git a/idea/src/org/jetbrains/kotlin/idea/intentions/SimplifyBooleanWithConstantsIntention.kt b/idea/src/org/jetbrains/kotlin/idea/intentions/SimplifyBooleanWithConstantsIntention.kt index a31eb8d093f..223f26eea16 100644 --- a/idea/src/org/jetbrains/kotlin/idea/intentions/SimplifyBooleanWithConstantsIntention.kt +++ b/idea/src/org/jetbrains/kotlin/idea/intentions/SimplifyBooleanWithConstantsIntention.kt @@ -18,7 +18,6 @@ package org.jetbrains.kotlin.idea.intentions import com.intellij.openapi.editor.Editor import com.intellij.psi.tree.IElementType -import com.intellij.psi.util.PsiTreeUtil import org.jetbrains.kotlin.builtins.KotlinBuiltIns import org.jetbrains.kotlin.idea.caches.resolve.analyze import org.jetbrains.kotlin.idea.core.copied @@ -28,10 +27,11 @@ import org.jetbrains.kotlin.idea.intentions.loopToCallChain.isTrueConstant import org.jetbrains.kotlin.lexer.KtTokens.* import org.jetbrains.kotlin.psi.* import org.jetbrains.kotlin.psi.psiUtil.getNonStrictParentOfType +import org.jetbrains.kotlin.psi.psiUtil.parentsWithSelf import org.jetbrains.kotlin.resolve.CompileTimeConstantUtils import org.jetbrains.kotlin.resolve.calls.callUtil.getType import org.jetbrains.kotlin.resolve.descriptorUtil.fqNameOrNull -import org.jetbrains.kotlin.resolve.lazy.BodyResolveMode.* +import org.jetbrains.kotlin.resolve.lazy.BodyResolveMode.PARTIAL import org.jetbrains.kotlin.types.isFlexible class SimplifyBooleanWithConstantsInspection : IntentionBasedInspection(SimplifyBooleanWithConstantsIntention::class) @@ -40,8 +40,11 @@ class SimplifyBooleanWithConstantsIntention : SelfTargetingOffsetIndependentIntention(KtBinaryExpression::class.java, "Simplify boolean expression") { override fun isApplicableTo(element: KtBinaryExpression): Boolean { - val topBinary = PsiTreeUtil.getTopmostParentOfType(element, KtBinaryExpression::class.java) ?: element - return areThereExpressionsToBeSimplified(topBinary) + return areThereExpressionsToBeSimplified(element.topBinary()) + } + + private fun KtBinaryExpression.topBinary(): KtBinaryExpression { + return this.parentsWithSelf.takeWhile { it is KtBinaryExpression }.lastOrNull() as? KtBinaryExpression ?: this } private fun areThereExpressionsToBeSimplified(element: KtExpression?): Boolean { @@ -61,7 +64,7 @@ class SimplifyBooleanWithConstantsIntention : } override fun applyTo(element: KtBinaryExpression, editor: Editor?) { - val topBinary = PsiTreeUtil.getTopmostParentOfType(element, KtBinaryExpression::class.java) ?: element + val topBinary = element.topBinary() val simplified = toSimplifiedExpression(topBinary) val result = topBinary.replaced(KtPsiUtil.safeDeparenthesize(simplified, true)) removeRedundantAssertion(result) diff --git a/idea/testData/intentions/simplifyBooleanWithConstants/notReduceableBinary.kt b/idea/testData/intentions/simplifyBooleanWithConstants/notReduceableBinary.kt new file mode 100644 index 00000000000..84cd4a2d862 --- /dev/null +++ b/idea/testData/intentions/simplifyBooleanWithConstants/notReduceableBinary.kt @@ -0,0 +1,4 @@ +fun test() { + foo(false || !true) ?: return +} +fun foo(v: Boolean): Int = 1 \ No newline at end of file diff --git a/idea/testData/intentions/simplifyBooleanWithConstants/notReduceableBinary.kt.after b/idea/testData/intentions/simplifyBooleanWithConstants/notReduceableBinary.kt.after new file mode 100644 index 00000000000..29d5ec87f96 --- /dev/null +++ b/idea/testData/intentions/simplifyBooleanWithConstants/notReduceableBinary.kt.after @@ -0,0 +1,4 @@ +fun test() { + foo(false) ?: return +} +fun foo(v: Boolean): Int = 1 \ No newline at end of file diff --git a/idea/testData/intentions/simplifyBooleanWithConstants/notReduceableBinary2.kt b/idea/testData/intentions/simplifyBooleanWithConstants/notReduceableBinary2.kt new file mode 100644 index 00000000000..87093a87f8b --- /dev/null +++ b/idea/testData/intentions/simplifyBooleanWithConstants/notReduceableBinary2.kt @@ -0,0 +1,4 @@ +fun test() { + foo(false || !true) + foo(false || !true) +} +fun foo(v: Boolean): Int = 1 \ No newline at end of file diff --git a/idea/testData/intentions/simplifyBooleanWithConstants/notReduceableBinary2.kt.after b/idea/testData/intentions/simplifyBooleanWithConstants/notReduceableBinary2.kt.after new file mode 100644 index 00000000000..f06d03e80dd --- /dev/null +++ b/idea/testData/intentions/simplifyBooleanWithConstants/notReduceableBinary2.kt.after @@ -0,0 +1,4 @@ +fun test() { + foo(false || !true) + foo(false) +} +fun foo(v: Boolean): Int = 1 \ 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 b78b6e80de5..174ec0f94d9 100644 --- a/idea/tests/org/jetbrains/kotlin/idea/intentions/IntentionTestGenerated.java +++ b/idea/tests/org/jetbrains/kotlin/idea/intentions/IntentionTestGenerated.java @@ -14848,6 +14848,16 @@ public class IntentionTestGenerated extends AbstractIntentionTest { runTest("idea/testData/intentions/simplifyBooleanWithConstants/notEqualsTrue.kt"); } + @TestMetadata("notReduceableBinary.kt") + public void testNotReduceableBinary() throws Exception { + runTest("idea/testData/intentions/simplifyBooleanWithConstants/notReduceableBinary.kt"); + } + + @TestMetadata("notReduceableBinary2.kt") + public void testNotReduceableBinary2() throws Exception { + runTest("idea/testData/intentions/simplifyBooleanWithConstants/notReduceableBinary2.kt"); + } + @TestMetadata("nullableBoolean.kt") public void testNullableBoolean() throws Exception { runTest("idea/testData/intentions/simplifyBooleanWithConstants/nullableBoolean.kt");