合并两个 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::
和我的替代方案的效果。
我在使用 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::
和我的替代方案的效果。