Skip to content

Commit

Permalink
Merge pull rquest #4156 from adangel:issue-4148-ArrayListVector
Browse files Browse the repository at this point in the history
[java] Use type resolution for UseArrayListInsteadOfVector #4156
  • Loading branch information
adangel committed Oct 28, 2022
2 parents fddc47e + 173a41b commit af013d6
Show file tree
Hide file tree
Showing 3 changed files with 60 additions and 8 deletions.
1 change: 1 addition & 0 deletions docs/pages/release_notes.md
Expand Up @@ -39,6 +39,7 @@ The rule is part of the quickstart.xml ruleset.
* [#3681](https://github.com/pmd/pmd/issues/3681): \[java] StringToString doesn't trigger on string literals
* [#3977](https://github.com/pmd/pmd/issues/3977): \[java] StringToString false-positive with local method name confusion
* [#4091](https://github.com/pmd/pmd/issues/4091): \[java] AvoidArrayLoops false negative with do-while loops
* [#4148](https://github.com/pmd/pmd/issues/4148): \[java] UseArrayListInsteadOfVector ignores Vector when other classes are imported

### API Changes

Expand Down
7 changes: 3 additions & 4 deletions pmd-java/src/main/resources/category/java/performance.xml
Expand Up @@ -928,16 +928,15 @@ ArrayList is a much better Collection implementation than Vector if thread-safe
<property name="version" value="2.0"/>
<property name="xpath">
<value>
<![CDATA[
//CompilationUnit[not(ImportDeclaration) or ImportDeclaration[@ImportedName='java.util.Vector']]
//AllocationExpression/ClassOrInterfaceType
[@Image='Vector' or @Image='java.util.Vector']
<![CDATA[
//AllocationExpression/ClassOrInterfaceType[pmd-java:typeIsExactly('java.util.Vector')]
]]>
</value>
</property>
</properties>
<example>
<![CDATA[
import java.util.*;
public class SimpleTest extends TestCase {
public void testX() {
Collection c1 = new Vector();
Expand Down
Expand Up @@ -5,9 +5,11 @@
xsi:schemaLocation="http://pmd.sourceforge.net/rule-tests http://pmd.sourceforge.net/rule-tests_1_0_0.xsd">

<test-code>
<description>TEST0</description>
<description>No problem using List and ArrayList</description>
<expected-problems>0</expected-problems>
<code><![CDATA[
import java.util.ArrayList;
import java.util.List;
public class Bar {
void x() {
List v = new ArrayList();
Expand All @@ -17,9 +19,11 @@ public class Bar {
</test-code>

<test-code>
<description>TEST1</description>
<description>Just using Vector</description>
<expected-problems>1</expected-problems>
<expected-linenumbers>4</expected-linenumbers>
<code><![CDATA[
import java.util.Vector;
public class Bar {
void x() {
Vector v = new Vector();
Expand All @@ -29,9 +33,11 @@ public class Bar {
</test-code>

<test-code>
<description>TEST2</description>
<description>Using Vector as field</description>
<expected-problems>1</expected-problems>
<expected-linenumbers>3</expected-linenumbers>
<code><![CDATA[
import java.util.Vector;
public class Bar {
Vector v = new Vector();
void x() {}
Expand All @@ -40,9 +46,12 @@ public class Bar {
</test-code>

<test-code>
<description>TEST3</description>
<description>Using Vector as List</description>
<expected-problems>1</expected-problems>
<expected-linenumbers>4</expected-linenumbers>
<code><![CDATA[
import java.util.List;
import java.util.Vector;
public class Bar {
List v = new Vector();
void x() {}
Expand All @@ -53,6 +62,7 @@ public class Bar {
<test-code>
<description>#1146 real problem</description>
<expected-problems>1</expected-problems>
<expected-linenumbers>4</expected-linenumbers>
<code><![CDATA[
import java.util.Vector;
public class Foo {
Expand All @@ -75,4 +85,46 @@ public class Foo {
}
]]></code>
</test-code>

<test-code>
<description>[java] UseArrayListInsteadOfVector ignores Vector when other classes are imported #4148 - sample 1</description>
<expected-problems>1</expected-problems>
<expected-linenumbers>6</expected-linenumbers>
<code><![CDATA[
import org.Annotation;
// import java.util.Vector; Note: explicitly not importing... unresolved type
@Annotation
public class C {
void x() {
Vector v = new Vector(); // should report a warning in this line, but no warnings
}
}
]]></code>
</test-code>

<test-code>
<description>[java] UseArrayListInsteadOfVector ignores Vector when other classes are imported #4148 - sample 2</description>
<expected-problems>1</expected-problems>
<expected-linenumbers>5</expected-linenumbers>
<code><![CDATA[
import some.OtherClass;
public class C {
void x() {
java.util.Vector v = new java.util.Vector(); // should report a warning
}
}
]]></code>
</test-code>

<test-code>
<description>Only consider Vector and not subclasses</description>
<expected-problems>0</expected-problems>
<code><![CDATA[
import java.util.Stack;
class StackUser {
Stack s = new Stack();
}
]]></code>
</test-code>
</test-data>

0 comments on commit af013d6

Please sign in to comment.