[java] UseArraysAsList - skip primitive arrays

Fixes #3379
This commit is contained in:
Andreas Dangel
2022-05-12 15:54:47 +02:00
parent 28b0d13da9
commit f81752dc57
3 changed files with 43 additions and 10 deletions

View File

@ -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

View File

@ -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<Integer> l = new ArrayList<>(100);
for (int i = 0; i < 100; i++) {
for (int i = 0; i < ints.length; i++) {
l.add(ints[i]);
}
List<Integer> 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
}
}

View File

@ -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<Integer> 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<Integer> 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);
}
}
]]></code>
</test-code>
<test-code>
<description>[java] UseArraysAsList must ignore primitive arrays #3379</description>
<expected-problems>0</expected-problems>
<code><![CDATA[
import java.util.ArrayList;
import java.util.List;
class Test {
public void convert(Object value) {
short[] array = (short[]) value;
List<Short> arrayList = new ArrayList<>(array.length);
for (short v : array) {
arrayList.add(v); // line 9 - false positive
}
List<Short> arrayList2 = new ArrayList<>(array.length);
for (int i = 0; i < array.length; i++) {
arrayList2.add(array[i]); // line 14 - false positive
}
}
}
]]></code>
</test-code>
</test-data>