命名为LabeledStatement或BreakStatement的xpath

时间:2018-01-08 17:38:40

标签: pmd

我想创建一个PMD规则以禁止使用带标签的语句

可悲的是,我找不到这样的声明的常见XPath。

我需要一个找到

的XPath查询

//标签本身的LabeledStatement

并为 ContinueStatement和BreakStatement我需要一个可能性来检查是否在那里定义了标签。 在“PMD规则”构建器(XPath构建器)中,标签定义为:

BreakStatement:loop(循环是定义的标签名称,可以是任何东西)

ContinueStatement:loop(循环是定义的标签名称,可以是任何东西)

有人能给我一个提示我应该定义什么的XPath?

1 个答案:

答案 0 :(得分:1)

你的轨道非常好。使用规则设计器是一个很好的方法来解决这个问题,特别是自PMD 6.0.0改进GUI以来。

如您所知,//LabeledStatement将匹配所有标签(您不想要的),//BreakStatement//ContinueStatement将标记所有中断/继续,您只想标记如果他们后跟一个标签。

因此,您只需要检查那些是否设置了标签。使用设计器检查这些AST节点的属性可以很容易地找出它,标签存储的属性是Image,当没有定义时,它是null。由于XPath字符串化了所有属性,因此空值为空字符串。

PMD Rule Designer

因此:

//LabeledStatement | //BreakStatement[@Image != ""] | //ContinueStatement[@Image != ""]

将匹配:

  1. 所有标签
  2. 所有带标签的商品
  3. 全部继续使用标签