Java 在pmd中如何在一个规则中使用两个AST节点?

Java 在pmd中如何在一个规则中使用两个AST节点?,java,eclipse-plugin,pmd,Java,Eclipse Plugin,Pmd,我想编写一个使用两个AST节点的自定义PMD规则 我的自定义规则扫描源代码以查找数学运算符 我希望我的规则从这些中找到多个运算符 +,*,/, and - 用同样的表情 我尝试过一些解决方案,但都不起作用,例如: public class OperatorPrecednece extends AbstractJavaRule { Public Object visit(ASTMultiplicativeExpression node, Object data) {

我想编写一个使用两个
AST
节点的自定义
PMD
规则

我的自定义规则扫描源代码以查找数学运算符

我希望我的规则从这些中找到多个运算符

+,*,/, and - 
用同样的表情

我尝试过一些解决方案,但都不起作用,例如:

public class OperatorPrecednece extends AbstractJavaRule {

    Public Object visit(ASTMultiplicativeExpression node, Object data) {


        Object tvisi(ASTAdditiveExpression node2, Object data2){
        addViolation(data2, node2);


        }

        return super.visit(node, data);

    }
}

如何做到这一点?

我选择了XPath而不是Java。将此规则放入pmd规则集配置xml中:

<rule name="MultipleOperatorsInExpression" language="java" message="More than one different operator used in expression" class="net.sourceforge.pmd.lang.rule.XPathRule">
  <properties>
    <property name="xpath">
      <value>
        <![CDATA[
//Expression[.//AdditiveExpression and .//MultiplicativeExpression]
        ]]>
      </value>
    </property>
  </properties>
</rule>

但这还不是一个完整的解决方案。。。我正在研究一个可能的pmd错误:看起来像
1+2-3+4
这样的表达式会得到一个
AdditiveExpression:+
节点,而不是使用各自运算符的3个不同节点,因此不会检测到只使用+和-或只使用*和/的表达式。但它将检测具有混合加法和乘法运算符的表达式


如果我弄明白了这一点,我会更新答案,但我希望这条规则有一些用处。

我正在添加另一个答案,以说明如何使用Java接口实现类似的功能。这是未经测试的代码,但总体思路如下:

public class OperatorPrecednece extends AbstractJavaRule {

    private boolean additiveExpression = false;
    private boolean multiplicativeExpression = false;

    public Object visit(ASTMultiplicativeExpression node, Object data) {
        multiplicativeExpression = true;
        if (additiveExpression) {
            addViolation(data, node);
        }
        Object superVisit = super.visit(node, data);
        multiplicativeExpression = false;
        return superVisit;
    }

    public Object visit(ASTAdditiveExpression node, Object data) {
        additiveExpression = true;
        if (multiplicativeExpression) {
            addViolation(data, node);
        }
        Object superVisit = super.visit(node, data);
        additiveExpression = false;
        return superVisit;
    }

}

因此,访问者模式遍历AST,当它到达一个AST乘法表达式时,它设置一个乘法表达式标志,然后继续遍历。如果在该遍历中到达一个AsAdditiveExpression,则将设置该标志,并添加冲突。当您从该遍历返回AST乘法表达式时,该标志是未设置的。对于AsAdditiveExpression和additiveExpression flag也是一样。

Thaaaaanks非常多毛,我需要使用混合加法和乘法运算符检测表达式。我使用这个解决方案,它是有效的:-)我必须写更多的规则,如果我需要你更多的帮助,我可以问你吗?没问题!我关注pmd和其他与静态分析相关的标记,所以下次您提出有关它的问题时,我会看到它。下面是关于如何编写XPath检查的教程: