[java] MissingSerialVersionUID false-negative with abstract classes

Fixes #1352
This commit is contained in:
Andreas Dangel
2018-09-18 19:13:05 +02:00
parent 3113e4ad0f
commit 536176f359
3 changed files with 23 additions and 5 deletions

View File

@ -2294,6 +2294,8 @@ public void bar(int status) {
externalInfoUrl="${pmd.website.baseurl}/pmd_rules_java_errorprone.html#missingserialversionuid">
<description>
Serializable classes should provide a serialVersionUID field.
The serialVersionUID field is also needed for abstract base classes. Each individual class in the inheritance
chain needs an own serialVersionUID field. See also [Should an abstract class have a serialVersionUID](https://stackoverflow.com/questions/893259/should-an-abstract-class-have-a-serialversionuid).
</description>
<priority>3</priority>
<properties>
@ -2301,7 +2303,6 @@ Serializable classes should provide a serialVersionUID field.
<value>
<![CDATA[
//ClassOrInterfaceDeclaration
[@Abstract = 'false']
[count(ClassOrInterfaceBody/ClassOrInterfaceBodyDeclaration
/FieldDeclaration/VariableDeclarator/VariableDeclaratorId[@Image='serialVersionUID']) = 0]
[(ImplementsList | ExtendsList)/ClassOrInterfaceType[pmd-java:typeIs('java.io.Serializable')]]

View File

@ -67,16 +67,24 @@ public interface Foo implements Bar{
]]></code>
</test-code>
<test-code>
<description><![CDATA[
abstract case
]]></description>
<expected-problems>0</expected-problems>
<description>abstract case, see #1352</description>
<expected-problems>1</expected-problems>
<code><![CDATA[
import java.io.Serializable;
public abstract class Foo implements Serializable {
}
]]></code>
</test-code>
<test-code>
<description>inherited abstract case</description>
<expected-problems>1</expected-problems>
<code><![CDATA[
package net.sourceforge.pmd.lang.java.rule.errorprone;
public abstract class AbstractMissingSerialVersionUIDTest extends MissingSerialVersionUIDBase {
// no serial version UID
}
]]></code>
</test-code>
<test-code>
<description><![CDATA[
@SuppressWarnings("serial")