【问题标题】:combine two PMD checks结合两个 PMD 检查
【发布时间】:2015-10-10 00:24:30
【问题描述】:

我在使用 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% 确定这是否是正确的方法,因为我刚刚尝试过。

【问题讨论】:

    标签: xpath extend pmd ancestor


    【解决方案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:: 和我的替代方案的效果。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-10-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多