diff --git a/idea/resources/intentionDescriptions/ConvertNegatedExpressionWithDemorgansLawIntention/after.kt.template b/idea/resources/intentionDescriptions/ConvertBinaryExpressionWithDemorgansLawIntention/after.kt.template similarity index 100% rename from idea/resources/intentionDescriptions/ConvertNegatedExpressionWithDemorgansLawIntention/after.kt.template rename to idea/resources/intentionDescriptions/ConvertBinaryExpressionWithDemorgansLawIntention/after.kt.template diff --git a/idea/resources/intentionDescriptions/ConvertNegatedExpressionWithDemorgansLawIntention/before.kt.template b/idea/resources/intentionDescriptions/ConvertBinaryExpressionWithDemorgansLawIntention/before.kt.template similarity index 100% rename from idea/resources/intentionDescriptions/ConvertNegatedExpressionWithDemorgansLawIntention/before.kt.template rename to idea/resources/intentionDescriptions/ConvertBinaryExpressionWithDemorgansLawIntention/before.kt.template diff --git a/idea/resources/intentionDescriptions/ConvertNegatedExpressionWithDemorgansLawIntention/description.html b/idea/resources/intentionDescriptions/ConvertBinaryExpressionWithDemorgansLawIntention/description.html similarity index 100% rename from idea/resources/intentionDescriptions/ConvertNegatedExpressionWithDemorgansLawIntention/description.html rename to idea/resources/intentionDescriptions/ConvertBinaryExpressionWithDemorgansLawIntention/description.html diff --git a/idea/src/META-INF/plugin.xml b/idea/src/META-INF/plugin.xml index 3e06a6e2619..de07c6e4151 100644 --- a/idea/src/META-INF/plugin.xml +++ b/idea/src/META-INF/plugin.xml @@ -1102,7 +1102,7 @@ - org.jetbrains.kotlin.idea.intentions.ConvertNegatedExpressionWithDemorgansLawIntention + org.jetbrains.kotlin.idea.intentions.ConvertBinaryExpressionWithDemorgansLawIntention Kotlin diff --git a/idea/src/org/jetbrains/kotlin/idea/intentions/ConvertNegatedExpressionWithDemorgansLawIntention.kt b/idea/src/org/jetbrains/kotlin/idea/intentions/ConvertBinaryExpressionWithDemorgansLawIntention.kt similarity index 61% rename from idea/src/org/jetbrains/kotlin/idea/intentions/ConvertNegatedExpressionWithDemorgansLawIntention.kt rename to idea/src/org/jetbrains/kotlin/idea/intentions/ConvertBinaryExpressionWithDemorgansLawIntention.kt index dd01d364010..5e75ba96815 100644 --- a/idea/src/org/jetbrains/kotlin/idea/intentions/ConvertNegatedExpressionWithDemorgansLawIntention.kt +++ b/idea/src/org/jetbrains/kotlin/idea/intentions/ConvertBinaryExpressionWithDemorgansLawIntention.kt @@ -19,46 +19,49 @@ package org.jetbrains.kotlin.idea.intentions import com.intellij.openapi.editor.Editor import org.jetbrains.kotlin.lexer.KtTokens import org.jetbrains.kotlin.psi.* +import org.jetbrains.kotlin.psi.psiUtil.parentsWithSelf import java.util.* -class ConvertNegatedExpressionWithDemorgansLawIntention : SelfTargetingOffsetIndependentIntention(KtPrefixExpression::class.java, "DeMorgan Law") { - override fun isApplicableTo(element: KtPrefixExpression): Boolean { - val prefixOperator = element.operationReference.getReferencedNameElementType() - if (prefixOperator != KtTokens.EXCL) return false +class ConvertBinaryExpressionWithDemorgansLawIntention : SelfTargetingOffsetIndependentIntention(KtBinaryExpression::class.java, "DeMorgan Law") { + override fun isApplicableTo(element: KtBinaryExpression): Boolean { + val expr = element.parentsWithSelf.takeWhile { it is KtBinaryExpression }.last() as KtBinaryExpression - val parenthesizedExpression = element.baseExpression as? KtParenthesizedExpression - val baseExpression = parenthesizedExpression?.expression as? KtBinaryExpression ?: return false - - when (baseExpression.operationToken) { + when (expr.operationToken) { KtTokens.ANDAND -> text = "Replace '&&' with '||'" KtTokens.OROR -> text = "Replace '||' with '&&'" else -> return false } - return splitBooleanSequence(baseExpression) != null + return splitBooleanSequence(expr) != null } - override fun applyTo(element: KtPrefixExpression, editor: Editor?) { + override fun applyTo(element: KtBinaryExpression, editor: Editor?) { applyTo(element) } - fun applyTo(element: KtPrefixExpression) { - val parenthesizedExpression = element.baseExpression as KtParenthesizedExpression - val baseExpression = parenthesizedExpression.expression as KtBinaryExpression + fun applyTo(element: KtBinaryExpression) { + val expr = element.parentsWithSelf.takeWhile { it is KtBinaryExpression }.last() as KtBinaryExpression - val operatorText = when (baseExpression.operationToken) { + val operatorText = when (expr.operationToken) { KtTokens.ANDAND -> KtTokens.OROR.value KtTokens.OROR -> KtTokens.ANDAND.value else -> throw IllegalArgumentException() } - val operands = splitBooleanSequence(baseExpression)!!.asReversed() + val operands = splitBooleanSequence(expr)!!.asReversed() - val newExpression = KtPsiFactory(element).buildExpression { + val newExpression = KtPsiFactory(expr).buildExpression { appendExpressions(operands.map { it.negate() }, separator = operatorText) } - element.replace(newExpression) + val grandParentPrefix = expr.parent.parent as? KtPrefixExpression + val negated = expr.parent is KtParenthesizedExpression && + grandParentPrefix?.operationReference?.getReferencedNameElementType() == KtTokens.EXCL + if (negated) { + grandParentPrefix?.replace(newExpression) + } else { + expr.replace(newExpression.negate()) + } } private fun splitBooleanSequence(expression: KtBinaryExpression): List? { diff --git a/idea/src/org/jetbrains/kotlin/idea/intentions/InvertIfConditionIntention.kt b/idea/src/org/jetbrains/kotlin/idea/intentions/InvertIfConditionIntention.kt index d93fb9563cf..3544747e86d 100644 --- a/idea/src/org/jetbrains/kotlin/idea/intentions/InvertIfConditionIntention.kt +++ b/idea/src/org/jetbrains/kotlin/idea/intentions/InvertIfConditionIntention.kt @@ -25,6 +25,7 @@ import org.jetbrains.kotlin.idea.core.replaced import org.jetbrains.kotlin.idea.core.unblockDocument import org.jetbrains.kotlin.idea.util.CommentSaver import org.jetbrains.kotlin.idea.util.psi.patternMatching.matches +import org.jetbrains.kotlin.lexer.KtTokens import org.jetbrains.kotlin.psi.* import org.jetbrains.kotlin.psi.psiUtil.* import org.jetbrains.kotlin.resolve.lazy.BodyResolveMode @@ -58,9 +59,15 @@ class InvertIfConditionIntention : SelfTargetingIntention(KtIfEx commentSaver.restore(commentRestoreRange) val newIfCondition = newIf.condition - val simplifyIntention = ConvertNegatedExpressionWithDemorgansLawIntention() - if (newIfCondition is KtPrefixExpression && simplifyIntention.isApplicableTo(newIfCondition)) { - simplifyIntention.applyTo(newIfCondition) + val simplifyIntention = ConvertBinaryExpressionWithDemorgansLawIntention() + (newIfCondition as? KtPrefixExpression)?.let { + //use De Morgan's law only for negated condition to not make it more complex + if (it.operationReference.getReferencedNameElementType() == KtTokens.EXCL) { + val binaryExpr = (it.baseExpression as? KtParenthesizedExpression)?.expression as? KtBinaryExpression + if (binaryExpr != null && simplifyIntention.isApplicableTo(binaryExpr)) { + simplifyIntention.applyTo(binaryExpr) + } + } } editor?.apply { diff --git a/idea/testData/intentions/convertBinaryExpressionWithDemorgansLaw/.intention b/idea/testData/intentions/convertBinaryExpressionWithDemorgansLaw/.intention new file mode 100644 index 00000000000..945cba1c2e3 --- /dev/null +++ b/idea/testData/intentions/convertBinaryExpressionWithDemorgansLaw/.intention @@ -0,0 +1 @@ +org.jetbrains.kotlin.idea.intentions.ConvertBinaryExpressionWithDemorgansLawIntention diff --git a/idea/testData/intentions/convertNegatedExpressionWithDemorgansLaw/complexNegation1.kt b/idea/testData/intentions/convertBinaryExpressionWithDemorgansLaw/complexNegation1.kt similarity index 100% rename from idea/testData/intentions/convertNegatedExpressionWithDemorgansLaw/complexNegation1.kt rename to idea/testData/intentions/convertBinaryExpressionWithDemorgansLaw/complexNegation1.kt diff --git a/idea/testData/intentions/convertNegatedExpressionWithDemorgansLaw/complexNegation1.kt.after b/idea/testData/intentions/convertBinaryExpressionWithDemorgansLaw/complexNegation1.kt.after similarity index 100% rename from idea/testData/intentions/convertNegatedExpressionWithDemorgansLaw/complexNegation1.kt.after rename to idea/testData/intentions/convertBinaryExpressionWithDemorgansLaw/complexNegation1.kt.after diff --git a/idea/testData/intentions/convertNegatedExpressionWithDemorgansLaw/complexNegation2.kt b/idea/testData/intentions/convertBinaryExpressionWithDemorgansLaw/complexNegation2.kt similarity index 100% rename from idea/testData/intentions/convertNegatedExpressionWithDemorgansLaw/complexNegation2.kt rename to idea/testData/intentions/convertBinaryExpressionWithDemorgansLaw/complexNegation2.kt diff --git a/idea/testData/intentions/convertNegatedExpressionWithDemorgansLaw/complexNegation2.kt.after b/idea/testData/intentions/convertBinaryExpressionWithDemorgansLaw/complexNegation2.kt.after similarity index 100% rename from idea/testData/intentions/convertNegatedExpressionWithDemorgansLaw/complexNegation2.kt.after rename to idea/testData/intentions/convertBinaryExpressionWithDemorgansLaw/complexNegation2.kt.after diff --git a/idea/testData/intentions/convertNegatedExpressionWithDemorgansLaw/conjunctionNegation1.kt b/idea/testData/intentions/convertBinaryExpressionWithDemorgansLaw/conjunctionNegation1.kt similarity index 100% rename from idea/testData/intentions/convertNegatedExpressionWithDemorgansLaw/conjunctionNegation1.kt rename to idea/testData/intentions/convertBinaryExpressionWithDemorgansLaw/conjunctionNegation1.kt diff --git a/idea/testData/intentions/convertNegatedExpressionWithDemorgansLaw/conjunctionNegation1.kt.after b/idea/testData/intentions/convertBinaryExpressionWithDemorgansLaw/conjunctionNegation1.kt.after similarity index 100% rename from idea/testData/intentions/convertNegatedExpressionWithDemorgansLaw/conjunctionNegation1.kt.after rename to idea/testData/intentions/convertBinaryExpressionWithDemorgansLaw/conjunctionNegation1.kt.after diff --git a/idea/testData/intentions/convertNegatedExpressionWithDemorgansLaw/conjunctionNegation2.kt b/idea/testData/intentions/convertBinaryExpressionWithDemorgansLaw/conjunctionNegation2.kt similarity index 100% rename from idea/testData/intentions/convertNegatedExpressionWithDemorgansLaw/conjunctionNegation2.kt rename to idea/testData/intentions/convertBinaryExpressionWithDemorgansLaw/conjunctionNegation2.kt diff --git a/idea/testData/intentions/convertNegatedExpressionWithDemorgansLaw/conjunctionNegation2.kt.after b/idea/testData/intentions/convertBinaryExpressionWithDemorgansLaw/conjunctionNegation2.kt.after similarity index 100% rename from idea/testData/intentions/convertNegatedExpressionWithDemorgansLaw/conjunctionNegation2.kt.after rename to idea/testData/intentions/convertBinaryExpressionWithDemorgansLaw/conjunctionNegation2.kt.after diff --git a/idea/testData/intentions/convertNegatedExpressionWithDemorgansLaw/disjunctionNegation1.kt b/idea/testData/intentions/convertBinaryExpressionWithDemorgansLaw/disjunctionNegation1.kt similarity index 100% rename from idea/testData/intentions/convertNegatedExpressionWithDemorgansLaw/disjunctionNegation1.kt rename to idea/testData/intentions/convertBinaryExpressionWithDemorgansLaw/disjunctionNegation1.kt diff --git a/idea/testData/intentions/convertNegatedExpressionWithDemorgansLaw/disjunctionNegation1.kt.after b/idea/testData/intentions/convertBinaryExpressionWithDemorgansLaw/disjunctionNegation1.kt.after similarity index 100% rename from idea/testData/intentions/convertNegatedExpressionWithDemorgansLaw/disjunctionNegation1.kt.after rename to idea/testData/intentions/convertBinaryExpressionWithDemorgansLaw/disjunctionNegation1.kt.after diff --git a/idea/testData/intentions/convertNegatedExpressionWithDemorgansLaw/disjunctionNegation2.kt b/idea/testData/intentions/convertBinaryExpressionWithDemorgansLaw/disjunctionNegation2.kt similarity index 100% rename from idea/testData/intentions/convertNegatedExpressionWithDemorgansLaw/disjunctionNegation2.kt rename to idea/testData/intentions/convertBinaryExpressionWithDemorgansLaw/disjunctionNegation2.kt diff --git a/idea/testData/intentions/convertNegatedExpressionWithDemorgansLaw/disjunctionNegation2.kt.after b/idea/testData/intentions/convertBinaryExpressionWithDemorgansLaw/disjunctionNegation2.kt.after similarity index 100% rename from idea/testData/intentions/convertNegatedExpressionWithDemorgansLaw/disjunctionNegation2.kt.after rename to idea/testData/intentions/convertBinaryExpressionWithDemorgansLaw/disjunctionNegation2.kt.after diff --git a/idea/testData/intentions/convertNegatedExpressionWithDemorgansLaw/dontAddRedundantParenthesis.kt b/idea/testData/intentions/convertBinaryExpressionWithDemorgansLaw/dontAddRedundantParenthesis.kt similarity index 70% rename from idea/testData/intentions/convertNegatedExpressionWithDemorgansLaw/dontAddRedundantParenthesis.kt rename to idea/testData/intentions/convertBinaryExpressionWithDemorgansLaw/dontAddRedundantParenthesis.kt index a8f9fafe2c1..089e82526cd 100644 --- a/idea/testData/intentions/convertNegatedExpressionWithDemorgansLaw/dontAddRedundantParenthesis.kt +++ b/idea/testData/intentions/convertBinaryExpressionWithDemorgansLaw/dontAddRedundantParenthesis.kt @@ -3,5 +3,5 @@ object O { fun bar(): Boolean = true } fun foo(p1: Boolean, p2: Boolean) { - if (!(O.foo() || O.bar())) return + 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/convertBinaryExpressionWithDemorgansLaw/dontAddRedundantParenthesis.kt.after similarity index 71% rename from idea/testData/intentions/convertNegatedExpressionWithDemorgansLaw/dontAddRedundantParenthesis.kt.after rename to idea/testData/intentions/convertBinaryExpressionWithDemorgansLaw/dontAddRedundantParenthesis.kt.after index 661a6071dd3..1796be1f54f 100644 --- a/idea/testData/intentions/convertNegatedExpressionWithDemorgansLaw/dontAddRedundantParenthesis.kt.after +++ b/idea/testData/intentions/convertBinaryExpressionWithDemorgansLaw/dontAddRedundantParenthesis.kt.after @@ -3,5 +3,5 @@ object O { fun bar(): Boolean = true } fun foo(p1: Boolean, p2: Boolean) { - if (!O.foo() && !O.bar()) return + if (!O.foo() && !O.bar()) return } \ No newline at end of file diff --git a/idea/testData/intentions/convertNegatedExpressionWithDemorgansLaw/doubleNegation.kt b/idea/testData/intentions/convertBinaryExpressionWithDemorgansLaw/doubleNegation.kt similarity index 78% rename from idea/testData/intentions/convertNegatedExpressionWithDemorgansLaw/doubleNegation.kt rename to idea/testData/intentions/convertBinaryExpressionWithDemorgansLaw/doubleNegation.kt index 82e75fd43ba..967f9db4eab 100644 --- a/idea/testData/intentions/convertNegatedExpressionWithDemorgansLaw/doubleNegation.kt +++ b/idea/testData/intentions/convertBinaryExpressionWithDemorgansLaw/doubleNegation.kt @@ -3,5 +3,5 @@ operator fun String.not(): Boolean { } fun foo(a: Boolean, b: Boolean) : Boolean { - return !(!"" || b) + return !(!"" || b) } diff --git a/idea/testData/intentions/convertNegatedExpressionWithDemorgansLaw/doubleNegation.kt.after b/idea/testData/intentions/convertBinaryExpressionWithDemorgansLaw/doubleNegation.kt.after similarity index 100% rename from idea/testData/intentions/convertNegatedExpressionWithDemorgansLaw/doubleNegation.kt.after rename to idea/testData/intentions/convertBinaryExpressionWithDemorgansLaw/doubleNegation.kt.after diff --git a/idea/testData/intentions/convertNegatedExpressionWithDemorgansLaw/inapplicableOperator.kt b/idea/testData/intentions/convertBinaryExpressionWithDemorgansLaw/inapplicableOperator.kt similarity index 100% rename from idea/testData/intentions/convertNegatedExpressionWithDemorgansLaw/inapplicableOperator.kt rename to idea/testData/intentions/convertBinaryExpressionWithDemorgansLaw/inapplicableOperator.kt diff --git a/idea/testData/intentions/convertNegatedExpressionWithDemorgansLaw/inapplicableTriple.kt b/idea/testData/intentions/convertBinaryExpressionWithDemorgansLaw/inapplicableTriple.kt similarity index 100% rename from idea/testData/intentions/convertNegatedExpressionWithDemorgansLaw/inapplicableTriple.kt rename to idea/testData/intentions/convertBinaryExpressionWithDemorgansLaw/inapplicableTriple.kt diff --git a/idea/testData/intentions/convertNegatedExpressionWithDemorgansLaw/longMixedExpression.kt b/idea/testData/intentions/convertBinaryExpressionWithDemorgansLaw/longMixedExpression.kt similarity index 63% rename from idea/testData/intentions/convertNegatedExpressionWithDemorgansLaw/longMixedExpression.kt rename to idea/testData/intentions/convertBinaryExpressionWithDemorgansLaw/longMixedExpression.kt index 5229619d91b..e14c8e1db81 100644 --- a/idea/testData/intentions/convertNegatedExpressionWithDemorgansLaw/longMixedExpression.kt +++ b/idea/testData/intentions/convertBinaryExpressionWithDemorgansLaw/longMixedExpression.kt @@ -1,3 +1,3 @@ fun foo(a: Boolean, b: Boolean, c: Boolean) : Boolean { - return !(a || !b || c) + return !(a || !b || c) } diff --git a/idea/testData/intentions/convertNegatedExpressionWithDemorgansLaw/longMixedExpression.kt.after b/idea/testData/intentions/convertBinaryExpressionWithDemorgansLaw/longMixedExpression.kt.after similarity index 100% rename from idea/testData/intentions/convertNegatedExpressionWithDemorgansLaw/longMixedExpression.kt.after rename to idea/testData/intentions/convertBinaryExpressionWithDemorgansLaw/longMixedExpression.kt.after diff --git a/idea/testData/intentions/convertNegatedExpressionWithDemorgansLaw/mixedExpression.kt b/idea/testData/intentions/convertBinaryExpressionWithDemorgansLaw/mixedExpression.kt similarity index 60% rename from idea/testData/intentions/convertNegatedExpressionWithDemorgansLaw/mixedExpression.kt rename to idea/testData/intentions/convertBinaryExpressionWithDemorgansLaw/mixedExpression.kt index 07629c17ffd..7dafec2f230 100644 --- a/idea/testData/intentions/convertNegatedExpressionWithDemorgansLaw/mixedExpression.kt +++ b/idea/testData/intentions/convertBinaryExpressionWithDemorgansLaw/mixedExpression.kt @@ -1,3 +1,3 @@ fun foo(a: Boolean, b: Boolean) : Boolean { - return !(a && !b) + return !(a && !b) } \ No newline at end of file diff --git a/idea/testData/intentions/convertNegatedExpressionWithDemorgansLaw/mixedExpression.kt.after b/idea/testData/intentions/convertBinaryExpressionWithDemorgansLaw/mixedExpression.kt.after similarity index 100% rename from idea/testData/intentions/convertNegatedExpressionWithDemorgansLaw/mixedExpression.kt.after rename to idea/testData/intentions/convertBinaryExpressionWithDemorgansLaw/mixedExpression.kt.after diff --git a/idea/testData/intentions/convertNegatedExpressionWithDemorgansLaw/inapplicableNormalExpression.kt b/idea/testData/intentions/convertBinaryExpressionWithDemorgansLaw/noNegationPrefix1.kt similarity index 61% rename from idea/testData/intentions/convertNegatedExpressionWithDemorgansLaw/inapplicableNormalExpression.kt rename to idea/testData/intentions/convertBinaryExpressionWithDemorgansLaw/noNegationPrefix1.kt index fb724f45947..666177cccd1 100644 --- a/idea/testData/intentions/convertNegatedExpressionWithDemorgansLaw/inapplicableNormalExpression.kt +++ b/idea/testData/intentions/convertBinaryExpressionWithDemorgansLaw/noNegationPrefix1.kt @@ -1,4 +1,5 @@ -// IS_APPLICABLE: false +// INTENTION_TEXT: Replace '&&' with '||' + fun foo(a: Boolean, b: Boolean) : Boolean { return a && b } \ No newline at end of file diff --git a/idea/testData/intentions/convertBinaryExpressionWithDemorgansLaw/noNegationPrefix1.kt.after b/idea/testData/intentions/convertBinaryExpressionWithDemorgansLaw/noNegationPrefix1.kt.after new file mode 100644 index 00000000000..c023ce3b1df --- /dev/null +++ b/idea/testData/intentions/convertBinaryExpressionWithDemorgansLaw/noNegationPrefix1.kt.after @@ -0,0 +1,5 @@ +// INTENTION_TEXT: Replace '&&' with '||' + +fun foo(a: Boolean, b: Boolean) : Boolean { + return !(!a || !b) +} \ No newline at end of file diff --git a/idea/testData/intentions/convertBinaryExpressionWithDemorgansLaw/noNegationPrefix2.kt b/idea/testData/intentions/convertBinaryExpressionWithDemorgansLaw/noNegationPrefix2.kt new file mode 100644 index 00000000000..93684b1d68c --- /dev/null +++ b/idea/testData/intentions/convertBinaryExpressionWithDemorgansLaw/noNegationPrefix2.kt @@ -0,0 +1,5 @@ +// INTENTION_TEXT: Replace '||' with '&&' + +fun foo(a: Boolean, b: Boolean) : Boolean { + return a || b +} \ No newline at end of file diff --git a/idea/testData/intentions/convertBinaryExpressionWithDemorgansLaw/noNegationPrefix2.kt.after b/idea/testData/intentions/convertBinaryExpressionWithDemorgansLaw/noNegationPrefix2.kt.after new file mode 100644 index 00000000000..a2338c90aa3 --- /dev/null +++ b/idea/testData/intentions/convertBinaryExpressionWithDemorgansLaw/noNegationPrefix2.kt.after @@ -0,0 +1,5 @@ +// INTENTION_TEXT: Replace '||' with '&&' + +fun foo(a: Boolean, b: Boolean) : Boolean { + return !(!a && !b) +} \ No newline at end of file diff --git a/idea/testData/intentions/convertBinaryExpressionWithDemorgansLaw/noNegationPrefix3.kt b/idea/testData/intentions/convertBinaryExpressionWithDemorgansLaw/noNegationPrefix3.kt new file mode 100644 index 00000000000..b2bfed9068b --- /dev/null +++ b/idea/testData/intentions/convertBinaryExpressionWithDemorgansLaw/noNegationPrefix3.kt @@ -0,0 +1,5 @@ +// INTENTION_TEXT: Replace '||' with '&&' + +fun foo(a: Boolean, b: Boolean) : Boolean { + return !a || !b +} \ No newline at end of file diff --git a/idea/testData/intentions/convertBinaryExpressionWithDemorgansLaw/noNegationPrefix3.kt.after b/idea/testData/intentions/convertBinaryExpressionWithDemorgansLaw/noNegationPrefix3.kt.after new file mode 100644 index 00000000000..16b0cdf8911 --- /dev/null +++ b/idea/testData/intentions/convertBinaryExpressionWithDemorgansLaw/noNegationPrefix3.kt.after @@ -0,0 +1,5 @@ +// INTENTION_TEXT: Replace '||' with '&&' + +fun foo(a: Boolean, b: Boolean) : Boolean { + return !(a && b) +} \ No newline at end of file diff --git a/idea/testData/intentions/convertBinaryExpressionWithDemorgansLaw/noNegationPrefix4.kt b/idea/testData/intentions/convertBinaryExpressionWithDemorgansLaw/noNegationPrefix4.kt new file mode 100644 index 00000000000..657fea4715f --- /dev/null +++ b/idea/testData/intentions/convertBinaryExpressionWithDemorgansLaw/noNegationPrefix4.kt @@ -0,0 +1,5 @@ +// INTENTION_TEXT: Replace '&&' with '||' + +fun foo(a: Boolean, b: Boolean) : Boolean { + return !a && !b +} \ No newline at end of file diff --git a/idea/testData/intentions/convertBinaryExpressionWithDemorgansLaw/noNegationPrefix4.kt.after b/idea/testData/intentions/convertBinaryExpressionWithDemorgansLaw/noNegationPrefix4.kt.after new file mode 100644 index 00000000000..5d075b22625 --- /dev/null +++ b/idea/testData/intentions/convertBinaryExpressionWithDemorgansLaw/noNegationPrefix4.kt.after @@ -0,0 +1,5 @@ +// INTENTION_TEXT: Replace '&&' with '||' + +fun foo(a: Boolean, b: Boolean) : Boolean { + return !(a || b) +} \ No newline at end of file diff --git a/idea/testData/intentions/convertNegatedExpressionWithDemorgansLaw/nonstandardPrefixOperator.kt b/idea/testData/intentions/convertBinaryExpressionWithDemorgansLaw/nonstandardPrefixOperator.kt similarity index 78% rename from idea/testData/intentions/convertNegatedExpressionWithDemorgansLaw/nonstandardPrefixOperator.kt rename to idea/testData/intentions/convertBinaryExpressionWithDemorgansLaw/nonstandardPrefixOperator.kt index a1070c18def..53325dd943c 100644 --- a/idea/testData/intentions/convertNegatedExpressionWithDemorgansLaw/nonstandardPrefixOperator.kt +++ b/idea/testData/intentions/convertBinaryExpressionWithDemorgansLaw/nonstandardPrefixOperator.kt @@ -3,5 +3,5 @@ operator fun Boolean.unaryPlus(): Boolean { } fun foo(a: Boolean, b: Boolean) : Boolean { - return !(+a || b) + return !(+a || b) } \ No newline at end of file diff --git a/idea/testData/intentions/convertNegatedExpressionWithDemorgansLaw/nonstandardPrefixOperator.kt.after b/idea/testData/intentions/convertBinaryExpressionWithDemorgansLaw/nonstandardPrefixOperator.kt.after similarity index 100% rename from idea/testData/intentions/convertNegatedExpressionWithDemorgansLaw/nonstandardPrefixOperator.kt.after rename to idea/testData/intentions/convertBinaryExpressionWithDemorgansLaw/nonstandardPrefixOperator.kt.after diff --git a/idea/testData/intentions/convertNegatedExpressionWithDemorgansLaw/retainedParens.kt b/idea/testData/intentions/convertBinaryExpressionWithDemorgansLaw/retainedParens.kt similarity index 100% rename from idea/testData/intentions/convertNegatedExpressionWithDemorgansLaw/retainedParens.kt rename to idea/testData/intentions/convertBinaryExpressionWithDemorgansLaw/retainedParens.kt diff --git a/idea/testData/intentions/convertNegatedExpressionWithDemorgansLaw/retainedParens.kt.after b/idea/testData/intentions/convertBinaryExpressionWithDemorgansLaw/retainedParens.kt.after similarity index 100% rename from idea/testData/intentions/convertNegatedExpressionWithDemorgansLaw/retainedParens.kt.after rename to idea/testData/intentions/convertBinaryExpressionWithDemorgansLaw/retainedParens.kt.after diff --git a/idea/testData/intentions/convertNegatedExpressionWithDemorgansLaw/.intention b/idea/testData/intentions/convertNegatedExpressionWithDemorgansLaw/.intention deleted file mode 100644 index 0cc94276ca0..00000000000 --- a/idea/testData/intentions/convertNegatedExpressionWithDemorgansLaw/.intention +++ /dev/null @@ -1 +0,0 @@ -org.jetbrains.kotlin.idea.intentions.ConvertNegatedExpressionWithDemorgansLawIntention diff --git a/idea/testData/quickfix/nullables/unsafeInfixCall/unsafeComparisonInLogic.kt b/idea/testData/quickfix/nullables/unsafeInfixCall/unsafeComparisonInLogic.kt index c8762aee2ee..e540af92cc1 100644 --- a/idea/testData/quickfix/nullables/unsafeInfixCall/unsafeComparisonInLogic.kt +++ b/idea/testData/quickfix/nullables/unsafeInfixCall/unsafeComparisonInLogic.kt @@ -1,6 +1,7 @@ // "Replace with safe (?.) call" "false" // ACTION: Add non-null asserted (!!) call // ACTION: Flip '>' +// ACTION: Replace '&&' with '||' // ACTION: Replace overloaded operator with function call // ACTION: Simplify boolean expression // ERROR: Operator call corresponds to a dot-qualified call 'w?.x.compareTo(42)' which is not allowed on a nullable receiver 'w?.x'. diff --git a/idea/tests/org/jetbrains/kotlin/idea/intentions/IntentionTestGenerated.java b/idea/tests/org/jetbrains/kotlin/idea/intentions/IntentionTestGenerated.java index db3ae900a37..18cae92932b 100644 --- a/idea/tests/org/jetbrains/kotlin/idea/intentions/IntentionTestGenerated.java +++ b/idea/tests/org/jetbrains/kotlin/idea/intentions/IntentionTestGenerated.java @@ -4026,6 +4026,123 @@ public class IntentionTestGenerated extends AbstractIntentionTest { } } + @TestMetadata("idea/testData/intentions/convertBinaryExpressionWithDemorgansLaw") + @TestDataPath("$PROJECT_ROOT") + @RunWith(JUnit3RunnerWithInners.class) + public static class ConvertBinaryExpressionWithDemorgansLaw extends AbstractIntentionTest { + public void testAllFilesPresentInConvertBinaryExpressionWithDemorgansLaw() throws Exception { + KotlinTestUtils.assertAllTestsPresentByMetadata(this.getClass(), new File("idea/testData/intentions/convertBinaryExpressionWithDemorgansLaw"), Pattern.compile("^([\\w\\-_]+)\\.kt$"), TargetBackend.ANY, true); + } + + @TestMetadata("complexNegation1.kt") + public void testComplexNegation1() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("idea/testData/intentions/convertBinaryExpressionWithDemorgansLaw/complexNegation1.kt"); + doTest(fileName); + } + + @TestMetadata("complexNegation2.kt") + public void testComplexNegation2() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("idea/testData/intentions/convertBinaryExpressionWithDemorgansLaw/complexNegation2.kt"); + doTest(fileName); + } + + @TestMetadata("conjunctionNegation1.kt") + public void testConjunctionNegation1() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("idea/testData/intentions/convertBinaryExpressionWithDemorgansLaw/conjunctionNegation1.kt"); + doTest(fileName); + } + + @TestMetadata("conjunctionNegation2.kt") + public void testConjunctionNegation2() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("idea/testData/intentions/convertBinaryExpressionWithDemorgansLaw/conjunctionNegation2.kt"); + doTest(fileName); + } + + @TestMetadata("disjunctionNegation1.kt") + public void testDisjunctionNegation1() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("idea/testData/intentions/convertBinaryExpressionWithDemorgansLaw/disjunctionNegation1.kt"); + doTest(fileName); + } + + @TestMetadata("disjunctionNegation2.kt") + public void testDisjunctionNegation2() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("idea/testData/intentions/convertBinaryExpressionWithDemorgansLaw/disjunctionNegation2.kt"); + doTest(fileName); + } + + @TestMetadata("dontAddRedundantParenthesis.kt") + public void testDontAddRedundantParenthesis() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("idea/testData/intentions/convertBinaryExpressionWithDemorgansLaw/dontAddRedundantParenthesis.kt"); + doTest(fileName); + } + + @TestMetadata("doubleNegation.kt") + public void testDoubleNegation() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("idea/testData/intentions/convertBinaryExpressionWithDemorgansLaw/doubleNegation.kt"); + doTest(fileName); + } + + @TestMetadata("inapplicableOperator.kt") + public void testInapplicableOperator() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("idea/testData/intentions/convertBinaryExpressionWithDemorgansLaw/inapplicableOperator.kt"); + doTest(fileName); + } + + @TestMetadata("inapplicableTriple.kt") + public void testInapplicableTriple() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("idea/testData/intentions/convertBinaryExpressionWithDemorgansLaw/inapplicableTriple.kt"); + doTest(fileName); + } + + @TestMetadata("longMixedExpression.kt") + public void testLongMixedExpression() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("idea/testData/intentions/convertBinaryExpressionWithDemorgansLaw/longMixedExpression.kt"); + doTest(fileName); + } + + @TestMetadata("mixedExpression.kt") + public void testMixedExpression() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("idea/testData/intentions/convertBinaryExpressionWithDemorgansLaw/mixedExpression.kt"); + doTest(fileName); + } + + @TestMetadata("noNegationPrefix1.kt") + public void testNoNegationPrefix1() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("idea/testData/intentions/convertBinaryExpressionWithDemorgansLaw/noNegationPrefix1.kt"); + doTest(fileName); + } + + @TestMetadata("noNegationPrefix2.kt") + public void testNoNegationPrefix2() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("idea/testData/intentions/convertBinaryExpressionWithDemorgansLaw/noNegationPrefix2.kt"); + doTest(fileName); + } + + @TestMetadata("noNegationPrefix3.kt") + public void testNoNegationPrefix3() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("idea/testData/intentions/convertBinaryExpressionWithDemorgansLaw/noNegationPrefix3.kt"); + doTest(fileName); + } + + @TestMetadata("noNegationPrefix4.kt") + public void testNoNegationPrefix4() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("idea/testData/intentions/convertBinaryExpressionWithDemorgansLaw/noNegationPrefix4.kt"); + doTest(fileName); + } + + @TestMetadata("nonstandardPrefixOperator.kt") + public void testNonstandardPrefixOperator() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("idea/testData/intentions/convertBinaryExpressionWithDemorgansLaw/nonstandardPrefixOperator.kt"); + doTest(fileName); + } + + @TestMetadata("retainedParens.kt") + public void testRetainedParens() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("idea/testData/intentions/convertBinaryExpressionWithDemorgansLaw/retainedParens.kt"); + doTest(fileName); + } + } + @TestMetadata("idea/testData/intentions/convertCamelCaseTestFunctionToSpaced") @TestDataPath("$PROJECT_ROOT") @RunWith(JUnit3RunnerWithInners.class) @@ -5001,105 +5118,6 @@ public class IntentionTestGenerated extends AbstractIntentionTest { } } - @TestMetadata("idea/testData/intentions/convertNegatedExpressionWithDemorgansLaw") - @TestDataPath("$PROJECT_ROOT") - @RunWith(JUnit3RunnerWithInners.class) - public static class ConvertNegatedExpressionWithDemorgansLaw extends AbstractIntentionTest { - public void testAllFilesPresentInConvertNegatedExpressionWithDemorgansLaw() throws Exception { - KotlinTestUtils.assertAllTestsPresentByMetadata(this.getClass(), new File("idea/testData/intentions/convertNegatedExpressionWithDemorgansLaw"), Pattern.compile("^([\\w\\-_]+)\\.kt$"), TargetBackend.ANY, true); - } - - @TestMetadata("complexNegation1.kt") - public void testComplexNegation1() throws Exception { - String fileName = KotlinTestUtils.navigationMetadata("idea/testData/intentions/convertNegatedExpressionWithDemorgansLaw/complexNegation1.kt"); - doTest(fileName); - } - - @TestMetadata("complexNegation2.kt") - public void testComplexNegation2() throws Exception { - String fileName = KotlinTestUtils.navigationMetadata("idea/testData/intentions/convertNegatedExpressionWithDemorgansLaw/complexNegation2.kt"); - doTest(fileName); - } - - @TestMetadata("conjunctionNegation1.kt") - public void testConjunctionNegation1() throws Exception { - String fileName = KotlinTestUtils.navigationMetadata("idea/testData/intentions/convertNegatedExpressionWithDemorgansLaw/conjunctionNegation1.kt"); - doTest(fileName); - } - - @TestMetadata("conjunctionNegation2.kt") - public void testConjunctionNegation2() throws Exception { - String fileName = KotlinTestUtils.navigationMetadata("idea/testData/intentions/convertNegatedExpressionWithDemorgansLaw/conjunctionNegation2.kt"); - doTest(fileName); - } - - @TestMetadata("disjunctionNegation1.kt") - public void testDisjunctionNegation1() throws Exception { - String fileName = KotlinTestUtils.navigationMetadata("idea/testData/intentions/convertNegatedExpressionWithDemorgansLaw/disjunctionNegation1.kt"); - doTest(fileName); - } - - @TestMetadata("disjunctionNegation2.kt") - public void testDisjunctionNegation2() throws Exception { - String fileName = KotlinTestUtils.navigationMetadata("idea/testData/intentions/convertNegatedExpressionWithDemorgansLaw/disjunctionNegation2.kt"); - doTest(fileName); - } - - @TestMetadata("dontAddRedundantParenthesis.kt") - public void testDontAddRedundantParenthesis() throws Exception { - String fileName = KotlinTestUtils.navigationMetadata("idea/testData/intentions/convertNegatedExpressionWithDemorgansLaw/dontAddRedundantParenthesis.kt"); - doTest(fileName); - } - - @TestMetadata("doubleNegation.kt") - public void testDoubleNegation() throws Exception { - String fileName = KotlinTestUtils.navigationMetadata("idea/testData/intentions/convertNegatedExpressionWithDemorgansLaw/doubleNegation.kt"); - doTest(fileName); - } - - @TestMetadata("inapplicableNormalExpression.kt") - public void testInapplicableNormalExpression() throws Exception { - String fileName = KotlinTestUtils.navigationMetadata("idea/testData/intentions/convertNegatedExpressionWithDemorgansLaw/inapplicableNormalExpression.kt"); - doTest(fileName); - } - - @TestMetadata("inapplicableOperator.kt") - public void testInapplicableOperator() throws Exception { - String fileName = KotlinTestUtils.navigationMetadata("idea/testData/intentions/convertNegatedExpressionWithDemorgansLaw/inapplicableOperator.kt"); - doTest(fileName); - } - - @TestMetadata("inapplicableTriple.kt") - public void testInapplicableTriple() throws Exception { - String fileName = KotlinTestUtils.navigationMetadata("idea/testData/intentions/convertNegatedExpressionWithDemorgansLaw/inapplicableTriple.kt"); - doTest(fileName); - } - - @TestMetadata("longMixedExpression.kt") - public void testLongMixedExpression() throws Exception { - String fileName = KotlinTestUtils.navigationMetadata("idea/testData/intentions/convertNegatedExpressionWithDemorgansLaw/longMixedExpression.kt"); - doTest(fileName); - } - - @TestMetadata("mixedExpression.kt") - public void testMixedExpression() throws Exception { - String fileName = KotlinTestUtils.navigationMetadata("idea/testData/intentions/convertNegatedExpressionWithDemorgansLaw/mixedExpression.kt"); - doTest(fileName); - } - - @TestMetadata("nonstandardPrefixOperator.kt") - public void testNonstandardPrefixOperator() throws Exception { - String fileName = KotlinTestUtils.navigationMetadata("idea/testData/intentions/convertNegatedExpressionWithDemorgansLaw/nonstandardPrefixOperator.kt"); - doTest(fileName); - } - - @TestMetadata("retainedParens.kt") - public void testRetainedParens() throws Exception { - String fileName = KotlinTestUtils.navigationMetadata("idea/testData/intentions/convertNegatedExpressionWithDemorgansLaw/retainedParens.kt"); - doTest(fileName); - } - } - @TestMetadata("idea/testData/intentions/convertObjectLiteralToClass") @TestDataPath("$PROJECT_ROOT") @RunWith(JUnit3RunnerWithInners.class)