checkstyle禁止SuppressWarnings批注,除非附近没有评论

时间:2019-02-27 15:35:00

标签: checkstyle suppress-warnings maven-checkstyle-plugin

在我们的项目中,有时我们必须禁止某些警告(例如,“ WeakerAccess”可能会被抑制,因为该项目还用作另一个项目中的lib,或者选中了instanceof的“表达式始终为假”从库中抛出的异常(掩盖了抛出该异常的事实)。

另一方面,仅添加抑制是不好的,因为可能不清楚为什么会存在。因此,我想添加一个checkstyler规则,该规则仅在附近有评论时才允许SuppressWarnings批注。这足以使人们开始添加解释。

但是我找不到办法。有这个方块:

<module name="SuppressWarnings">
  <property name="format"
      value="^unchecked$|^unused$"/>
  <property name="tokens"
    value="
    CLASS_DEF,INTERFACE_DEF,ENUM_DEF,
    ANNOTATION_DEF,ANNOTATION_FIELD_DEF,
    ENUM_CONSTANT_DEF,METHOD_DEF,CTOR_DEF
    "/>
</module>

以及一些有关关闭行的checkstyler的特殊注释的内容,但这只是另一种抑制警告的东西,也需要进行解释...但是有办法说抑制是可以的,如果有的话在附近发表评论(在同一行之前或同一行)?

1 个答案:

答案 0 :(得分:1)

我建议同时使用2个检查。使用SuppressWarningsCheck来标记您要记录的方法,并显示一条错误消息,指出它是违反的,因为未记录。然后在添加文档时使用SuppressWithNearbyCommentFilter禁止违反其他检查。为了使过滤器正常工作,文档必须以特定的文本开头,这样才不会错误地取消没有文档的SuppressWarnings。

示例:

$ cat TestClass.java
public class TestClass {
    //SuppressWarnings: this is my reason for the suppression
    @SuppressWarnings("unchecked")
    void method() {
    }

    //this is just a comment and not a reason
    @SuppressWarnings("unused")
    void method2() {
    }

    @SuppressWarnings("unused")
    void noComment() {
    }
}

$ cat TestConfig.xml
<?xml version="1.0"?>
<!DOCTYPE module PUBLIC
          "-//Puppy Crawl//DTD Check Configuration 1.3//EN"
          "http://www.puppycrawl.com/dtds/configuration_1_3.dtd">

<module name="Checker">
    <property name="charset" value="UTF-8"/>

    <module name="TreeWalker">
    <module name="SuppressWarnings">
        <property name="format" value="^(unchecked|unused)$"/>
        <message key="suppressed.warning.not.allowed"
             value="The warning ''{0}'' cannot be suppressed at this location unless a comment is given for the reason for the suppression." />
        <property name="tokens" value="CLASS_DEF,INTERFACE_DEF,ENUM_DEF,ANNOTATION_DEF,ANNOTATION_FIELD_DEF,ENUM_CONSTANT_DEF,METHOD_DEF,CTOR_DEF"/>
    </module>
    <module name="SuppressWithNearbyCommentFilter">
      <property name="commentFormat"
                value="SuppressWarnings: .{10,}"/>
      <property name="checkFormat" value="SuppressWarnings"/>
      <property name="influenceFormat" value="3"/>
    </module>
    </module>
</module>

$ java -jar checkstyle-8.18-all.jar -c TestConfig.xml TestClass.java
Starting audit...
[ERROR] TestClass.java:8:23: The warning 'unused' cannot be suppressed at this location unless a comment is given for the reason for the suppression. [SuppressWarnings]
[ERROR] TestClass.java:12:23: The warning 'unused' cannot be suppressed at this location unless a comment is given for the reason for the suppression. [SuppressWarnings]
Audit done.
Checkstyle ends with 2 errors.

您会发现有2次违规,但有3次SuppressWarnings。第一个示例显示了如何正确禁止没有文档。第2个仅显示评论,而没有有关抑制的文档,第3个完全不显示评论。

  

<property name="format" value="^(unchecked|unused)$"/>

这指定对于未检查和未使用的禁止只需要文档。如果要获取除2以外的所有类型的文档,建议使用表达式"^((?!unchecked|unused).)*$"