1

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

像这样:

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

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

编辑:

我试过这样的事情:

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

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

4

1 回答 1

1

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

另一种选择是从一个共同的祖先(例如ClassOrInterfaceDeclaration)建立 Xpath,然后使用它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::vsancestor::和我的替代方案的效果。

于 2015-07-21T05:00:06.240 回答