2016-05-03 3 views
1

ASTノードを2つ使用するカスタムPMDルールを書きたいと思います。pmdの1つのルールで2つのASTノードを使用するにはどうすればよいですか?

私のカスタムルールは、数学演算子を見つけるためにソースコードをスキャンします。

私は私のルールは同じ表現でこれらの

+,*,/, 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); 

    } 
} 

それを行うには?

答えて

1

私はJavaの代わりにXPathを選択しました。

<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のバグに探しています、それはまだ完全なソリューションではありません:あなたのPMDルールセットの構成XMLにこのルールを入れ1+2-3+4のような表現ではなく、単一のAdditiveExpression:+ノードを取得しているように見えます3つの異なるノードをそれぞれの演算子と結びつけているので、+や - だけを使う式を検出することはできません。しかし、それは混合加算と乗法演算子で表現を検出します。

私がこれを理解した場合、私は答えを更新しますが、私はそのルールが何らかの使用を望むことを願っています。

+0

Thaaaaaaanks aloooooot Hairyは、混合加算と乗法演算子で表現を検出しています。 私はこの解決策を使用しています:-) –

+0

私はあなたにもっと援助が必要な場合は、私はあなたに尋ねることができますより多くのルールを記述する必要がありますか? –

+0

問題ありません!私はpmdと他の静的解析関連のタグに従っていますので、次にあなたがそれについて質問をしたら、私はそれを見ていきます。 – HairyFotr

1

もう1つの答えを加えて、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を横断し、それがASTMultiplicativeExpressionに到達したとき、それはmultiplicativeExpressionフラグを設定して、トラバースを続けています。そのトラバーサル内でASTAdditiveExpressionに達すると、フラグが設定され、違反が追加されます。そのトラバーサルからASTMultiplicativeExpressionに戻ると、フラグは設定解除されます。 ASTAdditiveExpressionとadditiveExpressionフラグについても同様です。

+0

教師に感謝してくれます。これは私をとても助けてくれます:-) –

+1

私はそれをテストしました。それはとてもうまく動作します:-) –

関連する問題