Apply De Morgan's laws to non-negated binary expressions

So #KT-18460 Fixed
This commit is contained in:
Dmitry Neverov
2017-06-16 12:28:04 +03:00
committed by Mikhail Glukhikh
parent af53a0ecd5
commit 44ce5f73f7
44 changed files with 193 additions and 128 deletions
@@ -0,0 +1 @@
org.jetbrains.kotlin.idea.intentions.ConvertBinaryExpressionWithDemorgansLawIntention
@@ -0,0 +1,3 @@
fun foo(a: Boolean, c: Int, d: Int) : Boolean {
return !(a <caret>&& c == d)
}
@@ -0,0 +1,3 @@
fun foo(a: Boolean, c: Int, d: Int) : Boolean {
return !a || c != d
}
@@ -0,0 +1,3 @@
fun foo(a: Int, b: Int, c: Int, d: Int) : Boolean {
return !(a < b && c ==<caret> d && a < d)
}
@@ -0,0 +1,3 @@
fun foo(a: Int, b: Int, c: Int, d: Int) : Boolean {
return a >= b || c != d || a >= d
}
@@ -0,0 +1,5 @@
// INTENTION_TEXT: Replace '&&' with '||'
fun foo(a: Boolean, b: Boolean) : Boolean {
return !(<caret>a && b)
}
@@ -0,0 +1,5 @@
// INTENTION_TEXT: Replace '&&' with '||'
fun foo(a: Boolean, b: Boolean) : Boolean {
return !a || !b
}
@@ -0,0 +1,5 @@
// INTENTION_TEXT: Replace '&&' with '||'
fun foo(a: Boolean, b: Boolean, c: Boolean) : Boolean {
return !(a && <caret>(b && c))
}
@@ -0,0 +1,5 @@
// INTENTION_TEXT: Replace '&&' with '||'
fun foo(a: Boolean, b: Boolean, c: Boolean) : Boolean {
return !a || !(b && c)
}
@@ -0,0 +1,5 @@
// INTENTION_TEXT: Replace '||' with '&&'
fun foo(a: Boolean, b: Boolean) : Boolean {
return !(<caret>a || b)
}
@@ -0,0 +1,5 @@
// INTENTION_TEXT: Replace '||' with '&&'
fun foo(a: Boolean, b: Boolean) : Boolean {
return !a && !b
}
@@ -0,0 +1,5 @@
// INTENTION_TEXT: Replace '||' with '&&'
fun foo(a: Boolean, b: Boolean, c: Boolean) : Boolean {
return !(<caret>a || (b && c))
}
@@ -0,0 +1,5 @@
// INTENTION_TEXT: Replace '||' with '&&'
fun foo(a: Boolean, b: Boolean, c: Boolean) : Boolean {
return !a && !(b && c)
}
@@ -0,0 +1,7 @@
object O {
fun foo(): Boolean = true
fun bar(): Boolean = true
}
fun foo(p1: Boolean, p2: Boolean) {
if (!(<caret>O.foo() || O.bar())) return
}
@@ -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
}
@@ -0,0 +1,7 @@
operator fun String.not(): Boolean {
return length == 0
}
fun foo(a: Boolean, b: Boolean) : Boolean {
return !(<caret>!"" || b)
}
@@ -0,0 +1,7 @@
operator fun String.not(): Boolean {
return length == 0
}
fun foo(a: Boolean, b: Boolean) : Boolean {
return !!"" && !b
}
@@ -0,0 +1,5 @@
// IS_APPLICABLE: false
// ERROR: Unresolved reference. None of the following candidates is applicable because of receiver type mismatch: <br>public operator fun String?.plus(other: Any?): String defined in kotlin
fun foo(a: Boolean, b: Boolean) : Boolean {
return !<caret>(!a + b)
}
@@ -0,0 +1,4 @@
// IS_APPLICABLE: false
fun foo(a: Boolean, b: Boolean, c: Boolean, d: Boolean) : Boolean {
return !(<caret>a && b && c || !d)
}
@@ -0,0 +1,3 @@
fun foo(a: Boolean, b: Boolean, c: Boolean) : Boolean {
return !(<caret>a || !b || c)
}
@@ -0,0 +1,3 @@
fun foo(a: Boolean, b: Boolean, c: Boolean) : Boolean {
return !a && b && !c
}
@@ -0,0 +1,3 @@
fun foo(a: Boolean, b: Boolean) : Boolean {
return !(<caret>a && !b)
}
@@ -0,0 +1,3 @@
fun foo(a: Boolean, b: Boolean) : Boolean {
return !a || b
}
@@ -0,0 +1,5 @@
// INTENTION_TEXT: Replace '&&' with '||'
fun foo(a: Boolean, b: Boolean) : Boolean {
return <caret>a && b
}
@@ -0,0 +1,5 @@
// INTENTION_TEXT: Replace '&&' with '||'
fun foo(a: Boolean, b: Boolean) : Boolean {
return !(!a || !b)
}
@@ -0,0 +1,5 @@
// INTENTION_TEXT: Replace '||' with '&&'
fun foo(a: Boolean, b: Boolean) : Boolean {
return <caret>a || b
}
@@ -0,0 +1,5 @@
// INTENTION_TEXT: Replace '||' with '&&'
fun foo(a: Boolean, b: Boolean) : Boolean {
return !(!a && !b)
}
@@ -0,0 +1,5 @@
// INTENTION_TEXT: Replace '||' with '&&'
fun foo(a: Boolean, b: Boolean) : Boolean {
return <caret>!a || !b
}
@@ -0,0 +1,5 @@
// INTENTION_TEXT: Replace '||' with '&&'
fun foo(a: Boolean, b: Boolean) : Boolean {
return !(a && b)
}
@@ -0,0 +1,5 @@
// INTENTION_TEXT: Replace '&&' with '||'
fun foo(a: Boolean, b: Boolean) : Boolean {
return <caret>!a && !b
}
@@ -0,0 +1,5 @@
// INTENTION_TEXT: Replace '&&' with '||'
fun foo(a: Boolean, b: Boolean) : Boolean {
return !(a || b)
}
@@ -0,0 +1,7 @@
operator fun Boolean.unaryPlus(): Boolean {
return false
}
fun foo(a: Boolean, b: Boolean) : Boolean {
return !(<caret>+a || b)
}
@@ -0,0 +1,7 @@
operator fun Boolean.unaryPlus(): Boolean {
return false
}
fun foo(a: Boolean, b: Boolean) : Boolean {
return !+a && !b
}
@@ -0,0 +1,3 @@
fun foo(a: Boolean, b: Boolean, c: Boolean) : Boolean {
return a && !(<caret>b && c)
}
@@ -0,0 +1,3 @@
fun foo(a: Boolean, b: Boolean, c: Boolean) : Boolean {
return a && (!b || !c)
}