合并两个 PMD 检查

combine two PMD checks

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

像这样:

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

现在,我是否可以将这两个一起检查。例如,我希望 class 中没有 ABC 扩展 BCD。看来我不能简单地使用诸如 and 之类的东西来连接这两个 Xpath 查询。另外,我注意到我可以使用 |与他们建立联系,但是 |作为或工作。我需要一个 and here 而不是 or 。

编辑:

我试过这样的事情:

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

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

您的编辑应该有效,但请注意 ancestor 轴将递归所有父节点,因此不应使用“//”引入它。

另一种选择是基于共同祖先的 Xpath(例如 ClassOrInterfaceDeclaration),然后使用 and 来确保满足这两个条件。由于您似乎只是在测试满足这两个条件的节点的存在,我想结果表达式/节点集实际上是什么并不重要 returns:

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

如果你确实需要 select 一个特定的节点成功,只需附加节点的路径,相对于 ClassOrInterfaceDeclaration:

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

您还可以应用 count() 之类的函数来确定满足条件的节点数:

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

然后计算表达式。

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

I've put some examples 显示 //ancestor::ancestor:: 和我的替代方案的效果。