Merge branch 'master' into pr-1762

This commit is contained in:
Andreas Dangel
2019-05-25 17:14:41 +02:00
64 changed files with 2192 additions and 143 deletions

View File

@ -123,6 +123,7 @@ public abstract class AbstractJavaHandler extends AbstractLanguageVersionHandler
};
}
@Deprecated
@Override
public VisitorStarter getDumpFacade(final Writer writer, final String prefix, final boolean recurse) {
return new VisitorStarter() {

View File

@ -10,6 +10,11 @@ import java.io.Writer;
import java.util.ArrayList;
import java.util.List;
/**
*
* @deprecated This class will be removed with PMD 7. The rule designer is a better way to inspect nodes.
*/
@Deprecated
public class DumpFacade extends JavaParserVisitorAdapter {
private PrintWriter writer;

View File

@ -26,7 +26,7 @@ public class FieldNamingConventionsRule extends AbstractNamingConventionRule<AST
private static final PropertyDescriptor<List<String>> EXCLUDED_NAMES =
PropertyFactory.stringListProperty("exclusions")
.desc("Names of fields to whitelist.")
.defaultValues("serialVersionUID")
.defaultValues("serialVersionUID", "serialPersistentFields")
.build();

View File

@ -56,6 +56,9 @@ public class CommentRequiredRule extends AbstractCommentRule {
private static final PropertyDescriptor<CommentRequirement> SERIAL_VERSION_UID_CMT_REQUIREMENT_DESCRIPTOR
= requirementPropertyBuilder("serialVersionUIDCommentRequired", "Serial version UID comments")
.defaultValue(CommentRequirement.Ignored).build();
private static final PropertyDescriptor<CommentRequirement> SERIAL_PERSISTENT_FIELDS_CMT_REQUIREMENT_DESCRIPTOR
= requirementPropertyBuilder("serialPersistentFieldsCommentRequired", "Serial persistent fields comments")
.defaultValue(CommentRequirement.Ignored).build();
public CommentRequiredRule() {
@ -67,6 +70,7 @@ public class CommentRequiredRule extends AbstractCommentRule {
definePropertyDescriptor(PROT_METHOD_CMT_REQUIREMENT_DESCRIPTOR);
definePropertyDescriptor(ENUM_CMT_REQUIREMENT_DESCRIPTOR);
definePropertyDescriptor(SERIAL_VERSION_UID_CMT_REQUIREMENT_DESCRIPTOR);
definePropertyDescriptor(SERIAL_PERSISTENT_FIELDS_CMT_REQUIREMENT_DESCRIPTOR);
}
@ -154,6 +158,8 @@ public class CommentRequiredRule extends AbstractCommentRule {
public Object visit(ASTFieldDeclaration decl, Object data) {
if (isSerialVersionUID(decl)) {
checkCommentMeetsRequirement(data, decl, SERIAL_VERSION_UID_CMT_REQUIREMENT_DESCRIPTOR);
} else if (isSerialPersistentFields(decl)) {
checkCommentMeetsRequirement(data, decl, SERIAL_PERSISTENT_FIELDS_CMT_REQUIREMENT_DESCRIPTOR);
} else {
checkCommentMeetsRequirement(data, decl, FIELD_CMT_REQUIREMENT_DESCRIPTOR);
}
@ -169,6 +175,24 @@ public class CommentRequiredRule extends AbstractCommentRule {
&& field.getType() == long.class;
}
/**
* Whether the given field is a serialPersistentFields variable.
* <p/>
* This field must be initialized with an array of ObjectStreamField objects.
* The modifiers for the field are required to be private, static, and final.
*
* @see <a href="https://docs.oracle.com/javase/7/docs/platform/serialization/spec/serial-arch.html#6250">Oracle docs</a>
* @param field the field, must not be null
* @return true if the field ia a serialPersistentFields variable, otherwise false
*/
private boolean isSerialPersistentFields(final ASTFieldDeclaration field) {
return "serialPersistentFields".equals(field.getVariableName())
&& field.isPrivate()
&& field.isStatic()
&& field.isFinal()
&& field.isArray()
&& "ObjectStreamField".equals(field.jjtGetFirstToken().getImage()); // .getType() returns null
}
@Override
public Object visit(ASTEnumDeclaration decl, Object data) {
@ -192,7 +216,8 @@ public class CommentRequiredRule extends AbstractCommentRule {
&& getProperty(PUB_METHOD_CMT_REQUIREMENT_DESCRIPTOR) == CommentRequirement.Ignored
&& getProperty(PROT_METHOD_CMT_REQUIREMENT_DESCRIPTOR) == CommentRequirement.Ignored
&& getProperty(ENUM_CMT_REQUIREMENT_DESCRIPTOR) == CommentRequirement.Ignored
&& getProperty(SERIAL_VERSION_UID_CMT_REQUIREMENT_DESCRIPTOR) == CommentRequirement.Ignored;
&& getProperty(SERIAL_VERSION_UID_CMT_REQUIREMENT_DESCRIPTOR) == CommentRequirement.Ignored
&& getProperty(SERIAL_PERSISTENT_FIELDS_CMT_REQUIREMENT_DESCRIPTOR) == CommentRequirement.Ignored;
}
@Override

View File

@ -193,6 +193,20 @@
]]></code>
</test-code>
<test-code>
<description>Exclude serialPersistentFields by default</description>
<expected-problems>0</expected-problems>
<code><![CDATA[
public class Foo implements Serializable {
List next;
private static final ObjectStreamField[] serialPersistentFields = {new ObjectStreamField("next", List.class)};
}
]]></code>
</test-code>
<test-code>
<description>More exclusions can be configured</description>
<rule-property name="exclusions">m$mangled|serialVersionUID</rule-property>

View File

@ -157,6 +157,85 @@ public class CommentRequired implements Serializable {
]]></code>
</test-code>
<test-code>
<description>#1684 whitelist serialPersistentFields</description>
<expected-problems>0</expected-problems>
<code><![CDATA[
/** The class comment */
public class CommentRequired implements Serializable {
/** My list */
List next;
private static final ObjectStreamField[] serialPersistentFields = {new ObjectStreamField("next", List.class)};
}
]]></code>
</test-code>
<test-code>
<description>#1684 comment required on serialPersistentFields of wrong type</description>
<expected-problems>1</expected-problems>
<expected-linenumbers>5</expected-linenumbers>
<code><![CDATA[
/** The class comment */
public class CommentRequired implements Serializable {
/** My list */
List next;
private static final String[] serialPersistentFields = {"next"};
}
]]></code>
</test-code>
<test-code>
<description>#1684 comment required on serialPersistentFields of wrong visibility</description>
<expected-problems>1</expected-problems>
<expected-linenumbers>5</expected-linenumbers>
<code><![CDATA[
/** The class comment */
public class CommentRequired implements Serializable {
/** My list */
List next;
static final ObjectStreamField[] serialPersistentFields = {new ObjectStreamField("next", List.class)};
}
]]></code>
</test-code>
<test-code>
<description>#1684 comment required on serialPersistentFields not static</description>
<expected-problems>1</expected-problems>
<expected-linenumbers>5</expected-linenumbers>
<code><![CDATA[
/** The class comment */
public class CommentRequired implements Serializable {
/** My list */
List next;
private final ObjectStreamField[] serialPersistentFields = {new ObjectStreamField("next", List.class)};
}
]]></code>
</test-code>
<test-code>
<description>#1684 comment required on serialPersistentFields not final</description>
<expected-problems>1</expected-problems>
<expected-linenumbers>5</expected-linenumbers>
<code><![CDATA[
/** The class comment */
public class CommentRequired implements Serializable {
/** My list */
List next;
private static ObjectStreamField[] serialPersistentFields = {new ObjectStreamField("next", List.class)};
}
]]></code>
</test-code>
<test-code>
<description>#1684 serialPersistentFields comment required</description>
<rule-property name="serialPersistentFieldsCommentRequired">Required</rule-property>
<expected-problems>1</expected-problems>
<expected-linenumbers>5</expected-linenumbers>
<code><![CDATA[
/** The class comment */
public class CommentRequired implements Serializable {
/** My list */
List next;
private static final ObjectStreamField[] serialPersistentFields = {new ObjectStreamField("next", List.class)};
}
]]></code>
</test-code>
<test-code>
<description>#1522 [java] CommentRequired: false positive</description>
<expected-problems>0</expected-problems>