On Wed, 1 Jun 2022 at 14:04, Gary Gregory <garydgreg...@gmail.com> wrote:

> Hi,
>
> If you run 'mvn pmd:check' on Commons Text, you'll get:
>

Note: You can suppress the 'Avoid empty catch blocks' by using 'ignored' as
the exception name. That is an easy fix.


> <file
> name="/Users/garydgregory/git/commons-text/src/main/java/org/apache/commons/text/TextStringBuilder.java">
> <violation beginline="2057" endline="2057" begincolumn="13"
> endcolumn="21" rule="AvoidBranchingStatementAsLastInLoop"
> ruleset="Error Prone" package="org.apache.commons.text"
> class="TextStringBuilder" method="indexOf"
> externalInfoUrl="
> https://pmd.github.io/pmd-6.46.0/pmd_rules_java_errorprone.html#avoidbranchingstatementaslastinloop
> "
> priority="2">
> Avoid using a branching statement as the last in a loop.
> </violation>
>

The maven-pmd-plugin is using the default configuration. So it is not easy
to just drop in a suppression for this.

You can configure the rule to ignore checking for return statements [1].
I took the default ruleset [2] and changed the following which suppressed
the violation:

<rule
ref="category/java/errorprone.xml/AvoidBranchingStatementAsLastInLoop">
    <properties>
        <property name="checkReturnLoopTypes" value="" />
    </properties>
</rule>

You can also suppress this with some xpath. This works and is a finer tool
than a blunt disabling of the rule:

  <rule
ref="category/java/errorprone.xml/AvoidBranchingStatementAsLastInLoop">
    <properties>
      <property name="violationSuppressXPath"
        value="./ancestor-or-self::MethodDeclaration[@Name='indexOf' or
@Name='lastIndexOf']

 /ancestor::ClassOrInterfaceDeclaration[@SimpleName='TextStringBuilder' or
@SimpleName='StrBuilder']" />
    </properties>
  </rule>

Or you rewrite the code to remove the return as the last statement in the
loop. This works at one violation site be removing the inner loop to a
method:

---

    final char[] thisBuf = buffer;
    final int len = size - strLen + 1;
    for (int i = startIndex; i < len; i++) {
        if (match(str, thisBuf, i, strLen)) {
            return i;
        }
    }
    return StringUtils.INDEX_NOT_FOUND;
}

private static boolean match(String str, char[] buffer, int i, int strLen) {
    for (int j = 0; j < strLen; j++) {
        if (str.charAt(j) != buffer[i + j]) {
            return false;
        }
    }
    return true;
}

---

This adds a method call inside the loop and may be less efficient. I prefer
to add suppressions to the PMD ruleset. But since text is using the default
ruleset then you have some extra work to do in configuring the POM.

Alex



[1]
https://pmd.github.io/pmd-6.46.0/pmd_rules_java_errorprone.html#avoidbranchingstatementaslastinloop
[2]
https://gitbox.apache.org/repos/asf?p=maven-pmd-plugin.git;a=blob_plain;f=src/main/resources/rulesets/java/maven-pmd-plugin-default.xml;hb=HEAD

Reply via email to