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 != ""]
将匹配:
- 所有标签
- 所有带标签的中断
- 所有内容都带有标签
我想创建一个 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 != ""]
将匹配:
- 所有标签
- 所有带标签的中断
- 所有内容都带有标签