[java-dfa] IDEA-364300 Better contracts for Objects.equals and Arrays.equals

GitOrigin-RevId: 78742f689c964ca8784709ad6f63ee5071995a56
This commit is contained in:
Tagir Valeev
2024-12-05 15:06:42 +00:00
committed by intellij-monorepo-bot
parent b466c60859
commit b488983f95
6 changed files with 159 additions and 4 deletions
@@ -0,0 +1,40 @@
import java.util.Objects;
record Test2(String x, String y) {
static void test2(Test2 test2) {
if (Objects.equals(test2.getSomething2(), test2.y())) {
if(<warning descr="Condition 'Objects.equals(test2.x, test2.getSomething3())' is always 'true'">Objects.equals(test2.x, test2.getSomething3())</warning>) {
}
if (<warning descr="Condition 'Objects.equals(test2.getSomething(), test2.y)' is always 'true'">Objects.equals(test2.getSomething(), test2.y)</warning>) {
}
}
}
static void test(Test2 test2) {
if (test2.getSomething2().equals(test2.y())) {
if(<warning descr="Condition 'test2.x.equals(test2.getSomething3())' is always 'true'">test2.x.equals(test2.getSomething3())</warning>) { //it works
}
if (<warning descr="Condition 'test2.getSomething().equals(test2.y)' is always 'true'">test2.getSomething().equals(test2.y)</warning>) {
}
}
}
public String getSomething() {
return x;
}
public String getSomething3() {
return y;
}
public String getSomething2() {
return x;
}
}
@@ -305,7 +305,7 @@ public class ManyObjectEquals {
Objects.equals(test107, test.test107) &&
Objects.equals(test108, test.test108) &&
Objects.equals(test109, test.test109) &&
Objects.equals(test101, test.test101) &&
<warning descr="Condition 'Objects.equals(test101, test.test101)' is always 'true'">Objects.equals(test101, test.test101)</warning> &&
Objects.equals(test111, test.test111) &&
Objects.equals(test112, test.test112) &&
Objects.equals(test113, test.test113) &&
@@ -305,7 +305,7 @@ public class ManyObjectEquals2 {
Objects.equals(this.test107, test.test107) &&
Objects.equals(this.test108, test.test108) &&
Objects.equals(this.test109, test.test109) &&
Objects.equals(this.test101, test.test101) &&
<warning descr="Condition 'Objects.equals(this.test101, test.test101)' is always 'true'">Objects.equals(this.test101, test.test101)</warning> &&
Objects.equals(this.test111, test.test111) &&
Objects.equals(this.test112, test.test112) &&
Objects.equals(this.test113, test.test113) &&
@@ -0,0 +1,90 @@
import java.util.*;
class A {
void testEqualsString(String s, String s2) {
if (s.equals(s2)) {
if (<warning descr="Condition 'Objects.equals(s, s2)' is always 'true'">Objects.equals(s, s2)</warning>) {}
} else {
if (<warning descr="Condition 'Objects.equals(s, s2)' is always 'false'">Objects.equals(s, s2)</warning>) {}
}
if (Objects.equals(s, s2)) {
if (<warning descr="Condition 's.equals(s2)' is always 'true'">s.equals(s2)</warning>) {}
if (<warning descr="Condition 's.length() == s2.length()' is always 'true'">s.length() == s2.length()</warning>) {}
} else {
if (<warning descr="Condition 's.equals(s2)' is always 'false'">s.equals(s2)</warning>) {}
if (s.length() == s2.length()) {}
}
}
void testEqualsCls(Class<?> s, Class<?> s2) {
if (s.equals(s2)) {
if (<warning descr="Condition 'Objects.equals(s, s2)' is always 'true'">Objects.equals(s, s2)</warning>) {}
} else {
if (<warning descr="Condition 'Objects.equals(s, s2)' is always 'false'">Objects.equals(s, s2)</warning>) {}
}
if (Objects.equals(s, s2)) {
if (<warning descr="Condition 's.equals(s2)' is always 'true'">s.equals(s2)</warning>) {}
} else {
if (<warning descr="Condition 's.equals(s2)' is always 'false'">s.equals(s2)</warning>) {}
}
}
void testEqualsList(List<?> s, List<?> s2) {
if (s.equals(s2)) {
if (Objects.equals(s, s2)) {}
} else {
if (Objects.equals(s, s2)) {}
}
if (Objects.equals(s, s2)) {
if (s.equals(s2)) {}
} else {
if (s.equals(s2)) {}
}
}
void testEqualsArrays(String[] s, String[] s2) {
if (s.equals(s2)) {
if (<warning descr="Condition 'Objects.equals(s, s2)' is always 'true'">Objects.equals(s, s2)</warning>) {}
} else {
if (<warning descr="Condition 'Objects.equals(s, s2)' is always 'false'">Objects.equals(s, s2)</warning>) {}
}
if (Objects.equals(s, s2)) {
if (<warning descr="Condition 's.equals(s2)' is always 'true'">s.equals(s2)</warning>) {}
if (<warning descr="Condition 's.length == s2.length' is always 'true'">s.length == s2.length</warning>) {}
} else {
if (<warning descr="Condition 's.equals(s2)' is always 'false'">s.equals(s2)</warning>) {}
if (s.length == s2.length) {}
}
}
void testEqualsArrays2(String[] s, String[] s2) {
if (s.equals(s2)) {
if (<warning descr="Condition 'Arrays.equals(s, s2)' is always 'true'">Arrays.equals(s, s2)</warning>) {}
} else {
if (Arrays.equals(s, s2)) {}
}
if (Arrays.equals(s, s2)) {
if (s.equals(s2)) {}
if (<warning descr="Condition 's.length == s2.length' is always 'true'">s.length == s2.length</warning>) {}
} else {
if (<warning descr="Condition 's.equals(s2)' is always 'false'">s.equals(s2)</warning>) {}
if (s.length == s2.length) {}
}
}
void testEqualsArrays3(String[] s, String[] s2) {
if (s.equals(s2)) {
if (<warning descr="Condition 'Arrays.deepEquals(s, s2)' is always 'true'">Arrays.deepEquals(s, s2)</warning>) {}
} else {
if (Arrays.deepEquals(s, s2)) {}
}
if (Arrays.deepEquals(s, s2)) {
if (s.equals(s2)) {}
if (<warning descr="Condition 's.length == s2.length' is always 'true'">s.length == s2.length</warning>) {}
} else {
if (<warning descr="Condition 's.equals(s2)' is always 'false'">s.equals(s2)</warning>) {}
if (s.length == s2.length) {}
}
}
}