Skip to content

Commit

Permalink
Merge pull request apache#4421 from mbien/improve-unbalanced-hint
Browse files Browse the repository at this point in the history
Unbalanced hint should work for fields initialized in constructor
  • Loading branch information
neilcsmith-net committed Jul 26, 2022
2 parents b9a1808 + e1d6901 commit 5ba8513
Show file tree
Hide file tree
Showing 2 changed files with 35 additions and 12 deletions.
Expand Up @@ -103,14 +103,6 @@ private static ErrorDescription produceWarning(HintContext ctx, String keyBase)

@Hint(displayName = "#DN_org.netbeans.modules.java.hints.bugs.Unbalanced.Array", description = "#DESC_org.netbeans.modules.java.hints.bugs.Unbalanced.Array", category="bugs", options=Options.QUERY, suppressWarnings="MismatchedReadAndWriteOfArray")
public static final class Array {
private static final Set<Kind> ARRAY_WRITE = EnumSet.of(
Kind.AND_ASSIGNMENT, Kind.ASSIGNMENT, Kind.CONDITIONAL_AND, Kind.CONDITIONAL_OR,
Kind.DIVIDE_ASSIGNMENT, Kind.LEFT_SHIFT_ASSIGNMENT, Kind.MINUS_ASSIGNMENT,
Kind.MULTIPLY_ASSIGNMENT, Kind.OR_ASSIGNMENT, Kind.PLUS_ASSIGNMENT,
Kind.POSTFIX_DECREMENT, Kind.POSTFIX_INCREMENT, Kind.PREFIX_DECREMENT,
Kind.PREFIX_INCREMENT, Kind.REMAINDER_ASSIGNMENT, Kind.RIGHT_SHIFT_ASSIGNMENT,
Kind.UNSIGNED_RIGHT_SHIFT_ASSIGNMENT, Kind.XOR_ASSIGNMENT
);

private static VariableElement testElement(HintContext ctx) {
Element el = ctx.getInfo().getTrees().getElement(ctx.getPath());
Expand Down Expand Up @@ -160,7 +152,7 @@ public static ErrorDescription before(HintContext ctx) {
if (secondAccess != null) {
record(ctx.getInfo(), var, secondAccess);
}
} else {
} else if (!var.getModifiers().contains(Modifier.FINAL)) {
record(ctx.getInfo(), var, State.WRITE, State.READ);
}

Expand Down Expand Up @@ -204,8 +196,11 @@ public static ErrorDescription after(HintContext ctx) {

@Hint(displayName = "#DN_org.netbeans.modules.java.hints.bugs.Unbalanced.Collection", description = "#DESC_org.netbeans.modules.java.hints.bugs.Unbalanced.Collection", category="bugs", options=Options.QUERY, suppressWarnings="MismatchedQueryAndUpdateOfCollection")
public static final class Collection {
private static final Set<String> READ_METHODS = new HashSet<String>(Arrays.asList("get", "contains", "remove", "containsAll", "removeAll", "retain", "retainAll", "containsKey", "containsValue", "iterator", "isEmpty", "size", "toArray", "listIterator", "indexOf", "lastIndexOf"));
private static final Set<String> WRITE_METHODS = new HashSet<String>(Arrays.asList("add", "addAll", "set"));
private static final Set<String> READ_METHODS = new HashSet<>(Arrays.asList(
"get", "getOrDefault", "contains", "remove", "containsAll", "removeAll", "removeIf", "retain", "retainAll", "containsKey",
"containsValue", "iterator", "listIterator", "isEmpty", "size", "toArray", "entrySet", "keySet", "values", "indexOf", "lastIndexOf",
"stream", "parallelStream", "spliterator", "forEach"));
private static final Set<String> WRITE_METHODS = new HashSet<>(Arrays.asList("add", "addAll", "set", "put", "putAll", "putIfAbsent"));

private static boolean testType(CompilationInfo info, TypeMirror actualType, String superClass) {
TypeElement juCollection = info.getElements().getTypeElement(superClass);
Expand Down Expand Up @@ -259,7 +254,9 @@ public static ErrorDescription before(HintContext ctx) {
}
}

record(ctx.getInfo(), var, State.WRITE, State.READ);
if (!var.getModifiers().contains(Modifier.FINAL)) {
record(ctx.getInfo(), var, State.WRITE, State.READ);
}

return null;
}
Expand Down
Expand Up @@ -68,6 +68,19 @@ public void testArrayReadOnly2() throws Exception {
.assertContainsWarnings("2:19-2:22:verifier:ERR_UnbalancedArrayREAD arr");
}

public void testArrayReadOnly3() throws Exception {
HintTest
.create()
.input("package test;\n" +
"public class Test {\n" +
" private final byte[] arr;\n" +
" private Test() { arr = new byte[0]; }\n" +
" private void t() { System.err.println(arr[0]); }\n" +
"}\n")
.run(Unbalanced.Array.class)
.assertContainsWarnings("2:25-2:28:verifier:ERR_UnbalancedArrayREAD arr");
}

public void testArrayNeg1() throws Exception {
HintTest
.create()
Expand Down Expand Up @@ -312,6 +325,19 @@ public void testCollectionReadOnly3() throws Exception {//XXX ?
.assertContainsWarnings("2:35-2:39:verifier:ERR_UnbalancedCollectionREAD coll");
}

public void testCollectionReadOnly4() throws Exception {
HintTest
.create()
.input("package test;\n" +
"public class Test {\n" +
" private final java.util.List<String> coll;\n" +
" private Test () { coll = new java.util.ArrayList<String>(1); }\n" +
" private java.util.stream.Stream t() { return coll.stream(); }\n" +
"}\n")
.run(Unbalanced.Collection.class)
.assertContainsWarnings("2:41-2:45:verifier:ERR_UnbalancedCollectionREAD coll");
}

public void testMapReadOnly1() throws Exception {
HintTest
.create()
Expand Down

0 comments on commit 5ba8513

Please sign in to comment.