Merge branch 'master' into pr-1762
This commit is contained in:
@ -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() {
|
||||
|
@ -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;
|
||||
|
@ -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();
|
||||
|
||||
|
||||
|
@ -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
|
||||
|
@ -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>
|
||||
|
@ -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>
|
||||
|
Reference in New Issue
Block a user