Files
openide/java/java-tests/testData/inspection/dataFlow/fixture/MutabilityJdk9.java
Tagir Valeev 973ebe7d60 [java-dfa] Check mutability for inlined Map methods
Fixes IDEA-285183 Enhance dfa: Add check mutabilaty for Map.merge and Map.compute
Also fix the lattice for Mutability
Tests from PR#1877

Co-authored-by: pyltsin-m <pyltsin-m@yandex.ru>

GitOrigin-RevId: 9b29b2ccf3d56092e0ef5ecf1a00243cfeb1e493
2021-12-20 07:01:11 +00:00

83 lines
3.0 KiB
Java

import java.util.*;
public class MutabilityJdk9 {
void testList() {
List<Integer> list = List.of(1,2,3);
if(<warning descr="Condition 'list.size() > 5' is always 'false'">list.size() > 5</warning>) {
System.out.println("impossible");
}
if(Math.random() > 0.5) {
list.<warning descr="Immutable object is modified">clear</warning>();
}
list.<warning descr="Immutable object is modified">sort</warning>(null);
}
void testSet() {
Set<String> set = Set.of("foo", "bar", "baz", "qux");
if(<warning descr="Condition 'set.size() == 4' is always 'true'">set.size() == 4</warning>) {
System.out.println("always");
}
set.<warning descr="Immutable object is modified">add</warning>("oops");
}
void testMap() {
Map<String, Integer> map = Map.of("a", 1, "b", 2, "c", 3, "d", 4, "e", 5);
if(<warning descr="Condition 'map.size() != 5' is always 'false'">map.size() != 5</warning>) {
System.out.println("never");
}
map.<warning descr="Immutable object is modified">put</warning>("foo", 6);
}
void testMapClear() {
Map.of("a", 1).<warning descr="Immutable object is modified">clear</warning>();
}
void testMapOfEntries() {
Map<String, Integer> map = Map.ofEntries(Map.entry("x", 1), Map.entry("y", 2));
if(<warning descr="Condition 'map.size() == 2' is always 'true'">map.size() == 2</warning>) {
System.out.println("you bet!");
}
map.<warning descr="Immutable object is modified">remove</warning>("x");
}
// IDEA-167940
void testImmutable(String a, String b){
List.of(a).<warning descr="Immutable object is modified">add</warning>(b); //java 9 collection literals do not accept modification
Collections.singletonList(a).<warning descr="Immutable object is modified">add</warning>(b); //singleton should not be modified
}
void testVarArg(String[] str) {
List<String> list = List.of(str);
if(str.length > 2) {
list.<warning descr="Immutable object is modified">add</warning>("foo");
}
}
void testMapOfEntriesMerge() {
Map<String, Integer> map = Map.ofEntries(Map.entry("x", 1), Map.entry("y", 2));
map.<warning descr="Immutable object is modified">merge</warning>("a", 1, (x, y)->y);
}
void testMapCompute() {
Map<String, Integer> map = Map.of("a", 1, "b", 2, "c", 3, "d", 4, "e", 5);
map.<warning descr="Immutable object is modified">compute</warning>("a", (x, y)->y);
}
void testMapComputeIfPresent() {
Map<String, Integer> map = Map.of("a", 1, "b", 2, "c", 3, "d", 4, "e", 5);
map.<warning descr="Immutable object is modified">computeIfPresent</warning>("a", (x, y)->y);
}
void testMapComputeIfAbsent() {
Map<String, Integer> map = Map.of("a", 1, "b", 2, "c", 3, "d", 4, "e", 5);
map.<warning descr="Immutable object is modified">computeIfAbsent</warning>("a", x->1);
}
void testMapMerge() {
Map<String, Integer> map = Map.of("a", 1, "b", 2, "c", 3, "d", 4, "e", 5);
map.<warning descr="Immutable object is modified">merge</warning>("a", 1, (x, y)->y);
}
}