结合两个PMD检查

时间:2015-07-20 18:41:39

标签: xpath extend pmd ancestor

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

像这样:

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

现在,无论如何,我可以一起检查这两个。例如,我想要它在类中没有ABC扩展BCD。看来我不能简单地使用和连接这两个Xpath查询的东西。另外,我注意到我可以使用|与他们建立联系,但是|作为或工作。我需要一个和这里而不是或。

修改

我试过这样的事情:

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

这似乎至少对我有用。但是我仍然不能100%确定这是否是正确的方法,因为我刚尝试过这个。

1 个答案:

答案 0 :(得分: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布局)

I've put some examples显示了//ancestor::ancestor::和我的替代方案的影响。