在 PMD 的使用過程中,可以用 Java 或 XPath 來開發代碼規則。
本文講述如何使用 XPath 來開發。
XPath 語法
XPath 是類似與 CSS 選擇器的語法,主要用來選擇 XML 中符合條件的節點。
PMD 將代碼轉化為 XML 形式的抽象語法樹,所以我們可以通過 XPath 來尋找代碼中違反規則的節點。
實現步驟
- 寫 XPath 表達式
- 將規則注冊到規則集文件中
在 GitHub 中可以參考現有規則的 XPath 實現。
XPath 比 Java 的實現更加方便。
舉例
規則:代碼中不能出現 deprecated 注解。
寫 XPath 表達式
這條規則要尋找的是注解,所以要搜尋所有的注解節點,即 Annotation
//Annotation
注解的值是 deprecated,所以要在上面的表達式中加上條件,檢測注解的值。
在 PMD 的分析過程中,注解的值是用 Image 屬性來保存的。
//Annotation[@Image='deprecated']
在 Apex 語言中,大小寫是不敏感的,所以我們要加入 lower-case() 函數來保證我們可以包括所有的大小寫情況。(也可以用其他方法,只要能保證大小寫不影響檢查就好)
//Annotation[lower-case(@Image)='deprecated']
將規則注冊到規則集文件中
每個規則集都是以 XML 形式出現的。我們將新的規則注冊進去:
<rule name="DeprecatedCodeShouldBeRemoved"
since="6.23.0"
language="apex"
message="Deprecated code should be removed"
class="net.sourceforge.pmd.lang.apex.rule.ApexXPathRule">
<description>
Deprecated code should be removed
</description>
<priority>5</priority>
<properties>
<property name="xpath">
<value>
<![CDATA[
//Annotation[lower-case(@Image)='deprecated']
]]>
</value>
</property>
</properties>
</rule>
</ruleset>
這樣,這條規則就可以使用了。