From ac6ef6b544ad84fb84c89df0f1ce72b58f68cbab Mon Sep 17 00:00:00 2001 From: Valentin Kipyatkov Date: Tue, 2 Jun 2015 23:04:33 +0300 Subject: [PATCH] KT-7454 Replace "||" with "&&" adds unnecessary parethesis #KT-7454 Fixed --- ...atedExpressionWithDemorgansLawIntention.kt | 23 ++++++++++--------- .../dontAddRedundantParenthesis.kt | 7 ++++++ .../dontAddRedundantParenthesis.kt.after | 7 ++++++ .../intentions/IntentionTestGenerated.java | 6 +++++ 4 files changed, 32 insertions(+), 11 deletions(-) create mode 100644 idea/testData/intentions/convertNegatedExpressionWithDemorgansLaw/dontAddRedundantParenthesis.kt create mode 100644 idea/testData/intentions/convertNegatedExpressionWithDemorgansLaw/dontAddRedundantParenthesis.kt.after diff --git a/idea/src/org/jetbrains/kotlin/idea/intentions/ConvertNegatedExpressionWithDemorgansLawIntention.kt b/idea/src/org/jetbrains/kotlin/idea/intentions/ConvertNegatedExpressionWithDemorgansLawIntention.kt index dd87b97cd5d..1aee63036a3 100644 --- a/idea/src/org/jetbrains/kotlin/idea/intentions/ConvertNegatedExpressionWithDemorgansLawIntention.kt +++ b/idea/src/org/jetbrains/kotlin/idea/intentions/ConvertNegatedExpressionWithDemorgansLawIntention.kt @@ -52,21 +52,22 @@ public class ConvertNegatedExpressionWithDemorgansLawIntention : JetSelfTargetin else -> throw IllegalArgumentException() } - val text = splitBooleanSequence(baseExpression)!! - .map { negatedExpressionText(it) } - .reverse() - .joinToString(operatorText) + val operands = splitBooleanSequence(baseExpression)!!.reverse() + + val newExpression = JetPsiFactory(element).buildExpression { + for ((i, operand) in operands.withIndex()) { + if (i > 0) { + appendFixedText(operatorText) + } + appendExpression(operand.negated()) + } + } - val newExpression = JetPsiFactory(element).createExpression(text) element.replace(newExpression) } - private fun negatedExpressionText(expression: JetExpression): String { - val text = expression.getText() - return when (expression) { - is JetSimpleNameExpression, is JetConstantExpression, is JetPrefixExpression, is JetParenthesizedExpression -> "!$text" - else -> "!($text)" - } + private fun JetExpression.negated(): JetExpression { + return JetPsiFactory(this).createExpressionByPattern("!$0", this) } private fun splitBooleanSequence(expression: JetBinaryExpression): List? { diff --git a/idea/testData/intentions/convertNegatedExpressionWithDemorgansLaw/dontAddRedundantParenthesis.kt b/idea/testData/intentions/convertNegatedExpressionWithDemorgansLaw/dontAddRedundantParenthesis.kt new file mode 100644 index 00000000000..a8f9fafe2c1 --- /dev/null +++ b/idea/testData/intentions/convertNegatedExpressionWithDemorgansLaw/dontAddRedundantParenthesis.kt @@ -0,0 +1,7 @@ +object O { + fun foo(): Boolean = true + fun bar(): Boolean = true +} +fun foo(p1: Boolean, p2: Boolean) { + if (!(O.foo() || O.bar())) return +} \ No newline at end of file diff --git a/idea/testData/intentions/convertNegatedExpressionWithDemorgansLaw/dontAddRedundantParenthesis.kt.after b/idea/testData/intentions/convertNegatedExpressionWithDemorgansLaw/dontAddRedundantParenthesis.kt.after new file mode 100644 index 00000000000..661a6071dd3 --- /dev/null +++ b/idea/testData/intentions/convertNegatedExpressionWithDemorgansLaw/dontAddRedundantParenthesis.kt.after @@ -0,0 +1,7 @@ +object O { + fun foo(): Boolean = true + fun bar(): Boolean = true +} +fun foo(p1: Boolean, p2: Boolean) { + if (!O.foo() && !O.bar()) return +} \ 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 3c99872f24d..afea8e85b34 100644 --- a/idea/tests/org/jetbrains/kotlin/idea/intentions/IntentionTestGenerated.java +++ b/idea/tests/org/jetbrains/kotlin/idea/intentions/IntentionTestGenerated.java @@ -3247,6 +3247,12 @@ public class IntentionTestGenerated extends AbstractIntentionTest { doTest(fileName); } + @TestMetadata("dontAddRedundantParenthesis.kt") + public void testDontAddRedundantParenthesis() throws Exception { + String fileName = JetTestUtils.navigationMetadata("idea/testData/intentions/convertNegatedExpressionWithDemorgansLaw/dontAddRedundantParenthesis.kt"); + doTest(fileName); + } + @TestMetadata("doubleNegation.kt") public void testDoubleNegation() throws Exception { String fileName = JetTestUtils.navigationMetadata("idea/testData/intentions/convertNegatedExpressionWithDemorgansLaw/doubleNegation.kt");