结合两种PMD检查(combine two PMD checks)

2019-10-24 00:51发布

我同时使用PMD来检查我的代码错误,遇到了一个问题。 我不知道如何同时满足两个要求。 例如,如果我想查一个名为ABC方法不存在文件从BCD延伸。 我知道如何检查ABC是否存在或是否从BCD分别使用PMD延伸。

像这样:

//PrimaryExpression/PrimaryPrefix/Name [@Image = "ABC"];
//ExtendsList/ClassOrInterfaceType [@Image != "BCD"];

现在,反正是有,我可以检查这两个在一起。 举例来说,我希望它在课堂上没有ABC扩展BCD。 我似乎不能简单地用之类的东西并连接这两XPath查询。 另外,我发现我可以用| 得到与他们联系,但| 工作原理或。 我需要一个在这里,而不是或。

编辑:

我想是这样的:

//PrimaryExpression/PrimaryPrefix/Name[@Image = "ABC"]
 [//ancestor::ClassOrInterfaceDeclaration/ExtendsList/
                                     ClassOrInterfaceType[@Image != "BCD"]]

这似乎是它至少为我工作。 但我仍然不是100%肯定这是否是因为我只是尝试这样做出来的正确方法。

Answer 1:

您应该编辑工作,但需要注意的是ancestor轴将递归所有的父节点,所以它不应该与“//”推出。

另一种方法是从一个共同的祖先(例如立足的Xpath ClassOrInterfaceDeclaration ),然后使用and确保两个条件都满足。 因为它似乎是你只是测试的节点会两个标准的存在,我想这其实并不重要,什么结果表达/节点集实际上返回:

//ClassOrInterfaceDeclaration[ExtendsList/ClassOrInterfaceType[@Image != "BCD"] 
                  and descendant::PrimaryExpression/PrimaryPrefix/Name[@Image = "ABC"]]

然而,如果你确实需要选择成功时的特定节点,只是追加节点的路径,相对于ClassOrInterfaceDeclaration

//ClassOrInterfaceDeclaration[... predicate ...]/Some/Path/Here

你也可以像应用功能count()来确定符合条件的节点数量:

count(//ClassOrInterfaceDeclaration[... predicate ...])

然后计算表达式。

(警告 - 我不熟悉的PMD布局)

我已经把一些例子显示的效果//ancestor:: VS ancestor::我的选择。



文章来源: combine two PMD checks