This is an automated email from the ASF dual-hosted git repository.

neilcsmith pushed a commit to branch delivery
in repository https://gitbox.apache.org/repos/asf/netbeans.git


The following commit(s) were added to refs/heads/delivery by this push:
     new 9e4a2603dd [NETBEANS-5659] Collection.forEach is always a read from 
the collection.
     new 43693c87d7 Merge pull request #6646 from lahodaj/NETBEANS-5659
9e4a2603dd is described below

commit 9e4a2603dd3416b3e68e23ad5b53084a143c4367
Author: Jan Lahoda <[email protected]>
AuthorDate: Tue Oct 31 16:42:33 2023 +0100

    [NETBEANS-5659] Collection.forEach is always a read from the collection.
---
 .../modules/java/hints/bugs/Unbalanced.java        |  9 +++-
 .../modules/java/hints/bugs/UnbalancedTest.java    | 49 ++++++++++++++++++++++
 2 files changed, 56 insertions(+), 2 deletions(-)

diff --git 
a/java/java.hints/src/org/netbeans/modules/java/hints/bugs/Unbalanced.java 
b/java/java.hints/src/org/netbeans/modules/java/hints/bugs/Unbalanced.java
index 01f969084f..126b3a218b 100644
--- a/java/java.hints/src/org/netbeans/modules/java/hints/bugs/Unbalanced.java
+++ b/java/java.hints/src/org/netbeans/modules/java/hints/bugs/Unbalanced.java
@@ -199,8 +199,10 @@ public class Unbalanced {
         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"));
+                "stream", "parallelStream", "spliterator", "reversed", 
"getFirst", "getLast", "removeFirst", "removeLast"));
+        private static final Set<String> STANDALONE_READ_METHODS = new 
HashSet<>(Arrays.asList(
+                "forEach"));
+        private static final Set<String> WRITE_METHODS = new 
HashSet<>(Arrays.asList("add", "addAll", "set", "put", "putAll", "putIfAbsent", 
"addFirst", "addLast"));
 
         private static boolean testType(CompilationInfo info, TypeMirror 
actualType, String superClass) {
             TypeElement juCollection = 
info.getElements().getTypeElement(superClass);
@@ -244,6 +246,9 @@ public class Unbalanced {
                         record(ctx.getInfo(), var, State.READ);
                     }
                     return null;
+                } else if (STANDALONE_READ_METHODS.contains(methodName)) {
+                    record(ctx.getInfo(), var, State.READ);
+                    return null;
                 } else if (WRITE_METHODS.contains(methodName)) {
                     if 
(tp.getParentPath().getParentPath().getParentPath().getLeaf().getKind() != 
Kind.EXPRESSION_STATEMENT) {
                         record(ctx.getInfo(), var, State.WRITE, State.READ);
diff --git 
a/java/java.hints/test/unit/src/org/netbeans/modules/java/hints/bugs/UnbalancedTest.java
 
b/java/java.hints/test/unit/src/org/netbeans/modules/java/hints/bugs/UnbalancedTest.java
index fbd11e3255..8df9338bbf 100644
--- 
a/java/java.hints/test/unit/src/org/netbeans/modules/java/hints/bugs/UnbalancedTest.java
+++ 
b/java/java.hints/test/unit/src/org/netbeans/modules/java/hints/bugs/UnbalancedTest.java
@@ -527,4 +527,53 @@ com.sun.tools.javac.tree.JCTree$JCCompilationUnit@1b5a415
                 .run(Unbalanced.Collection.class)
                 .assertWarnings();
     }
+
+    public void testListForEach() throws Exception {
+        HintTest
+                .create()
+                .input("package test;\n" +
+                       "public class Test {\n" +
+                       "    public void t() {\n" +
+                       "        java.util.List<String> coll = new 
java.util.ArrayList<String>();\n" +
+                       "        coll.add(\"\");\n" +
+                       "        coll.forEach(e -> {});\n" +
+                       "    }\n" +
+                       "}\n")
+                .run(Unbalanced.Collection.class)
+                .assertWarnings();
+    }
+
+    public void testSequencedCollection1() throws Exception {
+        HintTest
+                .create()
+                .input("package test;\n" +
+                       "public class Test {\n" +
+                       "    public void t() {\n" +
+                       "        java.util.List<String> coll = new 
java.util.ArrayList<String>();\n" +
+                       "        coll.addFirst(\"\");\n" +
+                       "        coll.addLast(\"\");\n" +
+                       "    }\n" +
+                       "}\n", false)
+                .run(Unbalanced.Collection.class)
+                
.assertWarnings("3:31-3:35:verifier:ERR_UnbalancedCollectionWRITE coll");
+    }
+
+    public void testSequencedCollection2() throws Exception {
+        HintTest
+                .create()
+                .input("package test;\n" +
+                       "public class Test {\n" +
+                       "    public void t() {\n" +
+                       "        java.util.List<String> coll = new 
java.util.ArrayList<String>();\n" +
+                       "        Object sink;\n" +
+                       "        sink = coll.reversed();\n" +
+                       "        sink = coll.getFirst();\n" +
+                       "        sink = coll.getLast();\n" +
+                       "        sink = coll.removeFirst();\n" +
+                       "        sink = coll.removeLast();\n" +
+                       "    }\n" +
+                       "}\n", false)
+                .run(Unbalanced.Collection.class)
+                
.assertWarnings("3:31-3:35:verifier:ERR_UnbalancedCollectionREAD coll");
+    }
 }


---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

For further information about the NetBeans mailing lists, visit:
https://cwiki.apache.org/confluence/display/NETBEANS/Mailing+lists

Reply via email to