Merge pull request #3966 from adangel:usearraysaslist-fixes

[java] UseArraysAsList fixes #3966
This commit is contained in:
Andreas Dangel
2022-05-26 15:11:16 +02:00
3 changed files with 84 additions and 10 deletions

View File

@ -968,7 +968,14 @@ You must use `new ArrayList<>(Arrays.asList(...))` if that is inconvenient for y
<![CDATA[
//Statement/ForStatement
[not(.//IfStatement)]
[count(Statement//StatementExpression)=1]
[@Foreach = true() or ForInit//VariableInitializer//Literal[@IntLiteral= true() and @Image='0']]
(: skip primitive types :)
[@Foreach = true() and Expression[pmd-java:typeIs('java.lang.Object[]')]
or Expression/RelationalExpression/PrimaryExpression/PrimaryPrefix/Name[substring-before(@Image, '.length') =
ancestor::MethodDeclaration[1]//VariableDeclaratorId[pmd-java:typeIs('java.lang.Object[]')]
/@Name]
]
//StatementExpression
[PrimaryExpression
[PrimaryPrefix/Name
@ -1012,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,15 +181,77 @@ 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
}
}
}
]]></code>
</test-code>
<test-code>
<description>[java] UseArraysAsList false positive with non-trivial loops #3965</description>
<expected-problems>0</expected-problems>
<code><![CDATA[
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
public class Test {
public void foo(Integer[] ints) {
List<Integer> l = new ArrayList<>(100);
for (int i = 0; i < 100; i++) {
switch (lookup(ints[i])) {
case 1: l.add(ints[i]); break; // line 10 - false positive
case 2: l.addAll(getInts(i)); break;
}
}
List<Integer> anotherList = new ArrayList<>();
for (int i : ints) {
switch (lookup(i)) {
case 1: anotherList.add(i); break; // line 18 - false positive
case 2: anotherList.addAll(getInts(i)); break;
}
}
}
int lookup(int a) {
return a;
}
List<Integer> getInts(int a) {
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>