Как реализовать несколько исключений в отдельных строках с помощью checkstyle или PMD? - PullRequest
0 голосов
/ 21 марта 2019

В нашем проекте мы используем checkstyle и PMD, и я ищу способ принудительного перевода строк между несколькими перехватами в одной строке, например,

} catch(IOException | IllegalArgumentException ex) {
    ...
}

должен пройти проверку, тогда как

} catch(IOException
        | IllegalArgumentException ex) {
    ...
}

должно пройти.

Я не ищу альтернатив, таких как произвольно работающие средства форматирования кода, которые вводят зависимость от IDE.

Мы используем checkstyle и PMD через Maven.

1 Ответ

1 голос
/ 23 марта 2019

Простое правило на основе XPath для PMD может использовать это выражение XPath:

<rule name="MultipleCatchTypesOnSeparateLines"
      language="java"
      message="Use a separate line for each catch type"
      class="net.sourceforge.pmd.lang.rule.XPathRule"
    <description>TODO</description>
    <priority>3</priority>
    <properties>
        <property name="xpath">
            <value>
<![CDATA[
//CatchStatement/FormalParameter[@SingleLine = true()]
]]>
            </value>
        </property>
        <property name="version" value="2.0"/>
    </properties>
</rule>

Более сложный, который бы выявлял случаи, когда у вас есть, например, 3 улова на 2 строки (которые должны быть на трех линиях):

<rule name="MultipleCatchTypesOnSeparateLines"
      language="java"
      message="Use a separate line for each catch type"
      class="net.sourceforge.pmd.lang.rule.XPathRule"
    <description>TODO</description>
    <priority>3</priority>
    <properties>
        <property name="xpath">
            <value>
<![CDATA[
for $a in //CatchStatement/FormalParameter
  return for $b in (1 to count($a/Type))
    return $a[Type[$b][@BeginLine = $a/Type[$b + 1]/@BeginLine]]
]]>
            </value>
        </property>
        <property name="version" value="2.0"/>
    </properties>
</rule>

Обратите внимание: с PMD вы не можете проверить, что символ | находится на следующей строке. Этот токен недоступен в AST.

...