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)