我想创建一个PMD规则以禁止使用带标签的语句
可悲的是,我找不到这样的声明的常见XPath。
我需要一个找到
的XPath查询//标签本身的LabeledStatement
并为 ContinueStatement和BreakStatement我需要一个可能性来检查是否在那里定义了标签。 在“PMD规则”构建器(XPath构建器)中,标签定义为:
BreakStatement:loop(循环是定义的标签名称,可以是任何东西)
ContinueStatement:loop(循环是定义的标签名称,可以是任何东西)
有人能给我一个提示我应该定义什么的XPath?
答案 0 :(得分:1)
你的轨道非常好。使用规则设计器是一个很好的方法来解决这个问题,特别是自PMD 6.0.0改进GUI以来。
如您所知,//LabeledStatement
将匹配所有标签(您不想要的),//BreakStatement
和//ContinueStatement
将标记所有中断/继续,您只想标记如果他们后跟一个标签。
因此,您只需要检查那些是否设置了标签。使用设计器检查这些AST节点的属性可以很容易地找出它,标签存储的属性是Image
,当没有定义时,它是null。由于XPath字符串化了所有属性,因此空值为空字符串。
因此:
//LabeledStatement | //BreakStatement[@Image != ""] | //ContinueStatement[@Image != ""]
将匹配: