diff --git a/docs/pages/release_notes.md b/docs/pages/release_notes.md index d50ee17ddc..a6e1fe7d24 100644 --- a/docs/pages/release_notes.md +++ b/docs/pages/release_notes.md @@ -17,6 +17,7 @@ This is a {{ site.pmd.release_type }} release. ### Fixed Issues * java-performance + * [#3379](https://github.com/pmd/pmd/issues/3379): \[java] UseArraysAsList must ignore primitive arrays * [#3965](https://github.com/pmd/pmd/issues/3965): \[java] UseArraysAsList false positive with non-trivial loops * javascript * [#3948](https://github.com/pmd/pmd/issues/3948): \[js] Invalid operator error for method property in object literal diff --git a/pmd-java/src/main/resources/category/java/performance.xml b/pmd-java/src/main/resources/category/java/performance.xml index 2c0f9cd450..8411f35603 100644 --- a/pmd-java/src/main/resources/category/java/performance.xml +++ b/pmd-java/src/main/resources/category/java/performance.xml @@ -970,6 +970,12 @@ You must use `new ArrayList<>(Arrays.asList(...))` if that is inconvenient for y [not(.//IfStatement)] [count(Statement//StatementExpression)=1] [@Foreach = true() or ForInit//VariableInitializer//Literal[@IntLiteral= true() and @Image='0']] + (: skip primitive types :) + [@Foreach = true() and Expression[not(pmd-java:typeIs('boolean[]') or pmd-java:typeIs('char[]') or pmd-java:typeIs('byte[]') or pmd-java:typeIs('short[]') or pmd-java:typeIs('int[]') or pmd-java:typeIs('long[]') or pmd-java:typeIs('float[]') or pmd-java:typeIs('double[]'))] + or Expression/RelationalExpression/PrimaryExpression/PrimaryPrefix/Name[substring-before(@Image, '.length') = + ancestor::MethodDeclaration[1]//VariableDeclaratorId[not(pmd-java:typeIs('boolean[]') or pmd-java:typeIs('char[]') or pmd-java:typeIs('byte[]') or pmd-java:typeIs('short[]') or pmd-java:typeIs('int[]') or pmd-java:typeIs('long[]') or pmd-java:typeIs('float[]') or pmd-java:typeIs('double[]'))] + /@Name] + ] //StatementExpression [PrimaryExpression [PrimaryPrefix/Name @@ -1013,12 +1019,12 @@ public class Test { public void foo(Integer[] ints) { // could just use Arrays.asList(ints) List l = new ArrayList<>(100); - for (int i = 0; i < 100; i++) { + for (int i = 0; i < ints.length; i++) { l.add(ints[i]); } List anotherList = new ArrayList<>(); - for (int i = 0; i < 100; i++) { + for (int i = 0; i < ints.length; i++) { anotherList.add(ints[i].toString()); // won't trigger the rule } } diff --git a/pmd-java/src/test/resources/net/sourceforge/pmd/lang/java/rule/performance/xml/UseArraysAsList.xml b/pmd-java/src/test/resources/net/sourceforge/pmd/lang/java/rule/performance/xml/UseArraysAsList.xml index 11ba87f95b..a3ad5af636 100644 --- a/pmd-java/src/test/resources/net/sourceforge/pmd/lang/java/rule/performance/xml/UseArraysAsList.xml +++ b/pmd-java/src/test/resources/net/sourceforge/pmd/lang/java/rule/performance/xml/UseArraysAsList.xml @@ -14,9 +14,9 @@ import java.util.List; public class Bar { void foo() { - Integer[] ints = new Integer(10); - List l = new ArrayList(10); - for (int i = 0; i < 100; i++) { + Integer[] ints = new Integer[10]; + List l = new ArrayList(ints.length); + for (int i = 0; i < ints.length; i++) { l.add(ints[i]); } } @@ -114,11 +114,13 @@ public class Test { public void foo(Integer[] ints) { // could just use Arrays.asList(ints) List l = new ArrayList(10); - for (int i = 0; i < 100; i++) { + for (int i = 0; i < ints.length; i++) { l.add(ints[i]); } - for (int i = 0; i < 100; i++) { - l.add(a[i].toString()); // won't trigger the rule + + List l2 = new ArrayList(10); + for (int i = 0; i < ints.length; i++) { + l2.add(ints[i].toString()); // won't trigger the rule } } } @@ -179,11 +181,11 @@ public class Test { public void foo(Integer[] ints) { // could just use Arrays.asList(ints) List l = new ArrayList<>(100); - for (int i = 0; i < 100; i++) { + for (int i = 0; i < ints.length; i++) { l.add(ints[i]); // line 9, here is the violation } List anotherList = new ArrayList<>(); - for (int i = 0; i < 100; i++) { + for (int i = 0; i < ints.length; i++) { anotherList.add(ints[i].toString()); // line 13 - false positive } } @@ -226,6 +228,30 @@ public class Test { return Arrays.asList(a); } } +]]> + + + + [java] UseArraysAsList must ignore primitive arrays #3379 + 0 + arrayList = new ArrayList<>(array.length); + for (short v : array) { + arrayList.add(v); // line 9 - false positive + } + + List arrayList2 = new ArrayList<>(array.length); + for (int i = 0; i < array.length; i++) { + arrayList2.add(array[i]); // line 14 - false positive + } + } +} ]]>