Простое правило на основе 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.