name Labeled Statement 或 Break Statement 的 xpath

xpath for named LabeledStatement or BreakStatement

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

遗憾的是,我找不到此类语句的通用 XPath。

我需要一个 XPath 查询来找到

//标签本身的LabeledStatement

并且对于 ContinueStatement 和 BreakStatement 我需要检查是否在那里定义了标签。 在 PMD 规则构建器(XPath 构建器)中,标签定义为:

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

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

有人可以提示我应该定义什么 XPath 吗?

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

如您所料,//LabeledStatement 将匹配所有标签(您不需要),而 //BreakStatement//ContinueStatement 将标记所有中断/继续,您只需要标记后跟标签。

因此,您只需要检查它们是否设置了标签。使用设计器检查这些 AST 节点的属性很容易弄清楚,存储标签的属性是 Image,当定义 none 时为空。由于 XPath 将所有属性字符串化,空值是空字符串。

因此:

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

将匹配:

  1. 所有标签
  2. 所有带标签的中断
  3. 所有内容都带有标签